学习笔记,原文来自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相关推荐

  1. 【4 - 分组】Sql Server - 郝斌(分组group by、过滤having、聚合函数max() / count()、排序order by、select语句的执行顺序)

    课程地址:数据库 SQLServer 视频教程全集(99P)| 22 小时从入门到精通_哔哩哔哩_bilibili ​ 目录 group by(分组) group by a,b 的用法 having( ...

  2. 零基础学SQL(九、分组 GROUP BY)

    目录 前置建表 ​编辑 一.分组的概念 二.分组案例 三.分组的过滤HAVING子句 前置建表 CREATE TABLE student (id int NOT NULL AUTO_INCREMENT ...

  3. SQL语句之分组查询--GROUP BY(group by)

    SQL语句之分组查询–GROUP BY(group by) 语法 select 聚合函数,列(要求出现在group by的后面)from 表where 筛选条件group by 分组的列表order ...

  4. 使用SQL语句中的Group by分组并计算每组的数量

    在SQL语句中,Group by一般用来做分组统计使用,在实际的开发中我们可能会遇到不仅需要分组,还需统计出每组的数量条数,那这时候可以结合count函数来一起使用即可完成此项操作,最后的结果展示出所 ...

  5. SQL语句之分组,查询和连接

    一.分组 把具有相同的数据值的行放在同一组中. 可以对同一分组数据使用汇总函数进行处理,例如求分组数据的平均值等. 指定的分组字段除了能按该字段进行分组,也会自动按该字段进行排序. SELECT co ...

  6. 10、 HAVING:过滤分组

    在 MySQL 中,可以使用 HAVING 关键字对分组后的数据进行过滤. 使用 HAVING 关键字的语法格式如下: HAVING <查询条件> HAVING 关键字和 WHERE 关键 ...

  7. mysql 分组group

    分组查询就是将查询结果按照指定字段进行分组,字段中数据相等的分为一组. 分组查询基本的语法格式如下: GROUP BY 列名 [HAVING 条件表达式] [WITH ROLLUP] 列名: 是指按照 ...

  8. SQL语法之分组函数,分组查询(进阶5)and连接查询(sql92语法进阶6)

    SQL语法体系学习笔记 SQL语法之基础查询(进阶1)and条件查询(进阶2) SQL语法之排序查询(进阶3)and常见函数(进阶4) SQL语法之分组函数,分组查询(进阶5)and连接查询(sql9 ...

  9. SQL Server 数据分组

    目录 Group By 语句 Group By 子句与聚合函数 Having 子句 Group By语句 Group By 从字面意义上理解就是根据"By"指定的规则对数据进行分组 ...

最新文章

  1. 如何区分山寨版网管软件
  2. StringUtils之equals
  3. Bag of Word
  4. 基本粒子群算法(PSO)的改进
  5. xFire客户端代码
  6. mysql 批量增加字段命令_sql使用命令批量给一个表添加字段
  7. 学习MongoDB 十一: MongoDB聚合(Aggregation Pipeline基础篇上)(三)
  8. for遍历和foreach遍历的一个细小差别
  9. 【Blog.Core重要升级】:封装服务扩展层
  10. java如何实现e的次方_Java开发如何更改MySQL数据库datadir目录之MySQL数据库索引实现...
  11. Uber如何使用go语言创建高效的查询服务
  12. C#中Invoke 和 BeginInvoke 的区别
  13. SharePoint 2010新特性Ribbon
  14. 鼠标右键快速连接wifi
  15. RMDB与hadoop的实时整合
  16. mfc c++string、char与char*之间的关系
  17. 流畅的Python(1)- 一摞Python风格的纸牌
  18. 怎样批量缩小图片大小kb?图片怎么批量压缩?
  19. fc安卓模拟器_[10月26号]VirtuaNES FC游戏模拟器:附300个无敌版Roms游戏!非常受欢迎的FC游戏模拟器...
  20. 有哪些有用的人际交往小常识?

热门文章

  1. linux压缩、解压操作
  2. jQuery 一些小技巧
  3. ibatis中的xml配置文件
  4. windows+nginx负载测试
  5. Ext 3.0 +ASP.NET2.0 可视化开发介绍
  6. js中写java集合代码,JS实现JAVA的List功能
  7. 函数名/函数地址/函数指针
  8. Edmonds_Karp 算法 (转)
  9. 转动风车java_java实现-图的相关操作
  10. 安装mysql显示有5.0_安装MySQL5.0时到如图这一步提示出错了,~