Skip to content

def_group_by_mode

参数名称

def_group_by_mode

参数解释

GROUPBY语句模式。

  • 0:标准模式,遵循SQL标准,SELECT或ORDER BY中出现的非聚合列必须在GROUP BY子句中显式声明,未显式声明会报错Error: [E19045] 排序项%s无法映射到分组
  • 1:MySQL方言写法,允许ORDER BY使用GROUP BY未包含的列(即使该列未聚合),但输出结果可能不稳定。

默认值

0

取值范围

[0|1]

访问权限

R/W

是否全局参数

修改生效方式

def_group_by_mode可在系统运行时,通过数据库SET命令修改,修改后参数值立即生效。

操作步骤

  1. 在数据库中执行以下命令修改def_group_by_mode参数值,根据实际需求在取值范围内选择合适的value值。
    SQL> SET def_group_by_mode TO value
  2. 在数据库中执行以下命令查看当前参数值。
    SQL> SHOW def_group_by_mode

注意事项

此方法为非标准方法,MySQL官方自5.7.5开始已经默认禁止,不建议使用。此方法的非分组列输出不确定,可能并不是用户想要的数据,并且因为结果集排序是在选择之后,ORDER BY不会改变最终的输出值。

sql
-- 创建员工表,包含部门、姓名、工资
SQL> CREATE TABLE employees (
    department VARCHAR(50),
    employee_name VARCHAR(50),
    salary DECIMAL(10, 2)
);

-- 插入测试数据
SQL> INSERT INTO employees VALUES 
    ('Sales', 'Alice', 5000),
    ('Sales', 'Bob', 6000),
    ('HR', 'Charlie', 4500),
    ('HR', 'David', 5500),
    ('IT', 'Eve', 7000);
    
-- 设置为标准模式
SQL> SET def_group_by_mode TO 0;

-- 尝试按部门分组,但SELECT和ORDER BY包含非聚合列
SQL> SELECT department, employee_name, AVG(salary) AS avg_salary FROM employees GROUP BY department ORDER BY salary DESC;  -- salary未在GROUP BY中,也未聚合

Error: [E19045] 排序项EMPLOYEES.SALARY无法映射到分组

-- 设置为MySQL方言模式
SQL> SET def_group_by_mode TO 1;

-- 相同的查询,允许执行但结果不稳定
SQL> SELECT department, employee_name, AVG(salary) AS avg_salary FROM employees GROUP BY department ORDER BY salary DESC;

DEPARTMENT | EMPLOYEE_NAME | AVG_SALARY | 
------------------------------------------------------------------------------
IT| Eve| 7000|
Sales| Alice| 5500|  -- Alice的工资是5000,但随机选取了Alice或Bob
HR| Charlie| 5000|   -- Charlie的工资是4500,但随机选取了Charlie或David