在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基础系列(三)——分组查询相关推荐

  1. 【C++自我精讲】基础系列三 重载

    [C++自我精讲]基础系列三 重载 0 前言 分二部分:函数重载,操作符重载. 1 函数重载 函数重载:指在同一名字空间中,函数名称相同,参数类型.顺序或数量不同的一类函数,同一函数名的函数能完成不同 ...

  2. SQL基础系列(二)——单表查询

    本文以单表查询为边界,介绍如何对一张表进行简单查询.限制条件查询.结果排序等内容.每种情况均有例句和补充说明. 如想看更多示例,请移步<SQL基础教程(第二版)>-MICK(如需电子版,可 ...

  3. SQL数据库语言基础之SqlServer分组查询总结

    文章目录 1.分组的概念 2.聚合函数与分组配合使用 3.查询数据的直方图(REPLICATE()) 4.排序分组结果(ORDER BY放在分组后面) 5.反转查询(CASE与分组的结合) 6.两个分 ...

  4. 阿里云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 如 ...

  5. 「SQL数据分析系列」3.查询入门

    来源 |  Learning SQL Generate, Manipulate, and Retrieve Data, Third Edition 作者 | Alan Beaulieu 译者 | Li ...

  6. SQL基础系列(一)——基本概念

    在几年前学习sql的时候,直接上手开始学习sql语句,但是忽略了sql(structured query language)的本质其实是关系型数据库的语言.在使用这些语言之前,必须对一些基本的概念有大 ...

  7. SQL基础系列(四)——多表查询

    本部分内容包括如何使用2张以上的表如何进行横向联结(表的联结)及竖向联结(集合运算). 目录 1.表的联结 1.1联结是什么 1.2内联结 1.3外联结 1.4多张表联结 1.5复杂表联结语句 2.其 ...

  8. SQL基础系列(五)——子查询

    子查询是在一个完整的查询语句中,嵌套不同功能的小查询,从而完成复杂查询的一种编写形式.本部分主要介绍非关联子查询,关联子查询的适用场景,语句写法,执行逻辑及相对应的注意事项. 目录 1.非关联子查询 ...

  9. 详解SQL聚合函数、分组查询

    一.聚合函数使用 SQL共有五个聚合函数,分别是 sum,avg,max,min,count,下面来一一介绍 执行下面的sql脚本 /* SQLyog Ultimate v10.00 Beta1 My ...

  10. sql面试题:分组查询和组函数的练习

    文章目录 第一题 第二题 第三题 第一题 写一条sql语句:实现如下效果 原表: 实现效果表 sql语句为 SELECT sex, sum(case when dept ='win' then 1 e ...

最新文章

  1. 蚂蚁金服面对亿级并发场景的组件体系设计
  2. 浅谈ATP CHECK zz
  3. oracle对象之存储函数
  4. 正则表达式 学习笔记3.4
  5. 如何实现多路海康大华等RTSP数据转RTMP推送
  6. 程序员被公司辞退12天,前领导要求回公司讲清楚代码,你们知道什么结果吗?
  7. Java基础-通过反射获取类的信息
  8. 实战篇—关于某产品的切分细则
  9. 在SpringBoot中优雅的实现定时任务
  10. 局域网,城域网,广域网和互联网
  11. Java 代码访问 SMB 协议
  12. 控制系统伯德图、带宽及动态响应的关联性
  13. Keil--视力保护--背景设置
  14. 结构力学支座位移与温度荷载、力法与矩阵位移法、图乘法核心思想
  15. Android开发虚拟机测试没问题,真机调试就出现问题,总是闪退!10秒解决!!
  16. css pseudo elements,CSS 伪元素 (Pseudo-elements)
  17. 在解锁Redmi 5A
  18. Q3营收利润双降,新作将成Take-Two逆势大爆发的动力?
  19. 【vue-清除默认样式-完结】
  20. Eclipse(Windows)下第一个动态Java Web项目(Tomcat部署)

热门文章

  1. Flutter-防京东商城项目-收货地址列表、增加 修改收货地址布局、弹出省市区选择器-39
  2. 高斯分布4——联合概率分布
  3. 东家冲~石池高速公路一阶段施工图设计--长沙理工大学继续教育学院自考道路毕业设计
  4. 6.27java斗地主
  5. 有源滤波器matlab/simulink 采用simulink搭建有源滤波器模型,有操作视频和报告资料,运行稳定,效果显著
  6. 使用 HTML、CSS 和 JS 制作一个中国象棋
  7. ubuntu安装teamview
  8. echarts全国地图显示到城市级别
  9. 关于-140.dll库缺失
  10. soui 设置边框_SOUI入门