MySQL分组查询
分组数据: group by子句
可以使用group by子句将表中的数据分成若干组
语法:
select 分组函数,列(分组查询搭配分组函数使用,要求列要出现在group by后面)
from 表
【where 筛选条件】
group by 表达式
【order by 字段】

注:
查询列表比较特殊,要求是分组函数和group by 后出现的字段,
where一定要放在from后面 。
特点:
1. 分组查询中的筛选条件分为两类:
注:
①分组函数做条件放在having子句中
②能用分组前筛选的,优先考虑使用分组前筛选
| 数据源(针对的表) | 位置 | 关键字 | |
|---|---|---|---|
| 分组前筛选: | 原始表 | group by的前面 | where |
| 分组后筛选: | 分组后的结果集 | group by的后面 | having |
2. group by子句支持单个字段分组、多个字段分组(多个字段之间用逗号隔开没有顺序要求)、表达式或函数(相对前两种不常用)
3. 也可以添加排序(排序放在整个分组查询的最后)
一. 简单查询 :
1.查询每个工种的最高工资

2.查询每个位置上的部门个数

二. 添加筛选条件 :
1.查询邮箱中包含a字符的,每个部门的平均工资

2.查询每个领导手下有奖金的员工最高工资

注:以上两个筛选条件涉及的(where后面的)字段都来自原始表(from后面的表)
三. 添加复杂筛选条件 :
1.查询部门的员工个数>2
第①步: 查询每个部门的员工个数

第②步 :根据①的结果进行筛选,查询部门的员工个数>2的(因为根据原始表是无法筛选的)

如果筛选条件跟在from后使用是不能执行的( 因为count(*)此字段不在employees表内 )对分组函数无效使用,报错!
应该根据分组后再筛选(执行完group by子句再筛选),那么需要追加having.

# where过滤行 having过滤分组 #
Where 是个约束声明在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之前起作用,且where后面不能使用“聚合函数”
Having是个过滤声明,所谓过滤是在查询数据库的结果返回之后进行过滤,即在结果返回之后起作用,并且having后面可以使用“聚合函数”
简而言之where出结果前用,having出结果后筛选用
2.查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
首先是查询有奖金的员工,进行分组,最后筛选出最高工资大于12000
第①步 : 查询每个工种有奖金的员工的最高工资

第②步 :根据①的结果继续筛选,最高工资>12000

3.查询领导编号>140的领导编号以及手下员工最低工资,要求他手下员工最低工资>5000
第①步 :查询每个领导手下的员工的最低工资

第②步 :添加筛选条件:编号>140

第③步: 添加筛选条件:最低工资>5000

四. 按表达式或函数分组 :
按员工姓名的长度分组,查询每一组的员工个数,筛选员工个>20的有哪些


注:
MySQL中支持group by子句和having子句跟别名(Oracle中不支持)
但where后面不支持.
五. 按多个字段分组 :
查询每个部门每个工种的员工的平均工资

注:
group by后面的department_id和job_id一样的才能在一个组,
group by后面的多个字段可以调换顺序
六. 添加排序 :
查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示,要求部门编号不为空且平均工资>20000

本文详细介绍了MySQL中的分组查询,包括简单查询、添加筛选条件、按表达式或函数分组、按多个字段分组以及添加排序。通过实例解析了分组函数与HAVING子句的使用,强调了WHERE与HAVING的区别,并展示了如何处理复杂的分组筛选条件。
544

被折叠的 条评论
为什么被折叠?



