为聚合结果指定条件

2018-07-23  本文已影响0人  susupp

使用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,再执行GROUP BY,最后执行HAVING。那么WHERE筛选过后再进行GROUP BY,处理的数据量少了,当然分组更快。而HAVING则要在分组完成后,从分组完成后的子表进行选择。
果然如此。
另外,WHERE的另一个优势是,可以对WHERE字句指定条件所对应的列创建索引,这样也可以大幅提高处理速度。

上一篇 下一篇

猜你喜欢

热点阅读