定义:HAVING 也是条件筛选语句,是放在group by 的后面。

基本语法:

SELECT <字段名>
FROM <表名>
GROUP BY <字段名>
HAVING <筛选条件>;

1. HAVING 与 WHERE 的区别

  • HAVING语句与 WHERE 语句都是条件筛选语句,他们的作用都一样,写法也都相同
  • WHERE 语句后面的比较运算符、IN、BETWEEN、 LIKE等在HAVING 中都是可以使用的

他们本质上的区别是:

  • WHERE 是在 GROUP BY分组之前进行条件筛选的,而且后面不可以跟聚合函数
  • HAVING是在 GROUP BY分组之后进行条件筛选的,后面可以跟聚合函数

实例1:在学生表中,找出学生编号小于8的记录,并查找每个班主任带的男女同学数量,最后输出大于2的记录

select 
Tid as '班主任',
Ssex as '性别',
count(*) as '数量'
from students
where Sid < 8
group by Tid,Ssex
having count(*) > 2;

执行结果:
在这里插入图片描述

解析:

  • 需要输出大于2的记录,筛选条件是count(*),由于where 后面不能跟聚合函数,所以这个筛选条件是房放在 having 后面。

注意事项:

  • having 后面的字段如果是表中现有的列,则这个列必须出现在select后面,否则就会报错。

例如,having 后面的字段没有在select后面出现,会出现报错

select 
Tid as '班主任',
Ssex as '性别',
count(*) as '数量'
from students
group by Tid,Ssex
having Sid < 8 and count(*) > 2;

报错信息:Unknown column ‘Sid’ in 'having clause 提示我们不能这么写

因为 having 后面的字段如果是表中现有的列,则这个列必须出现在select后面。

比如我们修改一下,将Sid 改成Tid,语句就正确了,因为Tid也在select后面。

select 
Tid as '班主任',
Ssex as '性别',
count(*) as '数量'
from students
group by Tid,Ssex
having Tid < 8 and count(*) > 2;

2. 字段总结
having字段 ,select字段,group by字段之间的关系,最终可以总结为一下的SQL语句,其中A、B、C都是表中现有的列

select A,C,count(A)
group by A,B,C
having A > 1

1. 如果select 后面跟着是 A 和 C
那么having后面跟着的列,只能是A和C,可以是A,可以是C,但是不可以B。

1. 如果group by 后面跟着是 A ,B, C
那么 select 后面跟着的列,只要包含在A,B,C就可以了,可以是A,B,也可以是A,C,还是可以是A,但是不可以是A,D。

总结:

  • group by中没有出现的列,select 中就不能出现。
  • select 中没有出现的列,having 中就不能出现。

实例感受下:

select 
Tname as '班主任名称',
Ssex as '性别',
count(*) as '数量'
from teachers as t
join students as s
using(Tid)
group by t.Tname,s.Ssex
having count(*) > 2

执行结果:
在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐