「SQL基础篇」分组查询

在上一篇文章中,我介绍了如何使用SQL聚合函数对数据进行汇总,包括统计行数、求和、计算平均值以及查找最大值和最小值。
不过,到目前为止,已经对所有记录或者满足WHERE子句条件的记录进行了聚合操作。
例如查询供应商DLL01提供的产品数量。
聚合查询结果:查询每个供应商的可用产品数量,需要使用分组聚合功能。
分组允许您将数据划分为逻辑组并分别对每个组执行聚合计算。
1、创建分组聚合组的操作是通过SELECT语句的GROUPBY子句实现的。
以下是产品信息表的示例。
以下SQL语句返回每个供应商提供的产品总数。
分组查询结果:上面的SELECT语句除了返回的计算字段之外,总共返回2列。
聚合函数,SELECT语句后面的每一列都必须在GROUPBY子句中指定。
GROUPBY子句指示DBMS按vend_id对数据进行排序和分组,然后聚合每个组而不是整个数据集。
提示:GROUPBY子句可以包含多个列,从而允许嵌套分组。
此外,如果分组字段包含NULL值,则NULL将作为组返回。
即多个NULL值被分组在一起。
2.过滤分组当您使用GROUPBY对记录进行分组时,您还可以使用SQL来过滤分组。
也就是说,您指定要包含哪些组以及要排除哪些组。
例如,您可能只想列出提供多种产品的供应商以及他们提供的这些产品的数量。
其中,过滤条件为“供货数量大于2”,条件中的“供货数量”是分组聚合创建的计算字段,因此不能使用WHERE子句。
WHERE子句过滤非组行。
为了实现这一点,SQL在过滤器组中提供了HAVING子句,并且HAVING支持所有WHERE运算符。
接下来,我们查询供应两种或两种以上产品的供应商以及他们供应的产品数量。
过滤分组后的查询结果:与之前的结果相比,产品数量为2的供应商信息经过了HAVING过滤。
提示:“WHERE过滤行,HAVING过滤组”表示分组前进行WHERE过滤,分组后进行HAVING过滤。
以下SQL搜索拥有两种或多种价格大于或等于4的产品的供应商。
查询结果:3.SELECT子句顺序到目前为止我们已经学习了很多SELECT子句。
下面我将总结到目前为止我们所学的SELECT子句并解释它们在SQL中的顺序。
表中子句的顺序是它们在SQL语句中出现的顺序。
使用前面的示例,我们搜索拥有多种产品且价格为4或更多的供应商以及他们提供的产品数量。
搜索应按产品数量升序排序。
查询结果:这就是本文的全部内容了~你学习了如何使用GROUPBY子句汇总和计算多个组中的数据,如何返回每个组的结果,以及如何使用HAVING子句过滤组。

各位高手能告诉我SQL中的GroupBy的查询过程多列分组的查询过程是怎样的!

GroupBy子句GroupBy子句可以将表的行分为不同的组。
分别放大每个组,以便您可以控制所看到的细节级别。
语法:[GroupBy[ALL]Group_By_expression[,...n][with{CUBE|ROLLUP}]]参数说明:ALL:包含所有组和结果,包括那些没有顺序满足WHERE子句并杀死结果的查询。
如果指定ALL,则对于不满足搜索条件的范围内的汇总列,将返回空值。
不能使用CUBE或ROLLUP运算符定义ALL。
如果查询中有访问远程表的子句,则不提供GroupByALL操作。
Group_By_expression:形成组的表达式。
Group_By_表达式也称为连接列。
Group_By_expression可以是列或应用于该列的非聚合表达式。
在选择列表中定义的列的别名不能用于定义连接列。
对于不包含CUBE或ROLLUP的GroupBy子句,Group_By_表达式中的项数是查询中GroupBy列、聚合列和聚合值的大小。
该限制从保存中间查询结果所需的中间任务的8060字节限制开始。
如果指定了CUBE或ROLLUP,则它是10个耦合表达式中最大的一个。
CUBE:指定结果集不仅包含GroupBy提供的普通行,还包含汇总行。
返回事件集中所有可能的组和子组组合的GroupBy摘要中的顺序。
GroupBy摘要行在结果中显示为“无”,但可用于表示所有值。
使用关联函数判断GroupBy汇总值中的值是否设置为null。
建议系列中的汇总行数取决于GroupBy子句中包含的列数。
GroupBy成员中的每个操作数(列)都绑定在空框架下,并且聚合应用于所有其他操作数(列)。
由于CUBE返回每个可能的聚合和子组,因此无论指定耦合列的顺序如何,行数都是相同的。
ROLLUP:指定效果集不仅包含GroupBy提供的普通行,还包含汇总行。
组按照组内从最低级别到最高级别的层次顺序进行分组。
组的层次结构取决于指定列组的顺序。
更改列的分组顺序会影响结果集中生成的行数。
使用GroupBy子句时需要注意的事项。
(1)selectlist子句中,除了聚合函数外,出现的其他字段必须在GroupBy子句中定义。
例如,“GroupByA,B”与“SELECTSUM(A),C”有问题,因为C不在GroupBy中,但SUM(A)可以。
(2)聚合函数不能在select子句的列表中,但至少必须使用GroupBy列表的成员之一。
例如“GroupByA,B,C”,然后“SELECT”即可。
(3)在SQLServer中,text、ntext和image格式字段不能作为GroupBy框架中子句的基础。
(4)GroupBy子句中不能使用字段别名。
1.对单个列进行排序GroupBy子句可以根据特定列的值将数据集合分为多个组。
示例:“学生”表根据一列“性别”。
在查询分析器中输入的SQL语句如下:usestudentselectorsexabstudentGroupBygender。
例如,此问题不正确,因为“name”列未包含在GroupBy子句或聚合函数中。
下面是一个错误的SQL语句:usestudentsselectname,classfromstudentGroupBysex。
下面的SQL语句是:semesterusestudnetselectfromgradeGroupByseasonII。
按多列排序GroupBy子句可用于根据多个指定列的值将数据集合分为多个组。
示例:在“学生”表中,对“性别”和“年龄”列进行分组。
分析查询使用的SQL语句如下:typeuserselect,agefromStudentsGroupBytype,age。
例如,在“级别”表中,有“学生人数”和“课程”列。
SQL语句为:usestudentsselect学号,课程代码fromgradeGroup按学号,课程代码多列连接时不处理组。
当表由多列连接且没有按钮时,null将被视为特定值,就像任何其他值一样。
也就是说,如果聚合列中有两个空值,则将它们视为具有相同的值并将它们放在同一组中。
示例:在“学位”表中,有“学期”和“课程代码”列。
查询分析器中的SQL语句写法如下:usesudentselect学期,课程代码fromgradeGroupBy学期,课程代码三。
使用聚合函数GroupBy子句通常与聚合函数一起使用。
如果SELECT子句中包含聚合函数,则计算每组的总值。
当用户指定GroupBy时,选择列表中任何非聚合表达式内的所有列都必须包含在GroupBy列表或GroupBy表达式中。
必须与选择列表中的表达式完全相同。
示例:在“学生”表中分别找出男女学生的平均年龄。
查询分析器中输入的SQL语句为:ususeselectorclass,avg(age)asAverageAgefromStudentsGroupBysexSQL语句是这样的:ususestudentselectclass,count(gender)numberofStudentsfromStudentGroupByclass注:关于aggregate的详细解释函数,请参阅第9.2.1节。
4.与having子句一起使用,对GroupBy子句选择的结果进行重新过滤,最终显示满足having子句中条件的表。
HAVING子句的语法与WHERE子句的语法类似。
唯一的区别是HIS子句可以包含聚合函数。
语法:[HABP]参数说明::指定匹配组或聚合的搜索条件。
当having与GroupByALL一起使用时,该子句将替换ALL。
例如:在“学生”表中,按“性别”分组,查找平均年龄,搜索平均年龄大于21岁的学生信息。
分析器查询中编写的SQL语句如下:userstudentselectavg(age),classfromstudentGroupBysexhavingavg(age)>21在“grade”表中,按“学期”查找该组的平均成绩,搜索“grade”Average""主修课程数据93.分析查询时使用的SQL语句为:userstudentselectseason,avg(课程成绩)作为成绩平均fromgradeGroupBy学期habensavg(运行级别)>93注意:QUOS条件在使用text、image和ntext数据类型后应用:在“student”表中,按“gender”和“age”列分组,并按“age”排序“查询分析器中的column.SQL语句这样输入:类型userselector,年龄来自studentsGroupBy类型,年龄班级年龄降序课程升序。
SQL语句如下:userstudentselect学生人数,avg(课程成绩)作为成绩平均值fromgradeGroup按学号orderBy成绩平均值