当前位置:首页 > 数据库 > mysql 名字分组查询id

mysql 名字分组查询id

2022年11月09日 14:27:05数据库13

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语句。如下图所示:

L3Byb3h5L2h0dHAvd3d3LmJhaWtlMzY5LmNvbS9jb250ZW50L2ltYWdlcy8yMDE0MDYvNDUwNC5naWY=.jpg

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

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

SELECT * FROM employee GROUP BY sex;

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

L3Byb3h5L2h0dHAvd3d3LmJhaWtlMzY5LmNvbS9jb250ZW50L2ltYWdlcy8yMDE0MDYvNDUwMy5naWY=.jpg

上图中代码执行的结果只显示了两条记录。这两条记录的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提示符窗口中查看代码的执行效果。如下图所示:

L3Byb3h5L2h0dHAvd3d3LmJhaWtlMzY5LmNvbS9jb250ZW50L2ltYWdlcy8yMDE0MDYvNDUwMi5naWY=.jpg

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

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

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

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

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

SELECT语句的代码如下:

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

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

L3Byb3h5L2h0dHAvd3d3LmJhaWtlMzY5LmNvbS9jb250ZW50L2ltYWdlcy8yMDE0MDYvNDUwMS5naWY=.jpg

上图中代码执行的结果显示,查询结果按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一起使用的操作效果。如下图所示:

L3Byb3h5L2h0dHAvd3d3LmJhaWtlMzY5LmNvbS9jb250ZW50L2ltYWdlcy8yMDE0MDYvNDUwMC5naWY=.jpg

上图中代码执行的结果只显示了取值为“男”的记录的情况。因为,该分组的记录数为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提示符窗口中查看按照多个字段进行分组的操作效果。如下图所示:

L3Byb3h5L2h0dHAvd3d3LmJhaWtlMzY5LmNvbS9jb250ZW50L2ltYWdlcy8yMDE0MDYvNDQ5OS5naWY=.jpg

上图中代码执行的结果显示,记录先按照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一起使用的操作效果。如下图所示:

L3Byb3h5L2h0dHAvd3d3LmJhaWtlMzY5LmNvbS9jb250ZW50L2ltYWdlcy8yMDE0MDYvNDQ5OC5naWY=.jpg

上图中代码执行的结果显示,计算出了各个分组的记录数,并且,在记录的最后加上了一条新的记录。该记录的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参数的操作效果。如下图所示:

L3Byb3h5L2h0dHAvd3d3LmJhaWtlMzY5LmNvbS9jb250ZW50L2ltYWdlcy8yMDE0MDYvNDQ5Ny5naWY=.jpg

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

时间: 05-14

作者:SDAU雪月
来源链接:https://blog.csdn.net/weixin_34922053/article/details/114785505

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/database/68948.html

标签: group byMySQL
分享给朋友:

“mysql 名字分组查询id” 的相关文章

MySQL触发器

MySQL触发器 触发器是一种特殊的存储过程,触发器和存储过程一样是一个能完成特定功能、存储在数据库服务器上的SQL片段,但是触发器无需调用,当对数据库表中的数据执行DML操作时自动触发这个SQL片段的执行,无需手动调用. 在MySQL中,只...

MYSQL的存储过程

MYSQL的存储过程 概述 什么是存储过程? mysql5.0版本开始支持存储过程; 简单的说,存储过程就是一组sql语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于java语言中的方法; 存储过程就是数据库s...

MySQL主从复制

MySQL主从复制 文章目录 MySQL主从复制 1.准备工作 2.主库的配置 3.配置从库 4.Sharding-JDBC框架的使用...

性能优化|深入理解mysql索引数据结构与算法

性能优化|深入理解mysql索引数据结构与算法

什么是索引? 在mysql中,索引就是帮助mysql快速找到某条数据的一种数据结构,它是排好序的,独立于mysql表数据之外的。 索引数据结构分为哪几种 二叉树、红黑树、Hash表、B树。 在这里我们主要介绍hash表和B树...

cloudera-scm-server启动出现Error creating bean with name 'entityManagerFactoryBean'与HHH010003: JDBC Driver class not found: com.mysql.jdbc.Driver错误解决办法(图文详解)

cloudera-scm-server启动出现Error creating bean with name 'entityManagerFactoryBean'与HHH010003: JDBC Driver class not found: com.mysql.jdbc.Driver错误解决办法(图文详解)

     不多说,直接上干货!       问题详情 2017-07-31 22:19:40,342 INFO main:com.cloudera.server.cmf.Main: Starting SCM Serv...

mysql查询结果中文显示成了问号

character-set-server = utf8    collation-server = utf8_general_ci   然后 service  mysq...

mysql 查询最近5个月,每月的数据统计

SELECT DATE_FORMAT(CURDATE(), '%Y-%m') AS `year_month` UNION SELECT DATE_FORMAT((CURDATE() - INTERVAL 1 MONTH), '%Y-%m') AS `year_month...

mysql字段值中带空格、mysql查询参数带空格的查询方法

问题描述 当我们在使用mysql查询的时候,如果数据库中的这个字段的值含有空格(字符串内部,非首尾),或者我们查询的参数中间有空格,而字段值中没有空格。那么我们很有可能就什么都查不到。 假如有下面的一张表content:...

mysql 查询列拼接字段

mysql 拼接字符函数 concat 转自:https://blog.csdn.net/q718330882/article/details/37690677 mysql 的concat函数可以实现数据库中字段的自由拼接 并且保存成临时字段 mysql>...

MYSQL查询大于某个时间的数据

今天: SELECT * FROM 表名 WHERE TO_DAYS( 时间字段名) = TO_DAYS(NOW()); 昨天: SELECT * FROM...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。