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命令修改,修改后参数值立即生效。
操作步骤
- 在数据库中执行以下命令修改def_group_by_mode参数值,根据实际需求在取值范围内选择合适的
value
值。SQL> SET def_group_by_mode TO value
- 在数据库中执行以下命令查看当前参数值。
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