# 分组查询
/*
语法 :
select 分组函数 列 (要求放在group by 的后面)
from 表
【where 筛选条件 】
group by 分组的列表
【排序 】
注意:
查询列表 比较特殊 要求是分组函数 和 group by 后出现的字段
分组查询 中的条件查询分为两类
一类是 分组前筛选 在group by 前面添加 where
第二类 是 分组后筛选 在group by 后面 添加 having
分组函数做条件 肯定是放在 having 子句的
能在前面筛选就在前面筛选
*/
# 案例1 查询 每个部门的平均工资
SELECT AVG(salary) FROM employees;
#查询 每个工种的最高工资
# 简单的分组查询
# 先根据工种分组 然后 配合分组函数 分组函数 面对的是一群数据 而不是单个
SELECT MAX(salary) , job_id FROM employees GROUP BY job_id ;
#查询每个位置上的部门的个数
SELECT COUNT(1),location_id FROM departments GROUP BY location_id;
#添加 筛选条件
#案例1: 查询 邮箱中的包含的a字符的 ,每个部门的平均工资
SELECT
AVG (salary),
department_id
FROM
employees
WHERE email LIKE "%a%" # 查询条件 必须放在 group by 前面
GROUP BY department_id;
# 查询 每个领导人手下的员工的 最高的工资 有奖金
SELECT MAX(salary),manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id;
# 添加复杂的筛选
# 查询哪个部门的员工个数大于2
# 首先查询每个部门的员工个数
SELECT
COUNT(*),
department_id
FROM
employees
GROUP BY department_id;
# 然后 根据 查询到的 结果 再进行筛选 查询哪个部门的员工大于2 分组后的筛选
# 无效的组合函数引用 利用 having 过滤分组 where 不可以在group by 前面
SELECT
COUNT(*),
department_id
FROM
employees
GROUP BY department_id;
HAVING COUNT (*) > 2;
SELECT
MAX (salary),
job_id
FROM
employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX (salary) > 12000 ;
#案列 3 查询领导编号 >102 的每个领导手下的 最低工资 》 5000
SELECT
MIN(salary),
manager_id
FROM
employees
WHERE manager_id > 102
GROUP BY manager_id
HAVING MIN(salary) > 5000;
# 按照表达式 分组
# 案例1 : 按照员工长度分组 查询 每一组的员工个数,筛洗 员工个数大于5 的有哪些
SELECT COUNT(1) ,LENGTH(last_name) "姓名长度" FROM employees GROUP BY
LENGTH(last_name) HAVING COUNT(1) >5;
# 每个部门 每个工种的 员工的平均工资 多个字符 分组查询
SELECT AVG(salary),job_id,department_id FROM employees GROUP BY job_id,department_id;
# 分组查询之后 添加排序
#每个部门 每个工种的 员工的平均工资 奖金不为空 并且 平均工资大于 10000 并且 按照平均工资的高低显示
SELECT AVG(salary),job_id,department_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY job_id,department_id
HAVING AVG(salary) >10000
ORDER BY AVG(salary) DESC;
MySQL 分组查询简单例子
猜你喜欢
转载自blog.csdn.net/weixin_46999174/article/details/108784445
今日推荐
周排行