当前位置: 首页 > news >正文

MySQL——高级查询(3)分组查询

        在对表中数据进行统计时,也可能需要按照一定的类别进行统计,比如,分别统计 student 表中 gender 字段值为 “ 男 ” 、“ 女 ” 和 “ NULL ” 的学生成绩 (grade字段) 之和。在 MySQL中,可以使用 GROUP BY 按某个字段或者多个字段中的值进行分组,字段中值同的为一组,其语法格式如下所示:

SEIECT 字段名 1,字段名 2,…
FROM 表名
GROUP BY 字段名 1,字段名 2,…[HAVING 条件表达式];

        在上面的语法格式中,指定的字段名1、字段名2 等是对查询结果分组的依据 HAVING 关键字指定条件表达式对分组后的内容进行过滤。需要特别注意的是 GROUP BY 一般和聚合函数一起使用,如果查询的字段出现在 GROUP BY 后,却没有自含在聚合函数中,该字段显示的是分组后的第一条记录的值,这样有可能会导致查询果不符合我们的预期。

        由于分组查询比较复杂,接下来将分几种情况对分组查询进行讲解。

1.单独使用 GROUP BY 分组

        单独使用 GROUP BY关键字,查询的是每个分组中的一条记录,例如,查询 student 表中的记录,按照 gender 字段值进行分组,SQL 语句如下所示:

SELECT * FROM student GROUP BY gender;

        执行结果如下所示:

mysql> SSELECT * FROM student GROUP BY gender;
+----+------------+-------+--------+
| id | name       | grade | gender |
+----+------------+-------+--------+
|  8 | yanging    |    90 | NULL   |
|  4 | husanniang |    88 | 女     |
|  1 | songjiang  |    40 | 男     |
+----+------------+-------+--------+
3 rows in set (0.00 sec)

        从查询结果可以看到返回了三条记录,这三条记录中 gender 字段的值分别为 “ NULL ” “ 男 ” 、“ 女 ”,这说明了查询结果是按照 gender 字段中不同的值进行分类。然而这样的查询结果只显示每个分组中的一条记录,意义并不大,一般情况下 GROUP BY 都和聚合函数一起使用。

2.GROUP BY 和聚合函数一起使用

        GROUP BY 和聚合函数一起使用,可以统计出某个或者某些字段在一个分组中的最大值、最小值、平均值等。
        例如,将 student 表按照 gender 字段值进行分组查询,计算出每个分组中各有多少名学生,SQL语句如下所示:

SELECT COUNT(*),gender FROM student GROUP BY gender;

        执行结果如下所示:

mysql> SELECT COUNT(*),gender FROM student GROUP BY gender;
+----------+--------+
| COUNT(*) | gender |
+----------+--------+
|        1 | NULL   |
|        2 | 女     |
|        3 | 男     |
+----------+--------+
3 rows in set (0.00 sec)

        从查询结果可以看到,GROUP BY 对 student 表按照 gender 字段中的不同值进行了分组,并通过 COUNT() 函数统计出 gender 字段值为 “ NULL”的学生有一个,gender 字段值为 “ 男 ” 的学生有 5 个,gender 字段值为 “ 女 ” 的学生有两个。

3.GROUP BY 和 HAVING 关键字一起使用

        HAVING 关键字和 WHERE 关键字的作用相同,都用于设置条件表达式对查询结果进行过滤,两者的区别在于,AVING 关键字后可以跟聚合函数,而 WHERE 关键字不能,通常情况下 HAVING 关键字都和 GROUP BY 一起使用,用于对分组后的结果进行过滤。

        例如,将 student 表按照 gender 字段进行分组查询,查询出 grade 字段值之和小于 300 的分组,SQL 语句如下所示:

SELECT sum(grade),gender FROM student GROUP By gender HAVING SUM(grade)<300;

        执行结果如下所示:

mysql> SELECT sum(grade),gender FROM student GROUP By gender HAVING SUM(grade)<300;
+------------+--------+
| sum(grade) | gender |
+------------+--------+
|         90 | NULL   |
|        154 | 女     |
+------------+--------+
2 rows in set (0.00 sec)

        从查询结果可以看到,只有 gender 值为 “ NULL ” 和 “ 女 ” 的分组其 grade 字段值之和小于300。为了验证查询结果的正确性,下面对 gender 值为 “ 男 ” 的所有学生其 grade 字段值之和进行查询,执行结果如下所示:

mysql> SELECT SUM(grade),gender FROM student WHERE gender='男';
+------------+--------+
| SUM(grade) | gender |
+------------+--------+
|        408 | 男     |
+------------+--------+
1 row in set (0.01 sec)

        从查询结果可以看到,gender 字段值为 “ 男 ” 的所有学生其 grade 字段值之和为 408,可以说明上面分组查询结果的正确性。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 敲桌子游戏
  • Java OkHttp使用(二)
  • Java数组05:Arrays类
  • 多商户小程序审核存在商户入口无法通过
  • 消息中间件:Kafka消息丢失与堆积问题分析与解决方案
  • MySQL在Centos7环境安装
  • Oracle 同义词SYNONYM 的使用
  • 【GH】【EXCEL】P1: Write DATA SET from GH into EXCEL
  • 为什么要用云手机进行海外社交营销
  • 【Python异常处理简析】
  • 数据结构(邓俊辉)学习笔记】优先级队列 07——堆排序
  • Mybatis-Plus 的批量保存saveBatch 性能分析
  • ros_gz_project_template使用笔记①配置(Gazebo Harmonic ROS2 Jazzy )
  • 计算机网络之TCP序号,确认序号和报文传输时间
  • 污点Taints和Deployment
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Cookie 在前端中的实践
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Java IO学习笔记一
  • Java面向对象及其三大特征
  • Laravel 菜鸟晋级之路
  • Node + FFmpeg 实现Canvas动画导出视频
  • Redis字符串类型内部编码剖析
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Vue小说阅读器(仿追书神器)
  • windows下使用nginx调试简介
  • 阿里研究院入选中国企业智库系统影响力榜
  • 不上全站https的网站你们就等着被恶心死吧
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 正则与JS中的正则
  • 回归生活:清理微信公众号
  • 积累各种好的链接
  • 我们雇佣了一只大猴子...
  • ​Java基础复习笔记 第16章:网络编程
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1)无线电失控保护(二)
  • (33)STM32——485实验笔记
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (回溯) LeetCode 131. 分割回文串
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (转)JAVA中的堆栈
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .form文件_一篇文章学会文件上传
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net(C#)中String.Format如何使用
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .net开发引用程序集提示没有强名称的解决办法