SQL入门之第十五讲——HAVING 子句
定义:HAVING 也是条件筛选语句,是放在group by的后面。基本语法:SELECT <字段名>FROM <表名>GROUP BY <字段名>HAVING <筛选条件>;1. HAVING与 WHERE 的区别HAVING语句与 WHERE 语句都是条件筛选语句,他们的作用都一样,写法也都相同WHERE 语句后面的比较运算符、IN、BETWEE
定义: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
执行结果:
更多推荐
所有评论(0)