SQL中的Group By 语句

上一篇 / 下一篇  2009-12-09 09:35:00

Group By子句可以将表的行划分为不同的组。分别总结每个组,这样就可以控制想要看见的详细信息的级别,下面详细介绍group by的用法。

1、语法

[ Group By [ ALL ] Group_By_expression[ ,...n ]

[ WITH { CUBE | ROLLUP } ] ]

参数说明:

ALL:包含所有组和结果集,甚至包含那些任何行都不满足WHERE子句指定的搜索条件的组和结果集。如果指定了ALL,将对组中不满足搜索条件的汇总列返回空值。不能用CUBE或ROLLUP运算符指定ALL。如果访问远程表的查询中有WHERE子句,则不支持Group By ALL操作。

Group_By_expression:对其执行分组的表达式。Group_By_expression也称为分组列。Group_By_expression可以是列或引用列的非聚合表达式。在选择列表内定义的列的别名不能用于指定分组列。对于不包含CUBE或ROLLUP的Group By子句,Group_By_ expression的项数受查询所涉及的Group By列的大小、聚合列和聚合值的限制。该限制从8060字节的限制开始,对保存中间查询结果所需的中间级工作表有8060字节的限制。如果指定了CUBE或ROLLUP,则最多只能有10个分组表达式。

CUBE:指定在结果集内不仅包含由Group By提供的正常行,还包含汇总行。在结果集内返回每个可能的组和子组组合的Group By汇总行。Group By汇总行在结果中显示为NULL,但可用来表示所有值。使用GroupING函数确定结果集内的空值是否是Group By汇总值。结果集内的汇总行数取决于Group By子句内包含的列数。Group By子句中的每个操作数(列)绑定在分组NULL下,并且分组适用于所有其他操作数(列)。由于CUBE返回每个可能的组和子组组合,因此,不论指定分组列所使用的是什么顺序,行数都相同。

ROLLUP:指定在结果集内不仅包含由Group By提供的正常行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于指定分组列时所使用的顺序。更改分组列的顺序会影响在结果集内生成的行数。

2、使用Group By子句的注意事项

(1) 在SELECT子句的字段列表中,除了聚集函数外,其他所出现的字段一定要在Group By子句中有定义才行。例如"Group By A,B",那么"SELECT SUM(A),C"就有问题,因为C不在Group By中,但是SUM(A)是可以的。

(2) SELECT子句的字段列表中不一定要有聚集函数,但至少要用到Group By子句列表中的一个项目。例如"Group By A,B,C",则"SELECT A"是可以的。

(3) 在SQL Server中text、ntext和image数据类型的字段不能作为Group By子句的分组依据。

(4) Group By子句不能使用字段别名。

(5) 当group by 后面还有 order by时,order by 中的字段也要在 group by 后面出现,否则sql 也会报错。

3、简单示例
1.按单列进行分组

Group By子句可以基于指定某一列的值将数据集合划分为多个分组,同一组内所有记录在分组属性上具有相同值。

示例:

把"student"表按照"性别"这个单列进行分组。在查询分析器中输入的SQL语句如下:

use student

select 性别

from student

Group By 性别

但仍然要强调SELECT子句必须与Group By后的子句或者是分组函数列相一致。

例如,由于下列查询中"姓名"列既不包含在Group By子句中,也不包含在分组函数中,所以是错误的。错误的SQL语句如下:

use student select 姓名,性别 from student Group By 性别

例如,在"grade"表中,按"学期"分组查询。SQL语句如下:

use studnet select 学期 from grade Group By 学期

2.按多列进行分组

Group By子句可以基于指定多列的值将数据集合划分为多个分组。

示例: 在"student"表中,按照"性别"和"年龄"列进行分组。在查询分析中输入的SQL语。

3、group by 与where、 having 联合使用 示例

sql中group by及having的用法
SELECT AVG(ticket_key) , ticket_title
FROM srweb_ticket_ticket
GROUP BY ticket_title

以上这句是按照投票的标题排序,体现在GROUP BY ticket_title,执行完上序之后得出如下的结果
328 苹果
328 葡萄
327 西瓜

如果加上having条件的话会出现如下的结果,having是出现在group by之后的条件的
SELECT AVG(ticket_key) , ticket_title
FROM srweb_ticket_ticket
GROUP BY ticket_title having AVG(ticket_key)>327

328 苹果
328 葡萄

如果再加上where条件的话会出现下面的结果
SELECT AVG(ticket_key) , ticket_title
FROM srweb_ticket_ticket
where ticket_title not in('葡萄') GROUP BY ticket_title having AVG(ticket_key)>327

328 苹果

总结:当sql中既有where又有having 时,首先执行where条件去掉一些不满足条件的数据,然后通过group by按照进行分组运算,之后通过having在分组的基础上去掉一些不满足条件的数据。


TAG:

 

评分:0

我来说两句

Open Toolbar