GROUP BY 与 HAVING

2017-11-30  本文已影响0人  一江碎月

GROUP BY

将数据按某些列进行逻辑分组

  1. GROUP BY 位于 WHERE 子句之后,ORDER BY 子句之前。

  2. 除常用的计算函数外(COUNT,MAX,MIN,AVG,SUM),SELECT 中的列必须都出现在 GROUP BY 中

    • 虽然可以写不出现在 GROUP BY 中的列,而且也可以执行操作,但得到的结果往往有问题。
  3. 如果分组列中包含 NULL 值的行,则 NULL 将会做为一个单独的分组返回;如果有多个 NULL 值行,它们将会成为一组。

SELECT count(*),ArtistId FROM albums GROUP BY ArtistId;

其中 COUNT 是计算函数,ArtistId 是出现在 GROUP BY 子句中。

该语句会按照 ArtistId 进行分组,并对每一组进行 count 计算 —— 这里并不是对所有的表进行计算,而只是依次对分组进行计算。


HAVING

对分组进行过滤。

使用 HAVING 对分组进行过滤,淘汰不需要的分组。

SELECT count(*) AS c,ArtistId FROM albums GROUP BY ArtistId HAVING c > 10;

该语句会淘汰总数不大于 10 的所有分组。

与 WHERE 比较

  1. 两者语法完全相同。

  2. WHERE 对行进行过滤,而 HAVING 对分组进行过滤。

  3. WHERE 在分组前进行过滤,被过滤掉的行不会出现在任何分组中;而HAVING 在分组后对分组进行过滤,用于淘汰某些不需要的分组。

  4. WHERE 会首先排除一部分行,会对 HAVING 产生影响。

上一篇下一篇

猜你喜欢

热点阅读