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

SELECT c FROM myTbl GROUP BY C

结果与:

SELECT DISTINCT C FROM myTbl

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

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

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


当前回答

如果您只想删除重复项,请使用DISTINCT。如果你想应用聚合操作符(MAX, SUM, GROUP_CONCAT,…),请使用GROUPY BY,或HAVING从句)。

其他回答

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

除了聚合函数的使用外,group by子句和distinct子句之间没有显著区别。 两者都可以用来区分值,但如果在性能的角度组由更好。 在使用distinct关键字时,内部采用排序操作,可在执行计划中查看。

试试简单的例子

Declare @tmpresult table
(
  Id tinyint
)

Insert into @tmpresult
Select 5
Union all
Select 2
Union all
Select 3
Union all
Select 4


Select distinct 
Id
From @tmpresult

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

例如,它不等同于:

SELECT C FROM myTbl GROUP BY C, D

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

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

在这个特定的查询中没有区别。但是,当然,如果您添加任何聚合列,那么就必须使用group by。