GROUP BY 子句用来对指定的字段做分组,产生一个汇总信息。
(1)group by语句对select后所选择的字段有一定的限制,即select后没有使用聚合函数的字段必须包含在group by 语句后面的结果集中。(GROUP BY 关键字后跟一个列的列表,称为组合列).
(2)不能对数据类型为 ntext、text、image 或 bit 的列使用 GROUP BY 或 HAVING语句。除非在返回的时候使用数据类型转换函数(SUBSTRING 和 CAST)将他们转换为其他数据类型。
(3)在 GROUP BY 语句中,必须指定表或视图列的名称,而不是使用 AS 子句指派的结果集列的名称。
(4)GROUP BY 语句中的空值,如果分组列包含一个空值则该行将成为结果中的一个组。如果分组列包含多个空值,则这些空值将放入一个组中。
(5)GROUP BY 语句中可以使用 ALL(可选)关键字,返回由GROUP BY 子句生成的所有组。即不受搜索条件的限制(也就是说此时搜索条件不起作用)。
(6)Where, Group By, Having, Order by的执行顺序
首先,WHERE 语句在表或视图中筛选满足条件的记录,然后Group By在WHERE结果集中按指定的列来分组,再按HAVING语句知道的条件筛选出满足条件的组作为结果集,最后按order by 指定的排序方法排序,将排序后的结果集作为最终结果呈现出来。
正是由于这样的执行顺序也就很容易理解为什么只有在ORDER BY语句中才能使用最终结果集中的列名。
(7)GROUP BY中的WHERE 和 HAVING 语句
A:WHERE 搜索条件在进行分组操作之前应用,不能使用聚合函数;而 HAVING 搜索条件在进行分组操作之后应用,可以使用聚合函数。
B:HAVING 语法与 WHERE 语法类似,但 HAVING 可以包含聚合函数。HAVING 子句可以引用选择列表中显示的任意项。
例: student表
DEPARTMENT | ID | NAME | GRADE |
A | 100 | SD | 50 |
A | 101 | SDD | 60 |
B | 102 | SSS | 70 |
B | 103 | DDDD | 80 |
(1) 统计每个系的人数
select DEPARTMENT, ID from student group by DEPARTMENT 是错误的
正确的是:
select DEPARTMENT, count (ID ) as sumcount from student group by DEPARTMENT
(2)