当前位置:网站首页>零基础自学SQL课程 | HAVING子句
零基础自学SQL课程 | HAVING子句
2022-06-24 07:58:00 【喵宁一】
大家好,我是宁一。
今天讲解SQL教程第16课:HAVING子句。
HAVING 也是条件筛选语句,放在GROUP BY的后面。
基本语法:
SELECT <字段名>
FROM <表名>
GROUP BY <字段名>
HAVING <筛选条件>;1、HAVING与WHERE的区别
HAVING 与我们前面学的 WHERE 都是条件筛选语句,他俩不仅作用差不多,写法也相通。
WHERE语句后面的比较运算符、IN、BETWEEN、LIKE等,在HAVING中也可以使用。
这俩的本质区别是:
WHERE是在GROUP BY分组之前进行条件筛选,后面不可以跟聚合函数。
HAVING是在GROUP BY分组之后进行条件筛选,后面可以直接跟聚合函数。
实例:在Students表中,找出学生编号Sid小于8的记录,并查找每个班主任带的男女学生数量,最后输出数量大于2的记录。

示例结果:

实例解析:我们要输出数量大于2的记录,筛选条件就是COUNT(*)>2,WHERE后面不能跟聚合函数,所以这个筛选条件要放在HAVING的后面。
SELECT Tid,Ssex,COUNT(*)
FROM Students
WHERE Sid<8
GROUP BY Tid,Ssex
HAVING COUNT(*) > 2这里有的同学可能也有疑问了,既然HAVING也能做条件筛选,那我们可以将上面SQL语句的WHERE去掉,筛选条件都合并到HAVING中也行吧,就像下面这样:
SELECT Tid,Ssex,COUNT(*)
FROM Students
GROUP BY Tid,Ssex
HAVING Sid<8 AND COUNT(*) > 2大家可以运行一下这个语句,会报错 Unknown column 'Sid' in 'having clause’,我们不能这样写。
因为HAVING后面的字段如果是表中现有的列,则这个列必须出现在SELECT后面。
比如我们将HAVING后面的Sid改成Tid,语句就正确了,因为Tid,也在SELECT的后面。
HAVING Tid<8 AND COUNT(*) > 22、字段总结
HAVING 字段、SELECT字段,再加上前面讲的GROUP BY字段,他们后面列之间的关系,大家可能会觉得有点乱,我们在这里整体总结一下,理顺一下思路。
最终可以总结为下面的SQL语句,其中A、B、C都是表中现有的列。
SELECT A, C,COUNT(A)
GROUP BY A,B,C
HAVING A>1GROUP BY后面如果是A,B,C:
SELECT后面跟的列,只要包含在A,B,C中就可以了。可以是A,B,C,也可以是A,B,也可以是A,C,也可以是A,但不能是A,D。
SELECT后面如果是A,C:
HAVING后面跟的列,只要包含在A,C中就可以了,可以是A,C,也可以是A,也可以是C,但不能是B。
也就是GROUP BY中没有出现的列,SELECT中就不能出现,SELECT中没有出现的列,HAVING中就不能出现。
有点绕,大家可以根据上面的实例感受一下~
之所以是这样,其中跟语句的执行顺序有关系,我们后面课程会详细讲解语句的执行顺序。
作业:结合Students表和Teachers表,查找每个班主任带的男女学生数量,选出每组学生数量大于2的记录。

示例结果:

作业解析:根据示例答案,第一列是班主任姓名,Students表中只有教师编号Tid,所以我们需要JOIN连接Teachers表,获取到班主任姓名。
还要查找每个班主任带的男女学生数量,通过GROUP BY对班主任Tname,学生性别Ssex分组,再通过COUNT(*)计算数量就可以了。
最后选出每组学生数量大于2的记录,筛选条件就是COUNT(*)>2,WHERE后面不能跟聚合函数,所以这个筛选条件要放在HAVING的后面。
SELECT
t.Tname AS "老师姓名",
s.Ssex AS "学生性别",
COUNT(*) AS "数量"
FROM Teachers AS t
JOIN Students AS s
ON t.Tid = s.Tid
GROUP BY t.Tname,s.Ssex
HAVING COUNT(*)>2;下节课给大家详细讲解SQL语句的书写顺序和执行顺序。
点击关注,更新课程第一时间通知哦~
边栏推荐
- Lu Qi: I am most optimistic about these four major technology trends
- [e325: attention] VIM editing error
- Ebanb B1 Bracelet brush firmware abnormal interrupt handling
- 嵌入式 | 硬件转软件的几条建议
- SLAM14讲中Sophus包的安装问题
- Linux (centos7.9) installation and deployment of MySQL Cluster 7.6
- 数云发布2022美妆行业全域消费者数字化经营白皮书:全域增长破解营销难题
- 华为路由器:GRE技术
- Linux MySQL installation
- Qingcloud based "real estate integration" cloud solution
猜你喜欢

玄铁E906移植----番外0:玄铁C906仿真环境搭建

Linux (centos7.9) installation and deployment of MySQL Cluster 7.6

Squid proxy application

The border problem after the focus of input

The list of open source summer winners has been publicized, and the field of basic software has become a hot application this year

【LeetCode】415. String addition

Numpy numpy中的np.c_和np.r_详解

jupyter入门常见的几个坑:

Yolox backbone -- implementation of cspparknet

MySQL | store notes of Master Kong MySQL from introduction to advanced
随机推荐
牛客网 实现简单计算器功能
KaFormer个人笔记整理
Numpy numpy中的np.c_和np.r_详解
uniapp 开发多端项目如何配置环境变量以及区分环境打包
A tip to read on Medium for free
Spark - LeftOuterJoin 结果条数与左表条数不一致
Sword finger offer 55 - I. depth DFS method of binary tree
[redis implements seckill business ①] seckill process overview | basic business implementation
“论解不了数独所以选择做个数独游戏这件事”
Qingcloud based "real estate integration" cloud solution
解决:jmeter5.5在win11下界面上的字特别小
Rpiplay implementation of raspberry pie airplay projector
Scheme of alcohol concentration tester based on single chip microcomputer
Framework tool class obtained by chance for self use
玄铁E906移植----番外0:玄铁C906仿真环境搭建
EasyExcel单sheet页与多sheet页写出
嵌入式 | 硬件转软件的几条建议
Ebanb B1 Bracelet brush firmware abnormal interrupt handling
MySQL | view notes on Master Kong MySQL from introduction to advanced
牛客网 十进制整数转十六进制字符串