#进阶6:分组查询
/*
语法:(执行顺序)
select 分组函数,分组的字段 -- ⑤
from 表名 -- ①
where 分组前的筛选条件-- ②
group by 分组的字段,... -- ③
having 分组后的筛选条件 -- ④
order by 排序列表 --⑥
特点:筛选可以分为分组前筛选和分组后筛选
针对的数据 使用的关键字 位置
分组前筛选 原始表 where group by前面
分组后筛选 分组后的结果集 having group by后面
分组函数做条件放在having后面!
*/
USE myemployees;
#引入案例:
#查询每个部门的平均工资
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id;
#1.简单 的分组查询
#案例1:查询每个工种的最高工资
SELECT MAX(salary) 最高工资,job_id
FROM employees
GROUP BY job_id;
#案例2: 查询每个位置号上的部门个数
SELECT COUNT(*) 个数,location_id
FROM departments
GROUP BY location_id;
#2.添加分组前筛选条件
#案例1:查询有奖金的每个部门的最低工资
SELECT MIN(salary) 最低工资,department_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY department_id;
#案例2:查询邮箱中包含a字符的,每个管理者手下的工资和
SELECT SUM(salary) 工资和,manager_id
FROM employees
WHERE email LIKE '%a%'
GROUP BY manager_id;
#3.添加分组后筛选条件
#案例1:查询哪个部门的最低工资>5000
#① 查询每个部门的最低工资
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id
#② 筛选刚才的结果
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id
HAVING MIN(salary)>5000
#案例2:查询部门经理编号是1开头的,哪个位置上的部门个数>2个的位置编号
#①查询每个位置的部门经理编号是1开头的部门个数
扫描二维码关注公众号,回复:
3032073 查看本文章
SELECT COUNT(*),location_id
FROM departments
WHERE manager_id LIKE '1%'
GROUP BY location_id
#②筛选 看哪个位置的部门个数>2
SELECT COUNT(*),location_id
FROM departments
WHERE manager_id LIKE '1%'
GROUP BY location_id
HAVING COUNT(*)>2
#4.添加排序
#案例:查询哪个工种的平均工资高于5000,并且按平均工资进行降序
#①查询每个工种的平均工资
SELECT AVG(salary) 平均工资,job_id
FROM employees
GROUP BY job_id
#②添加分组后筛选
SELECT AVG(salary) 平均工资,job_id
FROM employees
GROUP BY job_id
HAVING 平均工资>5000
#③排序
SELECT AVG(salary) 平均工资,job_id
FROM employees
GROUP BY job_id
HAVING 平均工资>5000
ORDER BY 平均工资 DESC;
#5.按多个字段分组
#案例:查询员工编号 不在100到120之间的每个工种每个部门的最低工资,并且按最低工资升序
#①查询每个工种每个部门的最低工资
SELECT MIN(salary) 最低工资,job_id,department_id
FROM employees
GROUP BY job_id,department_id
#②添加筛选
SELECT MIN(salary) 最低工资,job_id,department_id
FROM employees
WHERE employee_id NOT BETWEEN 100 AND 120
GROUP BY job_id,department_id
#③排序
SELECT MIN(salary) 最低工资,job_id,department_id
FROM employees
WHERE employee_id NOT BETWEEN 100 AND 120
GROUP BY job_id,department_id
ORDER BY 最低工资 DESC;