GROUP BY是SQL中用于对结果集进行分组的子句,通常与聚合函数(如COUNT, SUM, AVG等)一起使用。它根据一个或多个列对结果集进行分组,然后对每个组应用聚合函数。
MySQL示例(默认模式下):
SELECT department_id, employee_name, AVG(salary)
FROM employees
GROUP BY department_id;
在MySQL中这可能执行成功,即使employee_name不在GROUP BY中
Oracle示例:
SELECT department_id, employee_name, AVG(salary)
FROM employees
GROUP BY department_id;
这会报错,因为employee_name不在GROUP BY中
MySQL的这种行为源于其历史设计选择,目的是简化某些查询的编写。但在严格模式下(ONLY_FULL_GROUP_BY),MySQL也会像Oracle一样要求完全符合SQL标准。
-- 设置SQL模式为ONLY_FULL_GROUP_BY
SET sql_mode = 'ONLY_FULL_GROUP_BY';
-- 或修改my.cnf/my.ini文件永久生效
[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
-- 正确写法(两者都兼容)
SELECT department_id, MAX(employee_name) as employee_name, AVG(salary)
FROM employees
GROUP BY department_id;
-- 或
SELECT e.department_id, e.employee_name, e.salary
FROM employees e
JOIN (
SELECT department_id, AVG(salary) as avg_salary
FROM employees
GROUP BY department_id
) dept_avg ON e.department_id = dept_avg.department_id;