GROUP BY语句模式(def_group_by_mode)
📄字数 1.0K
👁️阅读量 加载中...
引入版本
v12.1.0
功能描述
def_group_by_mode
用于指定GROUP BY语句模式。
参数属性
属性 | 属性值 |
---|---|
参数类型 | INTEGER |
默认值 | 0 |
取值范围 | {0,1} |
影响范围 | 系统级 |
修改方式 | 在线修改,立即生效 |
使用场景说明
- def_group_by_mode 的作用及影响。
def_group_by_mode | 作用及影响 |
---|---|
0 | 标准模式,遵循SQL标准,SELECT 或 ORDER BY 中出现的非聚合列必须在 GROUP BY 子句中显式声明,否则系统上报 E19045 异常。 |
1 | MySQL方言写法,允许SELECT 输出列使用非分组列,允许ORDER BY 使用GROUP BY 未包含的列。 |
示例
- 在线查看GROUP BY语句模式。
sql
SQL> show def_group_by_mode;
+-------------------+
| DEF_GROUP_BY_MODE |
+-------------------+
| 0 |
+-------------------+
(1 row)
- 设置GROUP 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包含非聚合列
-- salary未在GROUP BY中,也未聚合
SQL> SELECT department, employee_name, AVG(salary) AS avg_salary FROM employees GROUP BY department ORDER BY salary DESC;
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 |
| HR | Charlie | 5000 |
+------------+---------------+------------+
(3 rows)