分组查询
语法:
select 分组函数,列(要求出现再group by后面)
from 表
【where 筛选条件】
group by 分组列表
【order by 子句】
注意:
查询列表必须特殊要求,是分组函数和 group by后出现的字段
特点:
1.分组查询中的条件分为两类
数据源 位置 关键字
分组前筛选 原始表 GROUP BY 前面 where
分组后筛选 分组后的结果集 GROUP BY 后面 having
①分组函数做条件,肯定是放在having当中
②能用分组前筛选的 优先考虑分组前筛选
2.GROUP BY 子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开),表达式 或函数(用的较少)
3.也可以添加排序(放在整个分组查询最后)
注意
GROUP BY
HAVING
这两个 关键字后面都是支持别名的,但where关键字 后面不支持别名
案例
案例1:简单分组查询
查询每个工种job_id,最高工资salary 。
SQL语句自然是按照工种 job_id 分组
select MAX(salary) ,job_id
from employees
GROUP BY job_id;
结果:
案例2:添加分组前的筛选
查询领导编号(manager_id) >102 的每个领导手下的最低工资(salary)>5000 的领导编号是哪个,以及其最低工资salary
① 查询领导手下的最低工资
select min(salary),manager_id
from employees
GROUP BY manager_id
#②添加筛选条件:编号>102
select min(salary),manager_id
from employees
where manager_id >102
GROUP BY manager_id
#③添加筛选条件 :最低工资>5000
select min(salary) '最低工资',manager_id
from employees
where manager_id >102
GROUP BY manager_id
HAVING min(salary) >5000
结果:
案例3:添加分组后的筛选
查询哪个部门的员工个数 >2
# ① 查询每个部门的员工个数
SELECT COUNT(*) '员工个数',department_id
from employees
GROUP BY department_id;
# ② 根据第一个结果筛选
SELECT COUNT(*) '员工个数',department_id
from employees
GROUP BY department_id
HAVING COUNT(*) >2
结果: