4.3 数据库HAVING语句

having子句要和group by子句联合起来才能使用,不能单独去使用,接下来咱们看一下为什么要引入having子句语法呢?引入having子句也是出于无奈,因为有些条件查询,用group by子句并不能满足要求,比如说查询部门平均底薪超过2000元的部门编号。按照正常的逻辑,这个sql语句应该写成下面这个样子

sql 复制代码
select deptno from t_emp
where avg(sal)>=2000
group by deptno

看似这个sql语句在语法上没有什么问题,但是在执行的时候,它一定会报错,语法是有错误的。这又是怎么回事呢?因为where子句,它的优先级是优于group by执行的,所以说这样是有语法错误的,这个时候就要引入having子句了

1. HAVING子句

having子句不能独立存在,它必须要依赖group by子句,所以它的这个执行顺序是group by子句执行完事之后,就立即轮到它来执行了。我们引入了 HAVING 子句,就可以拿聚合函数作为判断条件了。在WHERE子句里面绝对不能写,只有在HAVING子句里面才可以这么写。

sql 复制代码
select deptno from t_emp
group by deptno having avg(sal)>=2000

问题1:查询每个部门中,1982年以后入职员工超过2个人的部门编号

sql 复制代码
select deptno
from t_emp
where hiredate>="1982-01-01"
group by deptno having count(*)>=2;

2. HAVING子句的特殊用法

这个SQL语句里边的group by子句并没有写分组的字段,只写了 1 这个 1 代表的是用select子句当中第一个字段作为分组字段

sql 复制代码
select deptno,count(*)
from t_emp
group by 1 having deptno in(10,20)

这个HAVING子句。它是相当于WHERE子句的。所以说我们把WHERE子句拿掉,把WHERE子句的一些条件写在这里边。比如说是第一批deptno in 10,20,是想去判断一下这个10部门和20部门里边,按照这个部门编号的去分组,去统计一下两个部门里边员工的数量,只统计10和20部门的员工数量。正常情况下,我们如果不用HAVING的话,我们是可以用WHERE子句去定义这个条件的。这个判断条件写在HAVING子句里边也是可以的。最后我是建议大家,不要这么去写,为什么呢?因为这个WHERE子句它是先于group by子句执行的,它是先筛选一些数据,剩下的符合条件的数据,我们再去做分组,再去做聚合的统计计算。这个数据量就比较小了。但是如果我们把这个条件写在HAVING子句里边,这个group by做这个分组的时候,这个数据量还是很大的。你再去用这个HAVING子句筛选掉其他的这些数据,还是有点不值得的。你倒不如说写到WHERE子句里面,先筛选掉一大部分数据,少量的数据再进行分组,再拿这个聚合函数去执行统计一下。这样运行速度就比较快了。

将普通条件写在where子句里,这样运行的速度更快些

sql 复制代码
select deptno,count(*)
from t_emp
where deptno in(10,20)
group by 1
相关推荐
DemonAvenger2 分钟前
MySQL索引原理深度解析与优化策略实战
数据库·mysql·性能优化
1892280486137 分钟前
NY270NY273美光固态闪存NY277NY287
服务器·网络·数据库·科技·性能优化
javachen__3 小时前
SpringBoot整合P6Spy实现全链路SQL监控
spring boot·后端·sql
星霜笔记4 小时前
Docker 部署 MariaDB+phpMyAdmin+Nextcloud 完整教程
运维·数据库·docker·容器·mariadb
poemyang8 小时前
十年大厂员工终明白:MySQL性能优化的尽头,是对B+树的极致理解
mysql·pagecache·顺序i/o·局部性原理·b tree·b+ tree
wyiyiyi10 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
天宇_任10 小时前
Mysql数据库迁移到GaussDB注意事项
数据库·mysql·gaussdb
武昌库里写JAVA13 小时前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
xiep143833351013 小时前
Ubuntu 安装带证书的 etcd 集群
数据库·etcd
Java小白程序员14 小时前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring