DQL分组查询介绍
分组查询
语法格式: SELECT 分组函数,列(要求出现在group by的后面)
from 表
WHERE 筛选条件
group by 分组的列表
order by 子句
首先来查看一下案列要操作的表
# 查看每个部分的薪资最高(根据job_id区分部门)
SELECT MAX(salary),job_id
FROM employees
GROUP BY job_id;
# 查看job_id的人数
SELECT COUNT(*),job_id
FROM employees
GROUP BY job_id
当我们没写列会出现什么情况呢,结果就是我们看不到是哪个部分的,比如下面的情况,我们得不到有用的信息
*那有的人可能会问,可不可以把所有信息显示出来呢(比如使用select ),答案是不行的,因为同一个部门的其他信息你不能保证是相同的,所以建议下面用什么分组,上面显示就写什么
案例
# 需求一:统计每个部分薪资>10000的人数
# 先写一个统计部门人数的把
SELECT COUNT(*),department_id
FROM employees
GROUP BY department_i
# 然后实现筛选
SELECT COUNT(*),department_id
FROM employees
WHERE salary > 10000
GROUP BY department_id
# 需求二:在需求一的基础上继续筛选count(*) < 2的部门
SELECT COUNT(*),department_id
FROM employees
WHERE salary > 10000
GROUP BY department_id
WHERE COUNT(*) < 2 # 错误写法
# 这样应该就可以了吧
# 怎么报错了,赶紧上网查一查,哦 ,原来不能用where了而改用了HAVING(having 拥有)
SELECT COUNT(*),department_id
FROM employees
WHERE salary > 10000
GROUP BY department_id
HAVING COUNT(*) < 2
Q:GROUP BY后面还能接什么呢
可以接我们前面所学的单行函数,举例
SELECT COUNT(*),LENGTH(last_name)
FROM employees
GROUP BY LENGTH(last_name)
多个字段分组
# 不同部门不同工种分组
SELECT COUNT(*),department_id,job_id
FROM employees
GROUP BY department_id,job_id
# 太简单了,后面再接一个条件就行了
分组后排序
我们可以使用order by对分组后的进行排序
SELECT AVG(salary) 平均工资,department_id
FROM employees
GROUP BY department_id
ORDER BY 平均工资