● 使用COUNT函数等对表中数据进行汇总操作时,为其指定条件的不是WHERE子句,而是HAVING子句。
例如:数据行数为2行,平均值等于500
HAVING子句语法:
select 列名1,列名2,列名3
from 表名
group by 列名1,列名2,列名
having 分组结果对应的条件
使用having 子句在select中的执行顺序:
select --from ---where----group by ----having
案例:
按照商品分类后,取出包含结果行数为2行的组
select product_type,count(*)
from Product
group by product_type
having count(*)=2;
HAVING 子句的构成要素:
常数
聚合函数
group by 子句中指定的列名
HAVING子句的不正确使用方法:
select product_type,count(*)
from Product
group by product_type
having product_name = '办公用品';
product_name 列并不包含在 GROUP BY 子句之中,因此不允许
写在 HAVING 子句里。
相对于HAVING子句, 更适合写在WHERE子句中的条件
将条件书写在HAVING子句中的情况
SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type
HAVING product_type = '衣服';
结果:
product_type | count
衣服 | 2
将条件书写在WHERE子句中的情况
SELECT product_type, COUNT(*)
FROM Product
WHERE product_type = '衣服'
GROUP BY product_type;
结果:
product_type | count
衣服 | 2
条件分别写在 WHERE 子句和 HAVING 子句当中,但是条件的内容以及返回的结果都完全相同。
建议书写时:
WHERE 子句 = 指定行所对应的条件
HAVING 子句 = 指定组所对应的条件
补充:
WHERE子句和HAVING子句的执行速度
**为了得到相同的结果,将条件写在 WHERE 子句中要比写在 HAVING 子句中的处理速度更快
返回结果所需的时间更短。
通过 WHERE 子句指定条件时,由于排序之前就对数据进行了过滤,因此能够减少排序的数据量。
但 HAVING 子句是在排序之后才对数据进行分组的,因此与在 WHERE 子句中指定条件比起来,
需要排序的数据量就会多得多。WHERE 子句指定条件所对应的列创建索引,这样也可以大幅提高
处理速度。创建索引是一种非常普遍的提高性能的方法,效果也十分明显