GROUP BY 与 HAVING
2017-11-30 本文已影响0人
一江碎月
GROUP BY
将数据按某些列进行逻辑分组
-
GROUP BY 位于 WHERE 子句之后,ORDER BY 子句之前。
-
除常用的计算函数外(COUNT,MAX,MIN,AVG,SUM),SELECT 中的列必须都出现在 GROUP BY 中。
- 虽然可以写不出现在 GROUP BY 中的列,而且也可以执行操作,但得到的结果往往有问题。
-
如果分组列中包含 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 比较
-
两者语法完全相同。
-
WHERE 对行进行过滤,而 HAVING 对分组进行过滤。
-
WHERE 在分组前进行过滤,被过滤掉的行不会出现在任何分组中;而HAVING 在分组后对分组进行过滤,用于淘汰某些不需要的分组。
-
WHERE 会首先排除一部分行,会对 HAVING 产生影响。