1、分组查询总结
语法:
select 分组函数 别名,分组后的字段
from 表
【where 分组前筛选】
group by 分组的字段
【having 分组后筛选】
【order by 排序的东西】
特点:
1、按多个字段分组,字段间用逗号隔开,没有顺序要求
2、可以分组函数一起查询的字段只能是分组后的字段
3、分组筛选
针对的表 位置 使用的关键字
分组前筛选 原始表 group by的前面 where
分组后筛选 分组后的结果集 group by的后面 having
顺序:where -> group by -> having
4、having和group by支持别名
2、引入:查询各部门的最高工资
SELECT MAX(salary) FROM employees WHERE department_id IN(20,90,30);
SELECT MAX(salary) FROM employees GROUP BY department_id;
3、普通的分组查询
案例:查询各部门的最高工资和部门号
SELECT MAX(salary),department_id FROM employees GROUP BY department_id;
4、按多个字段分组
案例:查询每个工种、每个部门的平均工资
SELECT AVG(salary),job_id,department_id
FROM employees
GROUP BY job_id,department_id;
5、分组加筛选总结
/*
筛选条件分两类:
分组前筛选:筛选的条件针对的是原始表
分组后筛选:筛选的条件针对的是分组后的结果集
针对的表 位置 使用的关键字
分组前筛选 原始表 group by的前面 where
分组后筛选 分组后的结果集 group by的后面 having
where -> group by -> having
*/
6、查询有奖金的,每个部门的最高奖金率
SELECT MAX(commission_pct) 最高奖金率,department_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY department_id;
7、查询员工姓名中包含字符a,每个部门的最低工资高于3000的部门编号
SELECT department_id,MIN(salary) 最低工资
FROM employees
WHERE last_name LIKE '%a%'
GROUP BY department_id
HAVING MIN(salary)>3000;
8、查询电话以“110”开头的,工种号包含字符'T'的每个工种的平均工资>5000的工种号和平均工资
SELECT job_id,AVG(salary)
FROM employees
WHERE phone_number LIKE '110%' AND job_id LIKE '%T%'
GROUP BY job_id
HAVING AVG(salary)>5000;
9、查询每个位置的部门个数大于2的部门个数和位置号
SELECT COUNT(*) 个数,location_id
FROM departments
GROUP BY location_id
HAVING COUNT(*)>2;
10、havign子句支持别名
案例:查询每个位置的部门个数大于2的部门个数和位置号
SELECT COUNT(*) 个数,location_id
FROM departments
GROUP BY location_id
HAVING 个数>2;
11、排序
SELECT department_id,MIN(salary) 最低工资
FROM employees
WHERE last_name LIKE '%a%'
GROUP BY department_id
HAVING MIN(salary)>3000
ORDER BY 最低工资 DESC;