前几天我学了一些关于SQL的简单知识:

SELECT c FROM myTbl GROUP BY C

结果与:

SELECT DISTINCT C FROM myTbl

我好奇的是,SQL引擎处理命令的方式有什么不同,还是它们真的是一样的东西?

我个人更喜欢独特的语法,但我相信这更多是出于习惯而不是其他原因。

编辑:这不是一个关于聚合的问题。理解了GROUP BY与聚合函数的使用。


当前回答

我阅读了上面所有的评论,但除了聚合位之外,没有看到任何人指出Group By和Distinct之间的主要区别。

Distinct返回所有行,然后重复删除它们,而Group By则在算法逐条读取时重复删除行。

这意味着它们可以产生不同的结果!

例如,下面的代码会产生不同的结果:

SELECT distinct ROW_NUMBER() OVER (ORDER BY Name), Name FROM NamesTable

 SELECT ROW_NUMBER() OVER (ORDER BY Name), Name FROM NamesTable
GROUP BY Name

如果表中有10个名字,其中一个是另一个的副本,那么第一个查询返回10行,而第二个查询返回9行。

原因就是我上面说的,这样他们就能表现得不一样!

其他回答

如果对多个列使用DISTINCT,结果集将不会像使用GROUP BY那样进行分组,并且不能对DISTINCT使用聚合函数。

它们具有不同的语义,即使它们恰好在特定数据上具有相同的结果。

功能效率是完全不同的。 如果你想只选择“返回值”,除了重复的一个,使用distinct比group by更好。因为“group by”包括(排序+删除),“distinct”包括(删除)

MusiGenesis的回答在功能上是正确的,关于你的问题;SQL Server足够聪明,可以意识到如果你使用“Group By”而不使用任何聚合函数,那么你实际上的意思是“Distinct”——因此它会生成一个执行计划,就像你只是使用“Distinct”一样。

然而,我认为重要的是要注意Hank的回应-漫不经心的对待“Group By”和“Distinct”可能会导致一些有害的陷阱,如果你不小心的话。说这“不是一个关于聚合的问题”并不完全正确,因为您问的是两个SQL查询关键字之间的功能差异,其中一个是用于聚合的,而另一个不是。

锤子有时可以用来拧螺丝,但如果你手边有螺丝刀,那又何苦呢?

(为了便于类比,Hammer:螺丝刀::GroupBy: Distinct和screw =>获取表列中唯一值的列表)

如果你使用的GROUP BY没有任何聚合函数,那么在内部它将被视为DISTINCT,所以在这种情况下,GROUP BY和DISTINCT之间没有区别。

但是,当提供DISTINCT子句时,最好使用它来查找唯一的记录,因为GROUP BY的目标是实现聚合。