SQL基础系列(三)——分组查询
在SQL基础系列的前两部分中,已经介绍了一些基础的概念、单表简单查询、单表限定条件查询、排序的语法和说明,本部分主要介绍分组查询,仍然是在单表查询的范围内。理解单表分组查询后,多表分组查询也会比较好理解。
目录
1.什么是分组
2.对表进行分组
2.1 基本语句
2.2为分组聚合结果指定条件
2.3根据聚合结果进行排序
2.4执行顺序
2.5注意事项
1.什么是分组
在学习分组的sql语句前,我们先要理解分组的实际使用场景。
举个例子:数据表中记录了高中各个班级学生的学习成绩,现在想要统计每个班的平均分。
班级 | 学生id | 科目 | 分数 |
高一(1)班 | 1001 | 数学 | 90 |
高一(1)班 | 1002 | 语文 | 130 |
高一(2)班 | 2001 | 数学 | 120 |
高一(2)班 | 2002 | 语文 | 110 |
高一(2)班 | 2003 | 英语 | 124 |
使用分组语句后,所要达成的效果是:
(1)把表中的数据分成两部分
示例如下:
高一(1)班 | 1001 | 数学 | 90 |
高一(1)班 | 1002 | 语文 | 130 |
高一(2)班 | 2001 | 数学 | 120 |
高一(2)班 | 2002 | 语文 | 110 |
高一(2)班 | 2003 | 英语 | 124 |
(2)分别统计出平均分
高一(1)班:(90+130)/2
高一(2)班:(120+110+124)/2
2.对表进行分组
在分组统计时,需使用聚合函数,常用聚合函数如下:
- AVG(表达式) 返回表达式中所有的平均值。仅用于数字列,不计算NULL值。
- COUNT(表达式) 返回表达式记录的数量,可用于数字和字符列,不计算NULL值。
- COUNT(*) 返回表中的行数,计算NULL值。
- MAX(表达式) 返回表达式中的最大值,不计算NULL值。可用于数字、字符和日期时间列。
- MIN(表达式) 返回表达式中的最小值,不计算NULL值。可用于数字、字符和日期时间列。
- SUM(表达式) 返回表达式中所有的总和,不计算NULL值,仅用于数字列。
2.1 基本语句
SELECT item,avg(score)
FROM table1
WHERE score>50
GROUP BY item;
注释:
- 分组子句位置:GROUP BY应放置在WHERE后;
- 分组列数据为空:为空的数据放在一起,单独成为一个组进行统计;
- 分组语句中,WHERE的作用:对通过WHERE条件筛选的语句进行分组;
2.2为分组聚合结果指定条件
SELECT item,avg(score)
FROM table1
WHERE score>50
GROUP BY item
HAVING avg(score)>60;
注释:
- HAVING是指用来筛选指定组。
- 与WHERE的区别:WHERE对全表数据进行筛选,符合条件的数据分组统计,HAVING是为了筛选出符合条件的组;
2.3根据聚合结果进行排序
SELECT item,avg(score) AS AVG
FROM table1
WHERE score>50
GROUP BY item
HAVING avg(score)>60
ORDER BY AVG;
具体内容可移步此链接查看
第3章节为排序语句的说明
2.4执行顺序
FROM——WHERE——GROUP BY——HAVING——SELECT——ORDER BY
以下列语句举例说明如何执行(描述不一定非常精准):
SELECT item,avg(score) AS AVG
FROM table1
WHERE score>50
GROUP BY item
HAVING avg(score)>60
ORDER BY AVG;
(1)FROM table1
从table1 表中获取全部数据记录
(2)WHERE score>50
从table1 表中筛选出分数大于50的数据记录
(3)GROUP BY item
对筛选出的数据进行分组,item相同的数据分为一组
(4)HAVING avg(score)>60
对于分组的数据,筛选出平均分数大于60分的组的数据
(5)SELECT item,avg(score) AS AVG
对于筛选出的组的数据,将item,对应的avg(score)-平均分数,作为查询数据结果
(6)ORDER BY AVG
承接上一步的数据结果,按照平均数从低到高进行排序(升序)
2.5注意事项
(1)SELECT子句的书写规则
在分组统计时,SELECT子句中仅可使用以下三种元素:
- 常数(比如:1,2,‘中国’)
- 聚合函数
- GROUP BY子句中的分组列
(2)在GROUP BY子句中不能使用列的别名,原因在于,GROUP BY语句的执行顺序先于SELECT,也就是先分组后进行别名转换,所以在GROUP BY中使用别名会出现转换失败的情况。
(3)不使用ORDER BY,分组统计后的结果是随机排序。
(4)WHERE条件句中不能使用聚合/统计函数,原因在于,WHERE条件是筛选全表,而GROUP BY是在全表筛选的结果上再进行分组,在分组之后进行数据的统计聚合。所以WHERE条件句中不能把聚合函数的结果作为条件。
(5)HAVING子句的构成要素
在分组统计时,HAVING子句中可使用以下三种元素:
- 常数(比如:1,2,‘中国’)
- 聚合函数
- GROUP BY子句中的分组列
原因在于: HAVING是对分组后的数据进行筛选,而分组统计后的数据结果仅包括分组列,每列统计的数值,因此,筛选条件也仅限于分组列以及统计的结果。常数作为分组筛选条件不常用。
参考资料:
《SQL基础教程第二版》-MICK
SQL基础系列(三)——分组查询相关推荐
- 【C++自我精讲】基础系列三 重载
[C++自我精讲]基础系列三 重载 0 前言 分二部分:函数重载,操作符重载. 1 函数重载 函数重载:指在同一名字空间中,函数名称相同,参数类型.顺序或数量不同的一类函数,同一函数名的函数能完成不同 ...
- SQL基础系列(二)——单表查询
本文以单表查询为边界,介绍如何对一张表进行简单查询.限制条件查询.结果排序等内容.每种情况均有例句和补充说明. 如想看更多示例,请移步<SQL基础教程(第二版)>-MICK(如需电子版,可 ...
- SQL数据库语言基础之SqlServer分组查询总结
文章目录 1.分组的概念 2.聚合函数与分组配合使用 3.查询数据的直方图(REPLICATE()) 4.排序分组结果(ORDER BY放在分组后面) 5.反转查询(CASE与分组的结合) 6.两个分 ...
- 阿里云AI训练营-SQL基础3:复杂查询方法-视图、子查询、函数等
3.1 视图 3.1.1 什么是视图 3.1.2 视图与表有什么区别 3.1.3 为什么会存在视图 3.1.4 如何创建视图 3.1.5 如何修改视图结构 3.1.6 如何更新视图内容 3.1.7 如 ...
- 「SQL数据分析系列」3.查询入门
来源 | Learning SQL Generate, Manipulate, and Retrieve Data, Third Edition 作者 | Alan Beaulieu 译者 | Li ...
- SQL基础系列(一)——基本概念
在几年前学习sql的时候,直接上手开始学习sql语句,但是忽略了sql(structured query language)的本质其实是关系型数据库的语言.在使用这些语言之前,必须对一些基本的概念有大 ...
- SQL基础系列(四)——多表查询
本部分内容包括如何使用2张以上的表如何进行横向联结(表的联结)及竖向联结(集合运算). 目录 1.表的联结 1.1联结是什么 1.2内联结 1.3外联结 1.4多张表联结 1.5复杂表联结语句 2.其 ...
- SQL基础系列(五)——子查询
子查询是在一个完整的查询语句中,嵌套不同功能的小查询,从而完成复杂查询的一种编写形式.本部分主要介绍非关联子查询,关联子查询的适用场景,语句写法,执行逻辑及相对应的注意事项. 目录 1.非关联子查询 ...
- 详解SQL聚合函数、分组查询
一.聚合函数使用 SQL共有五个聚合函数,分别是 sum,avg,max,min,count,下面来一一介绍 执行下面的sql脚本 /* SQLyog Ultimate v10.00 Beta1 My ...
- sql面试题:分组查询和组函数的练习
文章目录 第一题 第二题 第三题 第一题 写一条sql语句:实现如下效果 原表: 实现效果表 sql语句为 SELECT sex, sum(case when dept ='win' then 1 e ...
最新文章
- 蚂蚁金服面对亿级并发场景的组件体系设计
- 浅谈ATP CHECK zz
- oracle对象之存储函数
- 正则表达式 学习笔记3.4
- 如何实现多路海康大华等RTSP数据转RTMP推送
- 程序员被公司辞退12天,前领导要求回公司讲清楚代码,你们知道什么结果吗?
- Java基础-通过反射获取类的信息
- 实战篇—关于某产品的切分细则
- 在SpringBoot中优雅的实现定时任务
- 局域网,城域网,广域网和互联网
- Java 代码访问 SMB 协议
- 控制系统伯德图、带宽及动态响应的关联性
- Keil--视力保护--背景设置
- 结构力学支座位移与温度荷载、力法与矩阵位移法、图乘法核心思想
- Android开发虚拟机测试没问题,真机调试就出现问题,总是闪退!10秒解决!!
- css pseudo elements,CSS 伪元素 (Pseudo-elements)
- 在解锁Redmi 5A
- Q3营收利润双降,新作将成Take-Two逆势大爆发的动力?
- 【vue-清除默认样式-完结】
- Eclipse(Windows)下第一个动态Java Web项目(Tomcat部署)