【SQL】分组数据,过滤分组-group by , having
2017-07-17 11:10
375 查看
学习笔记,原文来自http://blog.csdn.net/robinjwong/article/details/24845125
一些规定:
GROUP BY 子句可以包含任意数目的列,这使得能对分组进行嵌套,为数据分组提供更细致的控制;
如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总;
GROUP BY子句中列出的每个列都必须是检索列或有效的表达式。如果在SELECT中使用表达式,则必须在GROUP BU子句中指定相同的表达式,不能使用别名;
大多数SQL实现不允许GROUP BU列带有长度可变的数据类型(如文本或备select departmentid, departmentname from basicdepartment group by departmentid;注型字段);
除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出;
如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组;
GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前;
WHERE过滤行,而HAVING过滤分组。HAVING支持所有WHERE操作符,HAVING子句中能使用聚集函数。WHERE在数据分组前进行过滤。HAVING在数据分组后进行过滤。WHERE排除的行不包括在分组中。
千万不要仅依赖GROUP BY排序数据。
1 YY 90
1 SX 98
1 YW 95
2 YY 92
2 SX 91
2 YW 89
3 YY 96
3 SX 88
3 YW 85
4 YY 88
4 SX 89
4 YW 95
1. 显式90分以上学生的课程名和成绩
(不涉及分组计算,[b]数据块是原始表就行)[/b]
select * from sc where GRADE >= 90
2. 显式每个学生的成绩在90分以上的各有多少门
(涉及到分组计算,单独计算的数据快为每个学生,数据块整体没有要求(因此没有having),但是提前需要用where过滤)select SNO, count(*) from sc where GRADE >= 90 group by SNO
3. 至少有两门课程在90分以上的学生号及90分以上的课程数 (过滤分组)
(涉及到分组计算,同时数据库也有要求)
select SNO, count(*) from sc where GRADE >= 90 group by SNO having count(*) >= 2
[b]4. 选出平均成绩大于90分,且语文必须在95以上的学生[/b]
(涉及到分组计算,且之前有过滤)
select SNO, avg(GRADE)
from sc
where SNO in (select SNO from sc where PNO = 'YW' and GRADE >= 95)
group by SNO
having avg(GRADE) >= 90
创建分组 - GROUP BY
分组是在SELECT语句的GROUP BY子句中建立的。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。SELECT子句中的列名必须为分组列或列函数,列函数对于GROUP BY子句定义的每个组各返回一个结果。一些规定:
GROUP BY 子句可以包含任意数目的列,这使得能对分组进行嵌套,为数据分组提供更细致的控制;
如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总;
GROUP BY子句中列出的每个列都必须是检索列或有效的表达式。如果在SELECT中使用表达式,则必须在GROUP BU子句中指定相同的表达式,不能使用别名;
大多数SQL实现不允许GROUP BU列带有长度可变的数据类型(如文本或备select departmentid, departmentname from basicdepartment group by departmentid;注型字段);
除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出;
如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将分为一组;
GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前;
过滤分组 - HAVING
除了能用GROUP BY分组数据外,SQL还允许过滤分组,规定包括哪些分组,排除哪些分组。例如,可能想要列出至少有两个订单的所有顾客,为了得出这种数据,必须基于完整的分组而不是个别的行进行过滤。WHERE过滤行,而HAVING过滤分组。HAVING支持所有WHERE操作符,HAVING子句中能使用聚集函数。WHERE在数据分组前进行过滤。HAVING在数据分组后进行过滤。WHERE排除的行不包括在分组中。
分组 V.S. 排序 - GROUP BY V.S. ORDER BY
ORDER BY | GROUP BY |
排序产生的输出 | 分组行,但输出可能不是分组的顺序 |
任意列都可以使用 | 只可能使用选择列或表达式列,而且必须使用每个选择列表达式 |
不一定需要 | 如果与聚集函数一起使用列,则必须使用 |
示例
下表:学生号(SNO),课程名(PNO),成绩(GRADE)1 YY 90
1 SX 98
1 YW 95
2 YY 92
2 SX 91
2 YW 89
3 YY 96
3 SX 88
3 YW 85
4 YY 88
4 SX 89
4 YW 95
1. 显式90分以上学生的课程名和成绩
(不涉及分组计算,[b]数据块是原始表就行)[/b]
select * from sc where GRADE >= 90
2. 显式每个学生的成绩在90分以上的各有多少门
(涉及到分组计算,单独计算的数据快为每个学生,数据块整体没有要求(因此没有having),但是提前需要用where过滤)select SNO, count(*) from sc where GRADE >= 90 group by SNO
3. 至少有两门课程在90分以上的学生号及90分以上的课程数 (过滤分组)
(涉及到分组计算,同时数据库也有要求)
select SNO, count(*) from sc where GRADE >= 90 group by SNO having count(*) >= 2
[b]4. 选出平均成绩大于90分,且语文必须在95以上的学生[/b]
(涉及到分组计算,且之前有过滤)
select SNO, avg(GRADE)
from sc
where SNO in (select SNO from sc where PNO = 'YW' and GRADE >= 95)
group by SNO
having avg(GRADE) >= 90
相关文章推荐
- 【SQL】分组数据,过滤分组-group by , having
- 6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化
- 组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化 .
- sql数据分组,过滤分组,group,having,排序
- sql中having关键字和where关键字用来过滤数据区别
- SQL 数据库 学习 028 查询-11 having --- 对分组之后的信息进行过滤
- Oracle数据分组:group by,having,rollup,cube,grouping sets
- 利用 GROUP BY 和 MAX 实现对表数据分组统计后的过滤查询(Oracle920)
- 对group by的结果集进行分组过滤 where 与 having 用法的区别
- 数据库中Having放在分组函数group by后过滤查询组
- 6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化
- sql, group by 对数据进行分组
- 十三章 分组数据 GROUP BY ,HAVING
- Excel 中使用SQL 语句查询数据(八)-----用Group by 进行分组统计
- SQL---DML---分组数据GROUP BY, HAVING子句总结
- MySQL必知必会(数据分组,Group by和Having子句, Select子句的顺序)
- MySQL学习足迹记录11--分组数据--GROUP BY,HAVING
- Mysql数据分组GROUP BY 和HAVING,与WHERE组合使用