MySQL分组查询——简单查询、添加筛选条件、添加排序

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

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
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值