Group by规定:
- Group by子句可以包含任意数目的列
- 如果group by子句中嵌套了分组,数据将在最后规定的分组上进行汇总
- Group by子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在select中使用表达式,则必须在group by子句中使用相同的表达式,不能使用别名。
表格 1 SQL聚集函数
函数 | 说明 |
AVG() | 返回某列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列的最大值 |
MIN() | 返回某列的最小值 |
SUM() | 返回某列值之和 |
-
大多数SQL实现不允许group by 列带有长度可变的数据类型 - 除聚集计算语句外,select语句中的每个列都必须在group by子句中给出
- 如果分组列中具有NULL值,则NULL值将作为一个分组返回。如果列中有多行NULL值,它们将分为一组。
- Group by 子句必须出现在where子句之后,order by子句之前
Where& Having
Where在数据分组前进行过滤,having在数据分组后进行过滤。为了更好的区分,仅在与group by子句结合时才使用having,where子句用于标准的行级过滤。
Order by & group by
表格 2 oder by & group by区别
ORDER BY | GROUP BY |
排序产生的输出 | 分组行,但输出可能不是分组的顺序 |
任意列都可以使用 | 只可能使用选择列或表达式,而且必须使用每个选择列表达式 |
不一定需要 | 如果与聚集函数一起使用列(或表达式)则必须使用 |
一般使用group by子句时,应该也给出order by子句,这是保证数据正确排序的唯一方法。
表格 3 select 子句及顺序
子句 | 说明 | 是否必须使用 |
SELECT | 要返回的列或表达式 | 是 |
FROM | 从中检索数据的表 | 仅在从表选择数据时使用 |
WHERE | 行级过滤 | 否 |
GROUP BY | 分组说明 | 仅在按组计算聚集时使用 |
HAVING | 组级过滤 | 否 |
ORDER BY | 输出排序顺序 | 否 |