GROUP BY语句模式(def_group_by_mode)
📄字数 992
👁️阅读量 加载中...
引入版本
v12.1.0
功能描述
def_group_by_mode用于指定GROUP BY语句模式。
参数属性
| 属性 | 属性值 |
|---|---|
| 参数类型 | INTEGER |
| 默认值 | 0 |
| 取值范围 | {0,1} |
| 影响范围 | 系统级 |
| 修改方式 | 在线修改,立即生效 |
使用场景说明
- 该参数控制系统内部 SQL 引擎在解析处理 GROUP BY 语句时的行为。
| def_group_by_mode | 作用及影响 |
|---|---|
| 0 | 标准模式,遵循SQL标准,SELECT 或 ORDER BY 中出现的非聚合列必须在 GROUP BY 子句中显式声明,否则系统上报 E19045 异常。 |
| 1 | MySQL方言写法,允许SELECT 输出列使用非分组列,允许ORDER BY 使用GROUP BY 未包含的列。 |
示例
sql
-- 在线设置 def_group_by_mode
SQL> SET def_group_by_mode TO 0;
-- 在线查看 def_group_by_mode
SQL> SHOW def_group_by_mode;
/*
* 场景一:
* 1. def_group_by_mode = 0;
*/
-- 创建员工表,包含部门、姓名、工资
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);
/*
* 尝试按部门分组,但 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; /* 执行报错 E19045 */
/*
* 场景二:
* 1. def_group_by_mode = 1;
* 2. 基于 '场景一' 的数据和环境;
*/
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 |
* +------------+---------------+------------+
*/