当前位置:首页 > 数据库 > 【MySQL数据库】group by详解

【MySQL数据库】group by详解

2022年09月17日 11:20:25数据库12

基本语法


SELECT FROM WHERE GROUP BY HAVING ORDER BY LIMIT
先过滤行,然后分组,筛选组,对剩余组排序,选取指定的组集合。

记住:一旦分组完成,我们的后续操作都是对分组得到的虚拟表进行操作。
【MySQL数据库】group by详解 _ JavaClub全栈架构师技术笔记

GROUP BY子句中列出来的每个列必须是检索列或有效的表达式(但不能是聚集函数)

举例说明

下面来看一个例子:刚刚开了一把王者荣耀battle,这把一共有六个英雄上阵,如下所示:
+--------+------+--------+---------+
| name | sex  | job     | gold    |
+--------+------+--------+---------+
| 嫦娥   | 女   | 法师   | 5600.00 |
| 杨戬   | 男   | 战士   | 5600.00 |
| 梦琪   | 男   | 战士   | 8500.00 |
| 火女   | 女   | NULL | 5600.00 |
| 苏烈   | 男   | 坦克   | 8600.00 |
| 阿珂   | 女   | 刺客   | 5600.00 |
+--------+------+--------+---------+


1.战斗进行了一会,现在来算一算哪个职业的经济最多?
select job,sum(gold) from battle group by job;
+-------- +-------------+
|   job    | sum(gold) |
+--------+--------------+
| NULL |   5600.00  |
| 刺客   |   5600.00  |
| 坦克   |   8600.00  |
| 战士   |  14100.00 |
| 法师   |   5600.00  |
+--------+-----------+
可以看出来,战士获得的经济最多。因为火女的职业不知道,所以被单独分到一个组,
知识点来了:如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多个NULL,它们将作为一个分组返回。


2.如果我只想查看美女英雄的职业分组经济情况咋办?
select job,sum(gold) from battle where sex='女' group by job;
+--------+-----------+
| job      | sum(gold) |
+---------+-----------+
| NULL |   5600.00 |
| 刺客   |   5600.00 |
| 法师   |   5600.00 |
+--------+-----------+


3.如果我只想查看美女英雄的法师组的经济?
select job,sum(gold) from battle where sex='女' group by job having job='法师';
+--------+-----------+
| job      | sum(gold) |
+--------+-----------+
| 法师   |   5600.00 |
+--------+-----------+

 

4.如果想查看每个组内有哪些人怎么办,GROUP_CONCAT()函数就发挥作用了。
select GROUP_CONCAT(name),job,sum(gold) from battle group by job;
+--------------------+--------+-----------+
| GROUP_CONCAT(name) | job    | sum(gold) |
+------------------+---------+------------+
| 火女               | NULL |   5600.00 |
| 阿珂               | 刺客   |   5600.00 |
| 苏烈               | 坦克   |   8600.00 |
| 杨戬,梦琪       | 战士   |  14100.00 |
| 嫦娥               | 法师   |   5600.00 |
+--------------------+--------+-----------+
知识点:GROUP_CONCAT()会把组内的所有成员列出来。

5.如果想在分组统计数据基础上再进行相同的统计,可以使用 with rollup
select GROUP_CONCAT(name),job,sum(gold) from battle group by job with rollup;
+-------------------------------------------+--------+-----------+
| GROUP_CONCAT(name)            | job     | sum(gold) |
+--------------------------------------------+--------+--------------+
| 火女                                              | NULL |   5600.00  |
| 阿珂                                              | 刺客   |   5600.00  |
| 苏烈                                              | 坦克   |   8600.00  |
| 杨戬,梦琪                                      | 战士   |  14100.00 |
| 嫦娥                                              | 法师   |   5600.00  |
| 火女,阿珂,苏烈,杨戬,梦琪,嫦娥     | NULL |  39500.00 |
+-------------------------------------------+-----------+-------------+


6.COUNT(*)会统计我们表中的NULL值,如果不想统计NULL值,请写COUNT(字段名)
select GROUP_CONCAT(name),job,sum(gold),count(*) as '人数' from battle group by job;
+--------------------+--------+-----------+--------+
| GROUP_CONCAT(name) | job    | sum(gold) | 人数   |
+------------------+--------+-------------+--------+
| 火女               | NULL |   5600.00 |      1 |
| 阿珂               | 刺客   |   5600.00 |      1 |
| 苏烈               | 坦克   |   8600.00 |      1 |
| 杨戬,梦琪       | 战士   |  14100.00|      2 |
| 嫦娥               | 法师   |   5600.00 |      1 |
+--------------------+--------+-----------+--------+
select GROUP_CONCAT(name),job,sum(gold),count(job) as '人数' from battle group by job;
+--------------------+--------+-----------+--------+
| GROUP_CONCAT(name) | job    | sum(gold) | 人数   |
+------------------+--------+-------------+-------+
| 火女               | NULL |   5600.00 |      0 |
| 阿珂               | 刺客   |   5600.00 |      1 |
| 苏烈               | 坦克   |   8600.00 |      1 |
| 杨戬,梦琪       | 战士   |  14100.00|      2 |
| 嫦娥               | 法师   |   5600.00 |      1 |
+--------------------+--------+-----------+--------+

作者:fxkcsdn
来源链接:https://blog.csdn.net/fxkcsdn/article/details/94555347

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

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


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

标签: group by
分享给朋友:

“【MySQL数据库】group by详解” 的相关文章

MySQL中 (GROUP BY 用法)和(ORDER BY用法)

MySQL中 (GROUP BY 用法)和(ORDER BY用法)

一、GROUP BY(分组) 例子: SELECT sum(id) as aa_id, max(id) as m_id, message FROM device_shadow_log GROUP BY message ORDER BY aa_id DESC 1...

mysql group by 用法解析(详细) + mysql distinct 去重

这篇文章写的很好。 转自:http://blog.tianya.cn/blogger/post_read.asp?BlogID=4221189&PostID=47881614   在使用mysql时,有时需要查询出某个字段不重复的记录,虽然my...

where,group by,having,order by执行顺序和编写顺序

当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序 使用count(列名)当某列出现null值的时候,count(*)仍然会计算,但是count(列名)不会。 二、数据分组(group b...

mysql o by

mysql o by

原文:https://blog.csdn.net/u014717572/article/details/80687042 先来看下表1,表名为test: 表1 执行如下SQL语句: SELECT name FRO...

MySQL的分组查询group by

group by (1)、group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组。 (2)、group by可用于单字段分组,也可用于多个字段分组。 复制代码select * from employee; +----...

group by分组筛选

我们在MySQL做查询时,经常需要用到 group by 分组来筛选查询 相信做后端的朋友应该遇到过,有时候需要对分组的结果再进行过滤,这时候where用不了,那么该如何解决呢? 解决方法: 用 having 处理,即having后面接筛选的条件,写法的wher...

mysql group by 用法解析(详细)

group by 用法解析 group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。 SELECT子句中的列名必须为分组列或列函数。列函数对于GROUP BY子句定义的每个组各返回一个结果。 某个员工信息表结构和数据如下:   i...

oracle group by执行慢,一次对group by时间导致的慢查询的优化

oracle group by执行慢,一次对group by时间导致的慢查询的优化

前言: 最近在测试环境中点击一个图表展示页面时,半天才得到后台响应的数据进行页面渲染展示,后台的响应很慢,这样极大的降低了用户的体验; 发现这个问题后马上进行了排查 ,通过排查发现是由一个查询很慢的 group by 语句导致的; 本文...

MySQL5.7.5及以上执行group by报错

MySQL5.7.5及以上执行group by报错

MySQL执行报错: [Err] 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'cerebrum_sit.s.id' wh...

发表评论

访客

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