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
这样语句就能正常执行了,如下图:
我是人民邮电出版社签约作者,如果觉得以上回答对您有所帮助,请点个赞并关注我吧,也期待与各位留言交流,谢谢!