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

select Distinct 品名,单位 from [表]



select 品名,单位 from [表]
Group by 品名,单位

查询的结果是一样的,都是把相同的记录合并为一条,这两个有什么不同,用那一个好一点?

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

不过,首先我要说:它俩的作用完全不同,如果你只把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 这个分组语句是非常有用的一个好东西,还是那句话:善于使用它将会为你的工作带来极大的便利,而且能够制作出非常科学高效的报表!
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-12-02
两个意义不同,前者只是排除重复项,即关键字相同的几条记录只显示一条,而Group by 品名,单位是把 品名,单位相同的项进行小计

一个有计算小计的作用,一个没有,怎么会一样呢?
如果你仅仅要求去掉重复记录,确实看不到区别,但如果需要计算就看出区别了。
第2个回答  2008-12-02
distinct 关键字是指定 Field 不重复输出,如果是 * 来指定,那就所有项都不重复输出,(过滤重复项).

group by 是按指定的 Field 项来分组查询.

两者大不相同,多尝试几次就明白了!
第3个回答  2008-12-02
distinct 在结果集里,过滤重复项
GROUP BY 是聚集函数,用于分组的统计信息

两者的目的是不同的
第4个回答  2008-12-02
distinct 在结果集里,过滤重复项
GROUP BY 是聚集函数,用于分组的统计信息

两者的目的是不同的

参考资料:rikky726

SQL语句中的 Distinct 和 Group by 有什么不同,用那个好?
distinct能实现的功能,group by都可以实现,且group by 更为功能强大

SQL去重是用DISTINCT好,还是GROUP BY好?
使用GROUP BY去重 对比DISTINCT,GROUP BY同样具备去重功能。在不同数据重复量的场景下,其执行效率表现出一定的差异。当数据重复量较大时,使用GROUP BY进行去重的执行时间通常略低于使用DISTINCT。这是因为GROUP BY在分组后进行操作,可以减少不必要的数据处理。然而,当数据重复量较低时,使用DISTINCT进行...

group by与distinct有何区别
group by 功能更强大一些,另外推荐使用group by。因为distinct会导致全表扫描,而group by如果索引建的恰当的话,会有性能上的提高。

distinct 和 group by 在查询多列数据去重复时的区别在哪
distinct只是将重复的行从结果中出去;group by是按指定的列分组,一般这时在select中会用到聚合函数。distinct是把不同的记录显示出来。group by是在查询时先把纪录按照类别分出来再查询。group by 必须在查询结果中包含一个聚集函数,而distinct不用。

sqlserver 用distinct和group by哪个效率高
sql server数据库进行查询语句时,distinct和group by的效率比较,group by的效率更高一点,因为group by通过group进行排序而distinct是全表排序资源消耗更多。所以,group by效率更高。

mysql的group by和distinct的区别
DISTINCT操作只需要找出所有不同的值就可以了。而GROUP BY操作还要为其他聚集函数进行准备工作。从这一点上将,GROUP BY操作做的工作应该比DISTINCT所做的工作要多一些。除此之外,基本上看不到DISTINCT和GROUP BY(没有聚集函数的情况)有什么区别,而且从执行效率上也看不到明显的差异;

对单个字段的结果进行去重,用distinct执行效率快,还是用group by快
distinct方式就是两两对比,需要遍历整个表。group by分组类似先建立索引再查索引,所以两者对比,小表destinct快,不用建索引。大表group by快。一般来说小表就算建索引,也不会慢到哪去,但是如果是TB级大表,遍历简直就是灾难。所以很多ORACLE项目都禁止使用distinct语句,全部要求替换成group by。

mysql下distinct 和group by的区别
这两者本质上应该没有可比性,distinct 取出唯一列,group by 是分组,但有时候在优化的时候,在没有聚合函数的时候,他们查出来的结果也一样。一、group by英 [ɡru:p bai] 美 [ɡrup baɪ][计][WIN]分组依据

group by和distinct效果一样 是这样吗
如果只是为了去重,那么意义是一样的,但是group by应用的范围更广泛一些 如分组汇总,或者从聚合函数里筛选数据等 譬如:统计每个id的个数,并且只显示个数大于3个的 select id ,count(id) from table_name group by id having count(*)>3 这个是distinct做不到的 ...

MySQL中distinct和group by性能比较
在MySQL这个广泛应用的关系型数据库中,DISTINCT和GROUP BY都具备去除重复数据的功能,但它们在性能上的差异引人关注。本文通过实际测试,比较了在不同情况下它们的效率。首先,我们通过创建测试表,插入大量数据,并进行无索引和有索引的情况下的查询。结果显示,加索引后,DISTINCT查询的速度提升了107倍,...

相似回答