分组查询:和分组函数一起查询的就是分组的字段
查询列表往往是,分组函数的 分组字段
注意:分组函数做条件只可能放在having后面,如果where和having都可以完成过滤那就优先选择where
1.语法:
select 查询列表
from 表名
where分组前筛选
group by 分组列表
having 分组后筛选
2.执行顺序:
1.from
2.where
3.group by
4.having
5.select
6.order by
3.特点:
1.查询列表往往是,分组函数和被分组的字段
2.分组查询中的筛选分为两类
注意:分组函数做条件只可能放在having后面,如果where和having都可以完成过滤那就优先选择where
筛选的基表: 使用关键字: 位置
分组前的筛选:原始表 where group by的前面
分组后的筛选:分组后的结果集 having group by的后面
where–group–having
#案例:
#1)简单的分组
查询列表往往是,分组函数的 分组字段
#查询每个工种的员工平均工资
SELECT job_id
,AVG(salary
)
FROM employees
GROUP BY job_id
;
#查询每个领导手下的人数
SELECT manager_id
,COUNT(manager_id
)
FROM employees
GROUP BY manager_id
;
#2)可以实现分组前的筛选(where)
案例1:查询邮箱中包含a字符的 每个部门的最高工资
SELECT MAX(salary
) 最高工资,department_id
FROM employees
WHERE email
LIKE ‘%a%’ AND department_id
IS NOT NULL
GROUP BY department_id
;
案例2:查询每个领导手下有奖金的员工的平均工资
SELECT manager_id
, AVG(salary
) 平均工资
FROM employees
WHERE commission_pct
IS NOT NULL
GROUP BY manager_id
;
#3)可以实现分组后的筛选
可以使用分析法,把题目拆解开来,一个一个的分析,一步一步的往下走
也可以使用填空法,就是把需要使用的关键字全部写下来,一个一个的去填写后面需要字段
案例1:查询哪个部门的员工个数>5
#分析1:查询每个部门的员工个数
SELECT department_id
,COUNT(*) 员工个数
FROM employees
WHERE department_id
IS NOT NULL
GROUP BY department_id
;
#分析2:在查询出每个部门的员工个数结果集上做过滤
SELECT department_id
,COUNT() 员工个数
FROM employees
WHERE department_id
IS NOT NULL
GROUP BY department_id
HAVING COUNT()>5;
案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT job_id
,MAX(salary
) 最高工资
FROM employees
WHERE commission_pct
IS NOT NULL
GROUP BY job_id
HAVING MAX(salary
)>12000;
案例3:领导编号>102的每个领导手下的最低工资大于5000的领导编号和最低工资
SELECT manager_id
,MIN(salary
) 最低工资
FROM employees
WHERE manager_id
IS NOT NULL AND manager_id
>102
GROUP BY manager_id
HAVING MIN(salary
)>5000
ORDER BY manager_id
;
#4)可以实现排序
案例:查询每个工种没有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序
#填空法:就是把每个关键字先写出,最后统一填写需要写的数据
SELECT job_id
,MAX(salary
) 最高工资
FROM employees
WHERE commission_pct
IS NULL
GROUP BY job_id
HAVING MAX(salary
)>6000
ORDER BY 最高工资;
#5)按多个字段分组,同时满足多字段才是一组
比如按照下面,必须是job_id和department_id相同才是同一个组
#案例:查询每个工种每个部门的最低工资,并按最低工资降序
SELECT job_id
,department_id
,MIN(salary
) 最低工资
FROM employees
GROUP BY job_id
,department_id
ORDER BY 最低工资;
示例
#进阶6:分组查询
/*
语法:
select 查询列表
from 表名
where分组前筛选
group by 分组列表
having 分组后筛选
执行顺序:
1.from
2.where
3.group by
4.having
5.select
6.order by
特点:
1.查询列表往往是,分组函数和被分组的字段
2.分组查询中的筛选分为两类
优先where,
筛选的基表: 使用关键字: 位置
分组前的筛选 原始表 where group by的前面
分组后的筛选 分组后的结果集 having group by的后面
where--group--having
问题:分组函数做条件只可能放在having后面
*/
#案例:
#1)简单的分组
查询列表往往是,分组函数和被分组的字段
#案例1:查询每个工种的员工平均工资
SELECT `job_id`,AVG(`salary`)
FROM `employees`
GROUP BY `job_id`;
#查询每个领导手下的人数
SELECT `manager_id`,COUNT(`manager_id`)
FROM `employees`
GROUP BY `manager_id`;
#2)可以实现分组前的筛选
#案例1:查询邮箱中包含a字符的 每个部门的最高工资
SELECT MAX(`salary`) 最高工资,`department_id`
FROM `employees`
WHERE `email` LIKE '%a%' AND `department_id` IS NOT NULL
GROUP BY `department_id`;
#案例2:查询每个领导手下有奖金的员工的平均工资
SELECT `manager_id`, AVG(`salary`) 平均工资
FROM `employees`
WHERE `commission_pct` IS NOT NULL
GROUP BY `manager_id`;
#3)可以实现分组后的筛选
#案例1:查询哪个部门的员工个数>5
#分析1:查询每个部门的员工个数
SELECT `department_id`,COUNT(*) 员工个数
FROM `employees`
WHERE `department_id` IS NOT NULL
GROUP BY `department_id`;
#分析2:在查询出每个部门的员工个数结果集上做过滤
SELECT `department_id`,COUNT(*) 员工个数
FROM `employees`
WHERE `department_id` IS NOT NULL
GROUP BY `department_id`
HAVING COUNT(*)>5;
#案例2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT `job_id`,MAX(`salary`) 最高工资
FROM `employees`
WHERE `commission_pct` IS NOT NULL
GROUP BY `job_id`
HAVING MAX(`salary`)>12000;
#案例3:领导编号>102的每个领导手下的最低工资大于5000的领导编号和最低工资
SELECT `manager_id`,MIN(`salary`) 最低工资
FROM `employees`
WHERE `manager_id` IS NOT NULL AND `manager_id`>102
GROUP BY `manager_id`
HAVING MIN(`salary`)>5000
ORDER BY `manager_id`;
#4)可以实现排序
#案例:查询每个工种没有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序
#填空法:就是把每个
SELECT `job_id`,MAX(`salary`) 最高工资
FROM `employees`
WHERE `commission_pct` IS NULL
GROUP BY `job_id`
HAVING MAX(`salary`)>6000
ORDER BY 最高工资;
#5)按多个字段分组,同时满足多字段才是一组
#案例:查询每个工种每个部门的最低工资,并按最低工资降序
SELECT `job_id`,`department_id`,MIN(`salary`) 最低工资
FROM `employees`
GROUP BY `job_id`,`department_id`
ORDER BY 最低工资;