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对数据表进行分组查询(GROUP BY)的更多相关文章

  1. MySQL对数据表进行分组查询

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

  2. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  3. Oracle和MySQL分组查询GROUP BY

    Oracle和MySQL分组查询GROUP BY 真题1.Oracle和MySQL中的分组(GROUP BY)有什么区别? 答案:Oracle对于GROUP BY是严格的,所有要SELECT出来的字段 ...

  4. MySQL进阶5--分组函数 / 分组排序和分组查询 group by(having) /order by

    MySQL进阶--分组排序和分组查询 group by(having) /order by /* 介绍分组函数 功能:用做统计使用,又称为聚合函数或组函数 1.分类: sum, avg 求和 /平均数 ...

  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为数据表的指定字段插入数据

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

  9. MySQL 删除数据表

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

随机推荐

  1. iOS: UIScrollView pauses NSTimer while scrolling

    StackOverflow http://stackoverflow.com/a/7059499 Question:I have a UIScrollView that has a series of ...

  2. jquery与php的HTML转义与反转义

    1.jquery (1)Html转义 var tmp = '<a href="https://www.baidu.com/">连接</a>'; var tm ...

  3. easyui combobox简单用法

    <script type="text/javascript">var order_pay_type;$(function() { $("#order_pay_ ...

  4. 什么是REST设计风格

    https://zh.wikipedia.org/wiki/REST http://www.infoq.com/cn/articles/rest-introduction

  5. 安装MongoDB 到服务器

    用管理员身份运行CMD > cd C:\Program Files\mongodb\bin > C:\Program Files\mongodb\bin>mongod --dbpat ...

  6. kettle教程一

    转载:http://www.cnblogs.com/limengqiang/archive/2013/01/16/KettleApply1.html ETL(Extract-Transform-Loa ...

  7. Linux下php安装Redis安装

    1. 下载  redis-2.4.14.tar.gz 2. 解压 tar -zxvf redis-2.4.14.tar.gz 3.cd redis-2.4.14 4. make 注意:出错 1. CC ...

  8. 【scala】 scala 基础(一)

    至于什么是scala,摘录一段 维基百科的解释: scala 下载 安装 省略 1.环境变量配置完成后 命令行报错,因为scala 的安装路径里边包含空格 修改后即可.由于我的本地包含空格,此处CLI ...

  9. C 修改命令行文本颜色

    #include <Windows.h> #include <stdio.h> int main() { HANDLE h = GetStdHandle(STD_OUTPUT_ ...

  10. Linux Redis安装,Linux如何安装Redis,Linux Redis自动启动,Redis开机启动

    Linux Redis安装,Linux如何安装Redis,Linux Redis自动启动,Redis开机启动 >>>>>>>>>>>& ...