group by在sql中怎么使用?

网友解答: group by在SQL语句中用于指定分组。说起来虽然只有一句话,但应用起来还是很有讲究的。例如,有下面的“订单”表,全部数据共216行:未使用聚合函数的分组当没有使用聚合函

网友解答:

group by在SQL语句中用于指定分组。说起来虽然只有一句话,但应用起来还是很有讲究的。

例如,有下面的“订单”表,全部数据共216行:

未使用聚合函数的分组

当没有使用聚合函数进行分组时,其效果相当于同类项合并,也就是类似于distinct的效果。例如,下面的两条语句,执行效果是完全一样的,都是用于提取产品、客户列的不重复记录:

select distinct 产品,客户 from 订单

select 产品,客户 from 订单 group by 产品,客户

使用聚合函数的分组

凡是select中没有出现在group by子句里的所有列,都必须使用聚合函数。

例如,下面语句中的数量列既没有使用聚合函数,也没有用在分组中,因此,该语句在执行时将出错:

select 产品,客户,数量 from 订单 group by 产品,客户

正确的写法应该是:

select 产品,客户,sum(数量) from 订单 group by 产品,客户

再如,对表达式列进行统计计算:

select 产品,客户,sum(数量) as 总量,sum(单价*折扣*数量) as 总额 from 订单 group by 产品,客户

按产品列进行分组,统计每组中的记录数:

select 产品,count(*) as 记录条数 from 订单 group by 产品

这个count聚合函数中的*也可以换成某个指定的列名。例如:

select 产品,count(客户) as 记录条数 from 订单 group by 产品

请注意,这样得到的统计结果和count(*)得到的结果可能并非完全一致:count(*)仅统计数据记录的行数,不会读取列中的任何数据,因此执行效率非常高;而count(客户)在统计时会判断该列中的值,一旦出现空值就会剔除该行。也就是说,count(客户)统计的记录数是不会包括指定列内容为空的记录行的。

分组依据可以是具体的列,也可以是表达式

例如,订单表中并没有单独的年份列,我们可以使用表达式来实现按年分组:

select 客户,year(日期) as 年,sum(数量) as 总量 from 订单 group by 客户,year(日期)

其中,Year就是SQL中用于获取年份的函数。

分组依据和最终返回的列并不是完全对应的

仍以上一行语句为例,尽管该语句按“客户”和“year(日期)”分组,但它们并不一定要必须返回。例如,将其改成这样也是可以的:

select 客户,sum(数量) as 总量 from 订单 group by 客户,year(日期)

返回的总量数据仍然不变,记录数也不变,只是没有了年份列,数据查看起来比较费劲而已。

再比如,这里的分组用的是“year(日期)”,我们还可以将输出的年份列内容改成这样的表达式:

select 客户,cstr(year(日期))+'年' as 年份,sum(数量) as 总量 from {订单} group by 客户,year(日期)

由于“year(日期)”获取的数据是整数,如果要在它后面加上其它字符,就必须先将其转为字符串形式,这里的CStr就是SQL中用于将其它类型数据转为字符的函数。请注意,不同的数据库,转换函数是不一样的,CStr是Access数据库中的用法,SQLServer用的是convert。

聚合函数可以用在没有指定分组的select语句中

对于这样的语句,所有的列表达式都必须使用聚合函数,否则会出现错误。例如:

select sum(单价*折扣*数量) as 总额 from 订单 where 产品='PD05'

这样得到的结果就只有一条统计行,因为没有指定分组列。

where和group by有着严格的顺序要求,且聚合函数不能用于where中

当一个select语句中既有where又有group by时,where必须写在前面,group by写在后面,这种顺序是有严格要求的,不能搞错!而当需要使用聚合函数作为查询条件时,必须使用having代替where。

例如,下面的SQL语句执行效果:

这是对产品为“PD05”的所有记录按照“客户”所进行的分组统计。如果希望仅返回总量大于2000的记录,怎么办?可以这样在where中设置吗?

select 客户,sum(数量) as 总量 from 订单 where 产品='PD05' and sum(数量)2000 group by 客户

结果出现执行错误。这是因为,where中不能使用聚合函数!

如要使用聚合函数作为数据查询条件,必须将其以having跟在group by的后面。例如:

select 客户,sum(数量) as 总量 from 订单 where 产品='PD05' group by 客户 having sum(数量)2000

这样语句就能正常执行了,如下图:

我是人民邮电出版社签约作者,如果觉得以上回答对您有所帮助,请点个赞并关注我吧,也期待与各位留言交流,谢谢!

标签: