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)
在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取值的总和。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/4470.html
mysql相关文章
- MySQL 创建索引详解数据库
- linux中的Mysql的安装、重置安装密码、修改权限详解数据库
- mysql分表经验总结详解数据库
- mysql正则表达式,实现多个字段匹配多个like模糊查询详解数据库
- MySQL操作简单上手,快速实现数据库运行(mysql操作软件)
- 中的数据MySQL数据库:查找不到数据(看不到mysql库)
- 优化MySQL数据库存储优化:实现高效快速存储(mysql数据库存储)
- 简单步骤学习JDBC操作MySQL(jdbc操作mysql)
- MySQL四表联合查询技巧分享(mysql四表查询)
- MySQL日志恢复:保护数据库安全(mysql日志恢复数据库)
- 升级MySQL:Yum一键搞定(yum升级mysql)
- MySQL数据库查询:获取精准结果的基础(mysql查询值)
- 启用MySQL日志记录:有效跟踪数据库操作(mysql启用日志)
- MySQL远程用户:如何允许远程访问MySQL数据库?(mysql远程用户)
- 深入了解MySQL的特性,优化数据库性能(mysql的特性)
- MySQL同步指定数据库的实现方法(mysql同步指定的库)
- MySQL表中设置唯一主键的重要性(mysql表主键)
- 如何备份 MySQL 数据库?(mysql怎样备份数据库)
- DOS与MySQL:传奇操作系统与流行数据库的结合(dosmysql)
- MySQL如何应用于游戏开发中的数据存储和管理?(mysql游戏)
- MySQL存储过程中的IF:编写必要的体系结构(mysql存储过程if)
- MySQL 使用C语言删除数据库记录(c mysql 删除数据)
- MySQL双表联动实现两边关联修改的方法详解(mysql 两边关联修改)
- 异步操作MySQL提升数据库性能的简单方法(async-mysql)
- 从access到MySQL灵活应对数据需求的新解决方案(acess与mysql)
- 库如何正确地初始化MySQL数据库(.初始化mysql数据)
- MySQL 数据库分库分表策略简介(mysql 中分库和分表)
- MySQL三范式详解及实例解析(mysql三个范式举例)
- MySQL日期相减技巧,轻松处理时间差问题(mysql两段日期相减)
- 如何将MySQL下载到U盘(mysql下载到u盘)
- MySQL三表联结,请看这里(mysql三个表并联)
- 两大步骤教您开启MySQL数据库远程登陆帐号的方法