使用COUNT函数等对表中数据进行汇总操作时,为其指定条件的不是 WHERE 子句,而是 HAVING 子句。
聚合函数可以在SELECT子句、HAVING子句和ORDER BY子句中使用。
HAVING子句要写在GROUP BY子句之后。
WHERE 子句用来指定数据行的条件,HAVING 子句用来指定分组的条件。
HAVING从GROUP BY的分组中筛选合适分组
SELECT
product_type,
COUNT(*)
FROM
Product
GROUP BY
product_type;
SELECT
product_type,
count(*)
FROM
product
GROUP BY
product_type
HAVING
count(*) = 2;
HAVING和WHERE都可以的场景
SELECT
product_type,
COUNT(*)
FROM
Product
WHERE
product_type = '衣服'
GROUP BY
product_type;
SELECT
product_type,
COUNT(*)
FROM
Product
GROUP BY
product_type
HAVING
product_type = '衣服';
虽然这里HAVING和WHERE都能满足筛选条件,但是最好使用WHERE。关于使用HAVING还是WHERE可以这样考虑:
- WHERE字句 = 指定行所对应的条件
- HAVING字句= 指定组所对应的条件
再者,通常情况下,将条件写在WHERE字句中要比写在HAVING字句中的处理速度要快,返回结果所需的时间更短。粗粗的想一想,可以这样假设,在真正执行的时候,先执行WHERE,再执行GROUP BY,最后执行HAVING。那么WHERE筛选过后再进行GROUP BY,处理的数据量少了,当然分组更快。而HAVING则要在分组完成后,从分组完成后的子表进行选择。
果然如此。
另外,WHERE的另一个优势是,可以对WHERE字句指定条件所对应的列创建索引,这样也可以大幅提高处理速度。