mysql使用group by分组数据使用总结

mysql使用group by子句总结


分组数据的作用: 分组数据可以便于我们汇总表内容的子集,当我们使用group by分组数据的时候,会将表数据按照给出的列排序分组,分成多个逻辑组,我们可以对每个逻辑组使用聚集运算.


我们创建一个表test_one,来展示使用group by分组数据,group by子句告诉mysql按照哪些列来排序分组。

表test_one:

mysql> select * from test_one;
+----+-----+-----------+
| id | uid | shop_name |
+----+-----+-----------+
|  1 |   1 | 牙刷      |
|  2 |   1 | 牙膏      |
|  3 |   1 | 牙刷      |
|  4 |   2 | 笔        |
|  5 |   2 | 钢笔      |
|  6 |   2 | 牙刷      |
|  7 |   2 | 牙刷      |

+----+-----+-----------+

表简介:该表是用户买了什么东西的表,uid表示用户的id,shop_name表示用户买了什么东西.


1.使用单列排序分组数据.

我们可以使用单列来分组数据,将相同的值分到一个逻辑分组中,然后可以汇总每个分组的数据. 

场景:根据test_one表,我们获取每个用户购物多少次.

sql语句: select uid , count(*) from test_one group by uid; 

该sql使用uid列排序分组数据,我们使用count(*)聚集函数,汇总每个分组有多少行,获取每个用户购物多少次。

结果:

mysql> select uid ,count(*) from test_one group by uid;
+-----+----------+
| uid | count(*) |
+-----+----------+
|   1 |        3 |
|   2 |        4 |
+-----+----------+


2.使用多列排序分组数据.

group by子句可以使用多列来分组,使用多列分组的执行流程是:先按照第一列进行分组,分成多个逻辑分组,然后我们按照第二列进行的分组,第二列的分组是在第一列分组的基础上进行的,也就是说在第一列分组的基础上,将每个分组的数据按照第二列来进行分组,最后汇总数据的时候是在最后一个规定的分组上进行的。

场景:我们想获取用户购买每种商品购买了多少次.

sql语句:select uid ,shop_name,count(*) from test_one group by uid,shop_name;

该sql语句,先使用uid列进行分组,分组后的结果是用户购买了哪些商品,然后我们根据shop_name 进行分组,在按照uid分组的基础上,我们可以将用户购买的相同的商品分组,汇总数据是在最后一个规定的分组上.

结果:

mysql> select uid ,shop_name,count(*) from test_one group by uid,shop_name;
+-----+-----------+----------+
| uid | shop_name | count(*) |
+-----+-----------+----------+
|   1 | 牙刷      |        2 |
|   1 | 牙膏      |        1 |
|   2 | 牙刷      |        2 |
|   2 | 笔        |        1 |
|   2 | 钢笔      |        1 |
+-----+-----------+----------+

我们可以获取用户的购买某种商品多少次。


总结:group by子句列出的列必须是检索列。


如果有错误请大家指出,谢谢!



MySQL中,可以使用GROUP BY语句进行去重操作。GROUP BY语句将查询结果按照指定的字段分组,并返回每个分组的唯一值。通过这种方式,我们可以实现去重的效果。引用中提到了在MySQL使用GROUP BY时,查询的字段必须是GROUP BY分组的字段和聚类函数。这意味着,除了分组字段外,查询中的其他字段必须使用聚类函数来进行计算或统计。而且,在MySQL 8.0之前,GROUP BY会默认根据分组字段对结果进行排序。在能够利用索引的情况下,MySQL会避免额外的排序操作,但当无法利用索引进行排序时,MySQL优化器就不得不选择通过使用临时表来实现GROUP BY并进行排序。 举个例子来说明,在一个名为t1的表中,假设我们有以下结构和数据: ``` CREATE TABLE `t1` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `c1` VARCHAR(255) NULL DEFAULT '' COLLATE 'utf8_general_ci', `c2` VARCHAR(255) NULL DEFAULT '' COLLATE 'utf8_general_ci', `c3` VARCHAR(255) NULL DEFAULT '' COLLATE 'utf8_general_ci', PRIMARY KEY (`id`) USING BTREE, INDEX `c` (`c1`, `c2`, `c3`) USING BTREE )ENGINE=InnoDB; INSERT INTO `t1` (`c1`, `c2`, `c3`) VALUES ('A', 'B', 'C'), ('A', 'B', 'D'), ('B', 'C', 'D'); ``` 现在,如果我们想要使用GROUP BY去重列c1的值,我们可以执行以下查询: ``` SELECT DISTINCT `c1` FROM t1; ``` 这将返回去重后的c1列的值:A和B。 需要注意的是,使用GROUP BY进行去重操作可能会影响查询的性能,特别是当表中的数据量非常大时,因为MySQL可能需要使用临时表进行排序。因此,在使用GROUP BY进行去重时,请确保你的查询语句和数据量都是可管理的,并且性能可以接受。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MySQL - DISTINCT & GROUP BY 去重](https://blog.csdn.net/Dream_Weave/article/details/116848896)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MySQL——distinct与group by去重 / 松散索引扫描&紧凑索引扫描](https://blog.csdn.net/minghao0508/article/details/129783846)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值