185****1226

2020-06-02   阅读量: 821

MySQL分组后筛选

扫码加入数据分析学习群

在SELECT 语句中,使用GROUP BY子句进行分组后,如果需要对分组后的数据进行筛选,可以使用HANING子句指定筛选条件。

语法:

select <字段名列表> from <表名>

[where <查询条件>]

group by <分组字段列表>

having <筛选条件>;123

HAVING 子句和 WHERE 子句非常相似,都是对数据进行过滤,HAVING 子句支持 WHERE 子句中所有的操作符和语法。

示例:查询各部门clerk的最低工资

mysql> select deptno,job,min(sal) 最低工资

-> from emp

-> where job='clerk'

-> group by deptno,job;

+--------+------------+--------------+

| deptno | job | 最低工资 |

+--------+------------+--------------+

| 10 | clerk | 1300 |

| 20 | clerk | 800 |

| 30 | clerk | 950 |

+--------+------------+--------------+

mysql> select deptno,job,min(sal) 最低工资

-> from emp

-> group by deptno,job

-> having job='clerk';

+--------+------------+--------------+

| deptno | job | 最低工资 |

+--------+------------+--------------+

| 10 | clerk | 1300 |

| 20 | clerk | 800 |

| 30 | clerk | 950 |

+--------+------------+--------------+12345678910111213141516171819202122

WHERE与HAVING的区别:

WHERE 子句主要用于过滤数据行,而 HAVING 子句主要用于过滤分组。

WHERE 子句不可以包含聚合函数,HAVING 子句中的条件可以包含聚合函数。

HAVING 子句是在数据分组后进行过滤,WHERE 子句会在数据分组前进行过滤,WHERE 子句排除的行不包含在分组中。

示例:查询各部门平均工资大于3000的职位

mysql> select deptno,job,avg(sal)

-> from emp

-> where avg(sal)>3000

-> group by deptno,job;

ERROR 1111 (HY000): Invalid use of group function

mysql> select deptno,job,avg(sal)

-> from emp

-> group by deptno,job

-> having avg(sal)>3000;

+--------+-----------+----------+

| deptno | job | avg(sal) |

+--------+-----------+----------+

| 10 | persident | 5000 |

+--------+-----------+----------+1234567891011121314

SQL语句的执行顺序:

FROM -> ON -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> UNION -> ORDER BY -> LIMIT

WHERE在分组和聚集计算之前筛选行,而HAVING 在分组和聚集之后筛选分组的行,因此WHERE子句不能包含聚集函数。

而HAVING 子句是在SELECT子句前执行,因此一般不能在HAVING 子句中使用select定义的别名。但是MySQL对此作了扩展。在mysql 5.7.5之前的版本,ONLY_FULL_GROUP_BY sql mode默认不开启。在5.7.5或之后的版本默认开启。

如果ONLY_FULL_GROUP_BY sql mode不开启,那么mysql对标准SQL的扩展可以生效:

允许在select、having和order by中使用没有出现在group by中的字段。此时mysql会随机选择没有出现在group by中的字段的值。

允许在having中使用select定义的别名。

HAVING 子句中的筛选字段必须是可以出现在分组结果中的字段:查询各部门manager的平均工资

mysql> select deptno,avg(sal) 平均工资

-> from emp

-> group by deptno

-> having job='manager';

ERROR 1054 (42S22): Unknown column 'job' in 'having clause'

mysql> select deptno,job,avg(sal) 平均工资

-> from emp

-> group by deptno,job

-> having job='manager';

+--------+------------+--------------+

| deptno | job | 平均工资 |

+--------+------------+--------------+

| 10 | manager | 2450 |

| 20 | manager | 2975 |

| 30 | manager | 2850 |

+--------+------------+--------------+12345678910111213141516

————————————————

版权声明:本文为CSDN博主「阿柯@CDA」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/kejiayuan0806/java/article/details/102433264

添加CDA认证专家【维克多阿涛】,微信号:【cdashijiazhuang】,提供数据分析指导及CDA考试秘籍。已助千人通过CDA数字化人才认证。欢迎交流,共同成长!
13.7878 2 0 关注作者 收藏

评论(0)


暂无数据

推荐课程