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

SELECT c FROM myTbl GROUP BY C

结果与:

SELECT DISTINCT C FROM myTbl

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

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

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


当前回答

我对它的理解是,使用distinct就相当于按照所选字段的顺序对它们进行分组。

i.e:

select distinct a, b, c from table;

等于:

select a, b, c from table group by a, b, c

其他回答

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

对于你发布的查询,它们是相同的。但对于其他查询,这可能不是真的。

例如,它不等同于:

SELECT C FROM myTbl GROUP BY C, D

当你指的是DISTINCT时,请不要使用GROUP BY,即使它们的工作方式是一样的。我假设您正在尝试从查询中减少毫秒数,我必须指出,开发人员的时间比计算机的时间要昂贵几个数量级。

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

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

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

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

在Hive (HQL)中,GROUP BY可以比DISTINCT快得多,因为前者不需要比较表中的所有字段。

参见:https://sqlperformance.com/2017/01/t-sql-queries/surprises-assumptions-group-by-distinct。