SQL中的group by用法

本文介绍了 SQL 中 GROUPBY 的两种实用场景:合理返回合计值避免笛卡尔积现象及通过分组找出重复记录的方法。通过具体例子展示了如何利用聚合函数和 HAVING 子句筛选出重复的数据。

GROUP BY 是分组查询, 一般 GROUP BY 是和 聚合函数配合使用

以下用两个例子说明两个使用方面,1是合理的返回合计值(防止笛卡尔积现象),2是用分组来找出重复的记录

===================================例子1======================================

如下面所示

A  B
1  abc
1  bcd
1  asdfg

select A,B from table group by A
你说这样查出来是什么结果,

A  B
    abc
1  bcd
    asdfg

右边3条如何变成一条,所以需要用到聚合函数,比如

select A,count(B) 数量 from table group by A
这样的结果就是
A  数量
1   3
===================================例子2======================================

假设又有这么一个表:tab_2,有这些字段:bh, xm, dah,……(编号、姓名、档案号、……),

比如有这样的情况:向该表录入数据的人员非常不认真,重复录入了不少数据,如:
bh``````xm```````dah
------------------------
1```````张三`````10001
2```````李四`````10002
3```````王五`````10003

………………

84``````张三`````10001
85``````赵六`````10004

………………

126`````王五`````10003

可以看出张三、王五各重复了一次,假设这个表有几万条数据,那么要查出究竟有多少重复的,该怎么查呢?

select bh, xm, dah
from tab_2
group by xm, sfzh
having count(*) >= 2;

返回值为:
bh``````xm```````dah
------------------------
1```````张三`````10001
84``````张三`````10001
3```````王五`````10003
126`````王五`````10003

解释一下刚才的SQL:是从tab_2表中检索编号、姓名、档案号,怎么检索呢?是用姓名、档案号做为分组,分组的条件是记录数大于等于2的。

这个比喻很形象:having count()语句相对于group by语句,就相当于where语句相对于select语句


group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面

SQL中,GROUP BY是一种用于将数据集按照指定的列进行分组的语句。它通常与聚合函数一起使用,以对每个分组进行计算和汇总。GROUP BY的基本原则是,select语句中没有使用聚合函数的列必须在GROUP BY子句中出现。 例如,假设我们有一个包含学生姓名和成绩的表格,我们想要按照班级对学生进行分组,并计算每个班级的平均成绩。我们可以使用以下SQL语句实现: SELECT 班级, AVG(成绩) FROM 学生表 GROUP BY 班级; 在这个例子中,我们使用了GROUP BY子句将学生表按照班级进行分组。然后,我们使用AVG函数计算每个班级的平均成绩。最后,我们在SELECT语句中选择了班级和平均成绩这两列。 需要注意的是,在GROUP BY子句中不能使用SELECT子句中定义的列的别名。因为GROUP BY子句的执行优先级高于SELECT,所以它并不知道SELECT中定义的列的别名。此外,GROUP BY子句的结果是随机的,所以不能依赖于结果的顺序。 总结起来,GROUP BY是一种用于将数据集按照指定的列进行分组的语句,它通常与聚合函数一起使用。它的基本原则是,select语句中没有使用聚合函数的列必须在GROUP BY子句中出现。 #### 引用[.reference_title] - *1* *2* [SQLgroup by用法总结](https://blog.youkuaiyun.com/u013242389/article/details/105331294)[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^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [详解SQLGroupBy用法](https://blog.youkuaiyun.com/weixin_28875235/article/details/113678629)[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^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值