SQL语句中的 Distinct 和 Group by 有什么不同,用那个好?

2024-11-23 11:46:19
推荐回答(1个)
回答1:

我不给你转摘枯燥难读的文章,给你用例子说明:

不过,首先我要说:它俩的作用完全不同,如果你只把group by当做去掉重复记录的工具,就太小看它了,

善于使用它,将会为你的工作带来极大的便利,而且能够制作出非常科学高效的报表!

group by主要是用来分组的,怎么个分组呢?

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

====================================================================
★★★例子1:假如有这么一个表:tab_1,它有两个字段:xm、gzlb、je(姓名、工资类别、金额),具体数据如下:

xm```````gzlb`````````je
-----------------------------------------
张三`````养老金`````1000
张三`````护理费`````200
张三`````其他```````50

.............

李四`````养老金`````800
李四`````其他```````50

.............

王五`````养老金`````900
王五`````其他```````35

可以看出每个人的工资都是按类别存放的,如果要返回合计的数据,如:

张三``````1250
李四``````850
王五``````935

该怎么写SQL呢?初学者往往会这么写:select xm, sum(je) from tab_1;但结果会是什么样呢?结果将是:

张三``````1250
张三``````850
张三``````935
李四``````1250
李四``````850
李四``````935
王五``````1250
王五``````850
王五``````935

这是将全部字段都进行了所有的排列组合,即:笛卡尔积!要防止这个情况的发生,我们就可以用到group by(分组)了!
select xm, sum(je)
from tab_1
group by xm;

上面的SQL指定了用xm字段分组,这样一来就返回出正确的结果了:
张三``````1250
李四``````850
王五``````935

====================================================================
★★★例子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 这个分组语句是非常有用的一个好东西,还是那句话:善于使用它将会为你的工作带来极大的便利,而且能够制作出非常科学高效的报表!