一些重要规定

  1. GROUP BY 子句可以包含任意数目的列,使得能对数据分组进行嵌套。
  2. 若在GROUP BY子句嵌套了分组,则数据将在最后规定的分组上进行分组。即建立分组时所有的列一起算。
    3.GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(不可以是聚集函数),如果在Select中使用表达式,则必须在GROUP BY中使用相同表达式,不可用别名。
  3. 除聚集计算语句以外,SELECT语句中每个列都必须在GROUP BY中给出(关于此条,下面会给出具体例子和这样规定的原因)
  4. GROUP BY必须出现在Where之后和Order By之前

对于下表Test

sql server groupby用法 sql group by用法示例_Group


我们执行如下sql语句

SELECTCOUNT(*) AS 水果种类,ProductPlace AS 出产国
FROM Test
GROUP BY ProductPlace

会按照出产国家(ProductPlace)将数据集进行分组,然后分别按照各个组来统计各自的记录数量。最后会有两个返回字段,一个是ProductPlace(出产国), 一个是水果种类。

但是如果使用下列sql语句则会报错

SELECT FruitName,ProductPlace//FruitName并未出现在Group By子句中
FROM Test
GROUP BY ProductPlace

这是我们需要注意的一点,如果用Select选择某个字段,那么这个字段要么在Group By子句中,作为分组的依据;要么就要在聚合函数中。

我们可以将Group By操作想象成如下的一个过程,首先系统根据SELECT 语句得到一个结果集,如最开始的那个水果、出产国家、单价的一个详细表。然后根据分组字段,将具有相同分组字段的记录归并成了一条记录。这个时候剩下的那些不存在于Group By语句后面作为分组依据的字段就有可能出现多个值,但是目前一种分组情况只有一条记录,一个数据格是无法放入多个数值的,所以这里就需要通过一定的处理将这些多值的列转化成单值,然后将其放在对应的数据格中,那么完成这个步骤的就是聚合函数。这就是为什么这些函数叫聚合函数(aggregate functions)了。

如下图

sql server groupby用法 sql group by用法示例_sql_02

我们可以Select ProductPlace,因为每个元组都是一个值,但是FruitName却不可以,每个元组可能存在多值,sql不允许这样使用。可以用聚集函数将多个值合并。

最后,GROUP BY和ORDER BY的一点区别。
ORDER BY子句中式可以存在不非选择的列,这是合法的,将会按照这个列的顺序进行排序。