【SQL】分组数据,过滤分组-group by , having
学习笔记,原文来自http://blog.csdn.net/robinjwong/article/details/24845125
创建分组 - 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 |
排序产生的输出 | 分组行,但输出可能不是分组的顺序 |
任意列都可以使用 | 只可能使用选择列或表达式列,而且必须使用每个选择列表达式 |
不一定需要 | 如果与聚集函数一起使用列,则必须使用 |
千万不要仅依赖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分以上学生的课程名和成绩
(不涉及分组计算,数据块是原始表就行)
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
4. 选出平均成绩大于90分,且语文必须在95以上的学生
(涉及到分组计算,且之前有过滤)
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
转载于:https://www.cnblogs.com/coskaka/p/7193360.html
【SQL】分组数据,过滤分组-group by , having相关推荐
- 【4 - 分组】Sql Server - 郝斌(分组group by、过滤having、聚合函数max() / count()、排序order by、select语句的执行顺序)
课程地址:数据库 SQLServer 视频教程全集(99P)| 22 小时从入门到精通_哔哩哔哩_bilibili 目录 group by(分组) group by a,b 的用法 having( ...
- 零基础学SQL(九、分组 GROUP BY)
目录 前置建表 编辑 一.分组的概念 二.分组案例 三.分组的过滤HAVING子句 前置建表 CREATE TABLE student (id int NOT NULL AUTO_INCREMENT ...
- SQL语句之分组查询--GROUP BY(group by)
SQL语句之分组查询–GROUP BY(group by) 语法 select 聚合函数,列(要求出现在group by的后面)from 表where 筛选条件group by 分组的列表order ...
- 使用SQL语句中的Group by分组并计算每组的数量
在SQL语句中,Group by一般用来做分组统计使用,在实际的开发中我们可能会遇到不仅需要分组,还需统计出每组的数量条数,那这时候可以结合count函数来一起使用即可完成此项操作,最后的结果展示出所 ...
- SQL语句之分组,查询和连接
一.分组 把具有相同的数据值的行放在同一组中. 可以对同一分组数据使用汇总函数进行处理,例如求分组数据的平均值等. 指定的分组字段除了能按该字段进行分组,也会自动按该字段进行排序. SELECT co ...
- 10、 HAVING:过滤分组
在 MySQL 中,可以使用 HAVING 关键字对分组后的数据进行过滤. 使用 HAVING 关键字的语法格式如下: HAVING <查询条件> HAVING 关键字和 WHERE 关键 ...
- mysql 分组group
分组查询就是将查询结果按照指定字段进行分组,字段中数据相等的分为一组. 分组查询基本的语法格式如下: GROUP BY 列名 [HAVING 条件表达式] [WITH ROLLUP] 列名: 是指按照 ...
- SQL语法之分组函数,分组查询(进阶5)and连接查询(sql92语法进阶6)
SQL语法体系学习笔记 SQL语法之基础查询(进阶1)and条件查询(进阶2) SQL语法之排序查询(进阶3)and常见函数(进阶4) SQL语法之分组函数,分组查询(进阶5)and连接查询(sql9 ...
- SQL Server 数据分组
目录 Group By 语句 Group By 子句与聚合函数 Having 子句 Group By语句 Group By 从字面意义上理解就是根据"By"指定的规则对数据进行分组 ...
最新文章
- 如何区分山寨版网管软件
- StringUtils之equals
- Bag of Word
- 基本粒子群算法(PSO)的改进
- xFire客户端代码
- mysql 批量增加字段命令_sql使用命令批量给一个表添加字段
- 学习MongoDB 十一: MongoDB聚合(Aggregation Pipeline基础篇上)(三)
- for遍历和foreach遍历的一个细小差别
- 【Blog.Core重要升级】:封装服务扩展层
- java如何实现e的次方_Java开发如何更改MySQL数据库datadir目录之MySQL数据库索引实现...
- Uber如何使用go语言创建高效的查询服务
- C#中Invoke 和 BeginInvoke 的区别
- SharePoint 2010新特性Ribbon
- 鼠标右键快速连接wifi
- RMDB与hadoop的实时整合
- mfc c++string、char与char*之间的关系
- 流畅的Python(1)- 一摞Python风格的纸牌
- 怎样批量缩小图片大小kb?图片怎么批量压缩?
- fc安卓模拟器_[10月26号]VirtuaNES FC游戏模拟器:附300个无敌版Roms游戏!非常受欢迎的FC游戏模拟器...
- 有哪些有用的人际交往小常识?
热门文章
- linux压缩、解压操作
- jQuery 一些小技巧
- ibatis中的xml配置文件
- windows+nginx负载测试
- Ext 3.0 +ASP.NET2.0 可视化开发介绍
- js中写java集合代码,JS实现JAVA的List功能
- 函数名/函数地址/函数指针
- Edmonds_Karp 算法 (转)
- 转动风车java_java实现-图的相关操作
- 安装mysql显示有5.0_安装MySQL5.0时到如图这一步提示出错了,~