MySQL对数据表进行分组查询(GROUP BY)

GROUP BY关键字可以将查询结果按照某个字段或多个字段进行分组。字段中值相等的为一组。基本的语法格式如下:

GROUP BY 属性名 [HAVING 条件表达式] [WITH ROLLUP]
  • 属性名:是指按照该字段的值进行分组。
  • HAVING 条件表达式:用来限制分组后的显示,符合条件表达式的结果将被显示。
  • WITH ROLLUP:将会在所有记录的最后加上一条记录。加上的这一条记录是上面所有记录的总和。

GROUP BY关键字可以和GROUP_CONCAT()函数一起使用。GROUP_CONCAT()函数会把每个分组中指定的字段值都显示出来。

同时,GROUP BY关键字通常与集合函数一起使用。集合函数包括COUNT()函数、SUM()函数、AVG()函数、MAX()函数和MIN()函数等。

  • COUNT()函数:用于统计记录的条数。
  • SUM()函数:用于计算字段的值的总和。
  • AVG()函数:用于计算字段的值的平均值。
  • MAX()函数:用于查询字段的最大值。
  • MIN()函数:用于查询字段的最小值。

如果GROUP BY不与上述函数一起使用,那么查询结果就是字段取值的分组情况。字段中取值相同的记录为一组,但是只显示该组的第一条记录。


单独使用GROUP BY关键字进行分组

如果单独使用GROUP BY关键字,查询结果只显示一个分组的一条记录。

实例:将employee表的sex字段进行分组查询,将查询结果与分组前的结果进行对比。操作步骤如下:

1. 首先执行不带GROUP BY关键字的SELECT语句。如下图所示:

上图中代码执行的结果显示的是employee表中原始的记录情况。

2. 执行带有GROUP BY关键字的SELECT语句。代码如下:

SELECT * FROM employee GROUP BY sex;

在DOS提示符窗口中查看执行带有GROUP BY关键字的SELECT语句的操作效果。如下图所示:

上图中代码执行的结果只显示了两条记录。这两条记录的sex字段的值分别为“女”和“男”。

查询结果进行比较,GROUP BY关键字只显示每个分组的一条记录。这说明,GROUP BY关键字单独使用时,只能查询出每个分组的一条记录,这样做的意义不大。因此,一般在使用集合函数时才使用GROUP BY关键字。


GROUP BY关键字与GROUP_CONCAT()函数一起使用

GROUP BY关键字与GROUP_CONCAT()函数一起使用时,每个分组中指定的字段值会全部显示出来。

实例:将employee表按照sex字段进行分组查询。使用GROUP_CONCAT()函数将每个分组的name字段的值显示出来。

SELECT语句的代码如下:

SELECT sex,GROUP_CONCAT(name) FROM employee GROUP BY sex;

在DOS提示符窗口中查看代码的执行效果。如下图所示:

上图中代码执行的结果显示,查询结果分为两组。sex字段取值为“女”的记录是一组,取值为“男”的记录是一组。每一组中所有人的名字都被查询出来了。

该实例说明,使用GROUP_CONCAT()函数可以很好的把分组情况表示出来。


GROUP BY关键字与集合函数一起使用

GROUP BY关键字与集合函数一起使用时,可以通过集合函数计算分组中的总记录、最大值、最小值等。

实例:将employee表的sex字段进行分组查询。sex字段取值相同的为一组。然后对每一组使用集合函数COUNT()函数进行计算,求出每一组的记录数。

SELECT语句的代码如下:

SELECT sex,COUNT(sex) FROM employee GROUP BY sex;

在DOS提示符窗口中查看GROUP BY关键字与集合函数一起使用的操作效果。如下图所示:

上图中代码执行的结果显示,查询结果按sex字段的取值进行分组。取值为“女”的记录为一组,取值为“男”的记录为一组。COUNT(sex)计算出了sex字段不同分组的记录数。第一组共有2条记录,第二组共有3条记录。

提示

通常情况下,GROUP BY关键字与集合函数一起使用,先使用GROUP BY关键字将记录分组,然后每组都使用集合函数进行计算。在统计时经常需要使用GROUP BY关键字和集合函数。


GROUP BY关键字与HAVING一起使用

使用GROUP BY关键字时,如果加上“HAVING 条件表达式”,则可以限制输出的结果。只有符合条件表达式的结果才会显示。

实例:将employee表的sex字段进行分组查询。然后显示记录数大于等于3的分组。

SELECT语句的代码如下:

SELECT sex,COUNT(sex) FROM employee GROUP BY sex HAVING COUNT(sex)>=3;

在DOS提示符窗口中查看GROUP BY关键字与HAVING一起使用的操作效果。如下图所示:

上图中代码执行的结果只显示了取值为“男”的记录的情况。因为,该分组的记录数为3,刚好符合HAVING COUNT(sex)>=3的条件。

该实例说明,“HAVING 条件表达式”可以限制查询结果的显示情况。

提示

“HAVING 条件表达式”与“WHERE 条件表达式”都是用于限制显示的。但是,两者起作用的地方不一样。

  • WHERE 条件表达式:作用于表或者视图,是表和视图的查询条件。
  • HAVING 条件表达式:作用于分组后的记录,用于选择符合条件的组。

按照多个字段进行分组

在MySQL中,还可以按照多个字段进行分组。例如,employee表按照d_id字段和sex字段进行分组。分组过程中,先按照d_id字段进行分组,遇到d_id字段的值相等的情况时,再把d_id值相等的记录按照sex字段进行分组。

实例:将employee表按照d_id字段和sex字段进行分组。

SELECT语句的代码如下:

SELECT * FROM employee GROUP BY d_id,sex;

在DOS提示符窗口中查看按照多个字段进行分组的操作效果。如下图所示:

上图中代码执行的结果显示,记录先按照d_id字段进行分组,因为分别有两条记录的d_id的值为1001和1004,所以这4条记录再次按照sex字段的取值进行了分组。


GROUP BY关键字与WITH ROLLUP一起使用

使用WITH ROLLUP时,将会在所有记录的最后加上一条记录。这条记录是上面所有记录的总和。

实例:将employee表的sex字段进行分组查询。使用COUNT()函数计算每组的记录数,并且加上WITH ROLLUP。

SELECT语句的代码如下:

SELECT sex,COUNT(sex) FROM employee GROUP BY sex WITH ROLLUP;

在DOS提示符窗口中查看GROUP BY关键字与WITH ROLLUP一起使用的操作效果。如下图所示:

上图中代码执行的结果显示,计算出了各个分组的记录数,并且,在记录的最后加上了一条新的记录。该记录的COUNT(sex)列的值正好是上面分组的值的总和。

实例:将employee表的sex字段进行分组查询。使用GROUP_CONCAT()函数查看每组的name字段的值,并且加上WITH ROLLUP。

SELECT语句的代码如下:

SELECT sex,GROUP_CONCAT(name) FROM employee GROUP BY sex WITH ROLLUP;

在DOS提示符窗口中查看SELECT语句WITH ROLLUP参数的操作效果。如下图所示:

上图中代码执行的结果显示,GROUP_CONCAT(name)显示了每个分组的name字段的值。同时,最后一条记录的GROUP_CONCAT(name)列的值正好是上面分组name取值的总和。

MySQL对数据表进行分组查询的更多相关文章

  1. MySQL对数据表进行分组查询(GROUP BY)

    MySQL对数据表进行分组查询(GROUP BY) GROUP BY关键字可以将查询结果按照某个字段或多个字段进行分组.字段中值相等的为一组.基本的语法格式如下: GROUP BY 属性名 [HAVI ...

  2. MySQL为数据表的指定字段插入数据

    username not null 没有默认值/有默认值   insert不插入username字段 均不报错 2014年07月23日21:05    百科369 MySQL为数据表的指定字段插入数据 ...

  3. MySQL 删除数据表

    MySQL 删除数据表 MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失. 语法 以下为删除MySQL数据表的通用语法: DROP TA ...

  4. MySQL 创建数据表

    MySQL 创建数据表 创建MySQL数据表需要以下信息: 表名 表字段名 定义每个表字段 语法 以下为创建MySQL数据表的SQL通用语法: CREATE TABLE table_name (col ...

  5. mysql(三) 数据表的基本操作操作

    mysql(三) 数据表的基本操作操作 创建表,曾删改查,主键,外键,基本数据类型. 1. 创建表 create table 表名( 列名 类型 是否可以为空, 列名 类型 是否可以为空 )ENGIN ...

  6. BBS--功能4:个人站点页面设计(ORM跨表与分组查询)

    查询: 日期归档查询 1 date_format ============date,time,datetime=========== create table t_mul_new(d date,t t ...

  7. 5 功能4:个人站点页面设计(ORM跨表与分组查询)

    1.个人站点页面文章的查询 # 个人站点 http://www.cnblogs.com/wh1520577322/ http://www.cnblogs.com/liucong12345/ http: ...

  8. 第二百七十七节,MySQL数据库-数据表、以及列的增删改查

    MySQL数据库-数据表.以及列的增删改查 1.创建一个表 CREATE(创建) TABLE(表) ENGINE(引擎) ENGINE=INNODB(引擎)还有很多类引擎,这里只是简单的提一下INNO ...

  9. 十、MySQL 删除数据表

    MySQL 删除数据表 MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失. 语法 以下为删除MySQL数据表的通用语法: DROP TA ...

随机推荐

  1. HTML播放FLASH(SWF)神器-SWFObject

    环境 必须有 swfobject.js和 expressInstall.swf js:  http://pan.baidu.com/share/link?shareid=2536087943& ...

  2. 008_MAC 终端使用技巧

    一.常用终端命令. <1>reset 的作用很简单——将目前「终端」屏幕上的内容清空,就好像刚刚打开终端一样. <2>如果你在一条终端命令中发现有输入错误的话,那么用 cont ...

  3. 2018-11-3& maven

    https://www.cnblogs.com/clsn/p/7944116.html#auto_id_10 http://www.runoob.com/maven/maven-creating-pr ...

  4. apache虚拟主机配置及常用安全配置

    环境准备: 服务器系统:CentOS 6.5 安装lamp环境: yum -y install mysql mysql-server php php-mysql httpd php-gd* freet ...

  5. Hazelcast是什么

    Hazelcast是什么    “分布式”.“集群服务”.“网格式内存数据”.“分布式缓存“.“弹性可伸缩服务”——这些牛逼闪闪的名词拿到哪都是ITer装逼的不二之选.在Javaer的世界,有这样一个 ...

  6. 自己动手破解rar密码-ruby脚本实现

    破解密码,上策是社工的方式,下策则是暴力破解了.这里使用暴力破解,字典文件放在txt中:通过调用winrar的相关参数进行操作.经过测试,当字典中密码为100个时,破解耗时8秒(个人配置:i5-321 ...

  7. Java第三阶段学习(十二、HttpServletRequest与HttpServletResponse)

    一.HttpServletRequest 1.概述: 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和 ...

  8. Z字形变换

    将字符串 "PAYPALISHIRING" 以 Z 字形排列成给定的行数: P A H N A P L S I I G Y I R 之后从左往右,逐行读取字符:"PAHN ...

  9. 【AtCoder】ARC093

    C - Traveling Plan 相当于一个环,每次删掉i点到两边的距离,加上新相邻的两个点的距离 代码 #include <bits/stdc++.h> #define fi fir ...

  10. HttpClient-----待补充

    1.简介 HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 JDK 的 java.net 包中 ...