- 语法:
SELECT 分组函数,列(要求出现在GROUP BY子句之后)
FROM 表名
【WHERE 筛选条件】
GROUP BY 分组列表
【ORDER BY 子句】
【HAVING 子句(分组后筛选)】
- 分组查询中的筛选条件分为两类
数据源 | 位置 | 关键字 | |
---|---|---|---|
分组前筛选 | 原始表 | GROUP BY 子句之前 | WHERE |
分组后筛选 | 分组后的结果集 | GROUP BY 子句之后 | HAVING |
注:
1. 分组函数作为条件,肯定放在HAVING
子句中
2. 能用分组前筛选的,优先考虑分组前筛选,提高性能
GROUP BY
子句支持单个字段分组及多个字段分组(多个字段之间用逗号隔开没有顺序),也支持表达式或函数(使用较少)- 可以添加排序(
ORDER BY
)放在整个查询最后
# 1 查询每个工种的最高工资
SELECT MAX(emp.salary),emp.job_id FROM employees emp GROUP BY emp.job_id;
# 2 查询每个位置上的部门个数
SELECT COUNT(*),dep.location_id FROM departments dep GROUP BY dep.location_id;
# 3 查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(emp.salary),emp.department_id,emp.email
FROM employees emp
WHERE emp.email LIKE '%a%'
GROUP BY emp.department_id;
# 4 查询有奖金的每个领导手下员工的最高工资
SELECT MAX(emp.salary),emp.manager_id
FROM employees emp
WHERE emp.commission_pct IS NOT NULL
GROUP BY emp.manager_id;
# 5 查询哪个部门的员工个数 > 2(分组后筛选)
SELECT COUNT(*) AS empNum,emp.department_id
FROM employees emp
GROUP BY emp.department_id
HAVING empNum > 2;