sql中group by 是啥意思啊?请教谢谢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql中group by 是啥意思啊?请教谢谢相关的知识,希望对你有一定的参考价值。

一般是从来对一些集合函数进行分组的。
例如
select count(UserId),UserClass from USERINFO group by userClass
这个语句就可以得到每个班级的人数
参考技术A group
by
语句用于结合合计函数,根据一个或多个列对结果集进行分组。
举几个简单例子
成绩表(姓名,课程,成绩)
1、去重复,同distinct、查找有多少个人的记录(按姓名分组、排重)
2、取每个人有多少条记录(按姓名分组、统计)
3、取有成绩记录为2条的人(按姓名分组、配合having使用)
4、取每个人的总成绩(按姓名分组、合计)
5、取每个人的最高成绩(按姓名分组、取最大max/最小min/平均avg值)
参考技术B group
by
分组
通用数据库具有基于表的特定列对数据进行分析的能力。
可按照在
GROUP
BY
子句中定义的组对行进行分组。以其最简单的形式,组由称为分组列的列组成。
SELECT
子句中的列名必须为分组列或列函数。列函数对于
GROUP
BY
子句定义的每个组各返回一个结果。下列示例产生一个列出每个部门编号的最高薪水的结果:
SELECT
DEPT,
MAX(SALARY)
AS
MAXIMUM
FROM
STAFF
GROUP
BY
DEPT
此语句产生下列结果:
DEPT
MAXIMUM
------
---------
10
22959.20
15
20659.80
20
18357.50
38
18006.00
42
18352.80
51
21150.00
66
21000.00
84
19818.00
注意:计算的是每个部门(由
GROUP
BY
子句定义的组)而不是整个公司的
MAX(SALARY)。

WHERE
子句与
GROUP
BY
子句一起使用
分组查询可以在形成组和计算列函数之前具有消除非限定行的标准
WHERE
子句。必须在GROUP
BY
子句之前指定
WHERE
子句。例如:
SELECT
WORKDEPT,
EDLEVEL,
MAX(SALARY)
AS
MAXIMUM
FROM
EMPLOYEE
WHERE
HIREDATE
>
'1979-01-01'
GROUP
BY
WORKDEPT,
EDLEVEL
ORDER
BY
WORKDEPT,
EDLEVEL
结果为:
WORKDEPT
EDLEVEL
MAXIMUM
--------
-------
-----------
D11
17
18270.00
D21
15
27380.00
D21
16
36170.00
D21
17
28760.00
E11
12
15340.00
E21
14
26150.00
注意:在
SELECT
语句中指定的每个列名也在
GROUP
BY
子句中提到。未在这两个地方提到的列名将产生错误。GROUP
BY
子句对
WORKDEPT

EDLEVEL
的每个唯一组合各返回一行。

GROUP
BY
子句之后使用
HAVING
子句
可应用限定条件进行分组,以便系统仅对满足条件的组返回结果。为此,在GROUP
BY
子句后面包含一个
HAVING
子句。
HAVING
子句可包含一个或多个用
AND

OR
连接的谓词。每个谓词将组特性(如
AVG(SALARY))与下列之一进行比较:
该组的另一个特性
例如:
HAVING
AVG(SALARY)
>
2
*
MIN(SALARY)
常数
例如:
HAVING
AVG(SALARY)
>
20000
例如,下列查询寻找雇员数超过
4
的部门的最高和最低薪水:
SELECT
WORKDEPT,
MAX(SALARY)
AS
MAXIMUM,
MIN(SALARY)
AS
MINIMUM
FROM
EMPLOYEE
GROUP
BY
WORKDEPT
HAVING
COUNT(*)
>
4
ORDER
BY
WORKDEPT
此语句产生下列结果:
WORKDEPT
MAXIMUM
MINIMUM
--------
-----------
-----------
D11
32250.00
18270.00
D21
36170.00
17250.00
E11
29750.00
15340.00
有可能(虽然很少见)查询有
HAVING
子句但没有
GROUP
BY
子句。在此情况下,DB2
将整个表看作一个组。因为该表被看作是单个组,所以最多可以有一个结果行。如果
HAVING
条件对整个表为真,则返回选择的结果(该结果必须整个由列函数组成);否则不返回任何行。

在SQL中分组查询 Group by 的存在条件是啥

在select 语句中 Group by的存在条件是什么 为什么数据库总是报这样的错误:消息 8120,级别 16,状态 1,第 1 行选择列表中的列 'userinfo.UserName' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。 请说的详细点,最好举个例子..谢谢

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

语法:

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

[ WITH ] ]

参数说明:

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提供的正常行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于指定分组列时所使用的顺序。更改分组列的顺序会影响在结果集内生成的行数。

使用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子句不能使用字段别名。
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语句如下:

use student

select 性别,年龄

from student

Group By 性别,年龄

在“student”表中,首先按照“性别”分组,然后再按照“年龄”分组。

再举一个例子,例如,在“grade”表中,按照“学号”和“课程代号”列进行分组。SQL语句如下:

use student

select 学号,课程代号 from grade Group By 学号,课程代号

按多列进行分组时有NULL组的是如何处理的。当表按多列进行分组时有NULL组,这时NULL被作为一个特定值处理,就像其他任何值一样。也就是说,如果在某个分组列中存在两个NULL,则按它们有相同的值那样处理,并将它们放在相同的组中。

示例:

在“grade”表中,按“学期”和“课程代号”列进行分组。在查询分析器中输入的SQL语句如下:

use student

select 学期,课程代号

from grade

Group By 学期,课程代号

3.与聚集函数一起使用

Group By子句是经常与聚集函数一起使用。如果SELECT子句中包含聚集函数,则计算每组的汇总值,当用户指定Group By时,选择列表中任一非聚集表达式内的所有列都应包含在Group By列表中,或者Group By表达式必须与选择列表表达式完全匹配。

示例:

在“student”表中,分别求男女生的平均年龄。在查询分析器中输入的SQL语句如下:

use student

select 性别,avg(年龄) as 平均年龄

from student

Group By 性别

例如,在“student”表中,分别求有多少个男生和女生。SQL语句如下:

use student

select 性别,count(性别) as 人数 from student Group By 性别

说明:关于聚合函数的详细讲解可参阅9.2.1节。

4.与HAVING子句一起使用

HAVING子句对Group By子句选择出来的结果进行再次筛选,最后输出符合HAVING子句中条件的记录。HAVING子句的语法与WHERE子句的语法相类似,惟一不同的是HAVING子句中可以包含聚合函数。

语法:

[HAVING <search_condition>]

参数说明:

<search_condition>:指定组或聚合应满足的搜索条件。当HAVING与Group By ALL一起使用时,HAVING 子句替代ALL。

示例:

在“student”表中,按“性别”分组求平均年龄,并且查询其平均年龄大于21的学生信息。在查询分析器中输入的SQL语句如下:

use student

select avg(年龄), 性别

from student

Group By 性别

having avg(年龄)>21

在“grade”表中,按“学期”分组求平均成绩,并且查询“平均成绩”大于93的课程信息。在查询分析器中输入的SQL语句如下:

use student

select 学期,avg(课程成绩) as 平均成绩

from grade

Group By 学期

having avg(课程成绩)>93

说明:HAVING查询条件是在进行分组操作之后才应用的;在HAVING子句中不能使用text、image和ntext 数据类型。

5.对统计结果进行排序

统计结果并不能保证结果集内记录按一定顺序排列,如果使用ORDER By子句,就可以使结果集中的结果按一定的顺序(升序、降序)排序。

示例:

在“student”表中,按“性别”和“年龄”列分组,并按“年龄”列降序排序。在查询分析器中输入的SQL语句如下:

use student

select 性别,年龄

from student

Group By 性别,年龄

order By 年龄 desc

例如,在“grade”表中,按“学号”分组,并按课程的“平均成绩”升序排序。SQL语句如下:

use student

select 学号,avg(课程成绩) as 平均成绩 from grade Group By 学号 order By 平均成绩
参考技术A 分组查询中:select后的字段必须是group by中包含的字段如下:
select userinfo.班级,count(userinfo.sex) from userinfo group by 班级,userinfo.sex;
语句的含义为:按照班级分组,统计每个班级的男、女总数本回答被提问者采纳
参考技术B 用group by时,当前查询语句中的select,只能包含分类的项和其他分类进行的聚合操作。
如果一个表里有,id,classid,money
数据有 1,101,34
2,101,23
1,102,39
应该用select classid ,sum(money) from table1 group by classid这样的。。如果在select 中加入id,那么一个101的classid对应2条数据,而求和后101应该只有一条数据,这本身就是个矛盾。
参考技术C 抱你sql语句贴出来看看分析下ok

以上是关于sql中group by 是啥意思啊?请教谢谢的主要内容,如果未能解决你的问题,请参考以下文章

SQL 子句“GROUP BY 1”是啥意思?

group by 两个 列 group by cola ,colb 是啥意思

sql语句中的groupby是啥意思?

SQL server PARTITION BY 是啥意思

SQL server PARTITION BY 是啥意思

groupby汉语是啥意思