学习重点
- 使用count() 函数等对表中数据进行聚合操作时,为其指定条件的不是where 子句,而需要使用having子句。
- 聚合函数可以在select子句、having子句和order by子句中使用。
- having子句要写在group by 子句之后。
- where子句用来指定数据行的条件,having子句用来指定分组的条件。
having子句
使用having 子句时select 语句的顺序
select → from → where → group by → having
having子句要写group by 子句之后。
举例:
select shohin_bunrui, count(*)
from shohin
group by shohin_bunrui
having count(*) = 2;
执行结果
含义:在group by的基础上对组进行条件查询(在此是满足出现2次/行的数据便是‘衣服’和‘办公用品’)
如果不适用having执行结果
示例2:
不使用having 观察执行结果
select shohin_bunrui, avg(hanbai_tanka)
from shohin
group bu shohin_bunrui;
使用having 观察执行结果
select shohin_bunrui, avg(hanbai_tanka)
from shohin
group bu shohin_bunrui
having avg(hanbai_tanka) >= 2500;
having子句的结构要素
能够使用的要素有三种
· 常数
· 聚合函数
· group by 子句中指定的列名(即聚合键)
错误示范:
select shohin_bunrui, count(*)
from shohin
group by shohin_bunrui
having shohin_mei = '圆珠笔'
上面的示例证明 shohin_mei 并没有在group by 内被定义
辅助理解: having 作为对group by 内的条件查询,把一次聚合后的结果作为having子句起十点的话更容易理解。
相对于having子句,更适合写在where子句中的条件
原表中作为聚合键的列也可以在having子句中使用,
示例:
select shohin_bunrui, count(*)
from shohin
group by shohin_bunrui
having shohin_bunrui = '衣服'
执行结果:
提示:
虽然where 和 having所查询的结果一样但是,我个人认为聚合键所对应的条件还是应该书写在where子句中。聚合键所对应的条件不应该书写在having子句当中,而应该书写在where子句当中。
where子句 = 指定行所对应的条件
having子句 = 指定组所对应的条件
关于where 与 having 执行速度可阅读下方文章
https://blog.csdn.net/xdzcz/article/details/49078613