group by的理解

来源:互联网 发布:java工程师自我评价 编辑:程序博客网 时间:2024/05/07 09:02

group by一般用于对数据集进行分组然后多组内多行数据的其他字段进行比如计算行数,计算最大值最小值的操作,比如在很多地方我们会看到下面的例子:

如果我们想知道每个国家有多少种水果,那么我们可以通过如下SQL语句来完成:


SELECT COUNT(*)  AS  水果种类,  ProductPlace  AS  出产国
FROM  T_TEST_FRUITINFO
GROUP  BY  ProductPlace


这个SQL语句就是使用了Group By + 分组字段的方式,那么这句SQL语句就可以解释成“我按照出产国家(ProductPlace)将数据集进行分组,然后分别按照各个组来统计各自的记录数量。”很好理解对吧。这里值得注意的是结果集中有两个返回字段,一个是ProductPlace(出产国), 一个是水果种类。如果我们这里水果种类不是用Count(*),而是类似如下写法的话:


SELECT FruitName,ProductPlaceFROM T_TEST_FRUITINFO GROUP BY ProductPlace


那么SQL在执行此语句的时候会报如下的类似错误:


选择列表中的列'T_TEST_FRUITINFO.FruitName'无效,因为该列没有包含在聚合函数或GROUPBY子句中。


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