SQL数据库—分组数据

一.Group By子句—数据分组
Group By的SQL语法:
Select column1,column2,…, count(*) as new column
from table1,table2,…
Group By column1,column2,..;

eg: Select SPID, NestLevel, ProcedureName, count(*) As num_logs
From Logs
Group By SPID, NestLevel, ProcedureName;
图1-1如下:
这里写图片描述
注意:上述Group By子句涉及基本的SQL的Select …From… 语句 , Count(*)函数以及我们刚刚接触的Group By子句。
Count( )函数在此语法中可以省略。
在使用Group By子句之前,要知道一些重要的规定:

 a. Group By子句可以包含任意数目的列,因而可以对分组进行嵌套,更细致的进行数据分组。
 b. 如果在Group By子句中嵌套了分组,数据将在最后指定分组上进行汇总。 换句话说,在建立分组时,指定所有列都一起计算(所以不能从个别的列取 回数据)。
 c. Group By子句中列出的每一列都必须是检索列或者有效的表达式(但不可是聚集函数)。如果在Select中使用表达式,则在Group By子句中使用相同的表达式。不可使用别名。
 d. 大多数SQL实现不允许Group By列带有长度可变的数据类型(如文本或备注型字段)。
 e. 除聚集计算语句外,Select语句中的每一列都必须在Group By子句中给出。
 f.若分组列中包含具有Null值的行,则Null将作为一个分组返回。若列中有多行Null值,他们将分为一组。
 g. Group By子句必须在Where子句之后,Order By子句之前。

二.过滤分组—Having
Where过滤行,Having过滤分组。
Having可以替代所有的Where操作符。
Where子句用于标准的行级别过滤,Having子句通常和Group By子句一起使用。
Having和Where也可以在同一条SQL语句中使用。
Where和Having的区别:
Where在数据分组之前过滤,Having在数据分组之后进行过滤。Where排除的行不包括在分组中。这可能会改变计算值,从而影响在Having子句中基于这些值过滤掉的分组。
SQL语法:
Select coulnn1,column2,…
From table1,table2,…
Where 条件语句————可选)
Group By colnum1,column2,…
Having 条件语句;

eg: Select NestLevel, ProcedureName, SPID
From Logs
Group By NestLevel,ProcedureName,SPID
Having SPI<=50;
这里写图片描述

三. 分组和排序
Order By 和Group By的区别见下表1-1:
这里写图片描述
注意:一般在使用Group By子句时,也应该给出Order By子句,这是办证数据正确排序的唯一方法。
SQL语法:
Select column1,cloumn2,…
From table1, table2,…
Group By colunm1, column2,…
Having 条件语句
Order By column_x;

eg: Select NestLevel, ProcedureName, SPID
From Logs
Group By NestLevel, ProcedureName, SPID
Having SpID<=50
Order By SPID;
这里写图片描述

Select子句顺序:
Select->From->Where->Group By->Having->Order By
见表1-2:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Lemon_jia/article/details/82151577