前几天我学了一些关于SQL的简单知识:
SELECT c FROM myTbl GROUP BY C
结果与:
SELECT DISTINCT C FROM myTbl
我好奇的是,SQL引擎处理命令的方式有什么不同,还是它们真的是一样的东西?
我个人更喜欢独特的语法,但我相信这更多是出于习惯而不是其他原因。
编辑:这不是一个关于聚合的问题。理解了GROUP BY与聚合函数的使用。
前几天我学了一些关于SQL的简单知识:
SELECT c FROM myTbl GROUP BY C
结果与:
SELECT DISTINCT C FROM myTbl
我好奇的是,SQL引擎处理命令的方式有什么不同,还是它们真的是一样的东西?
我个人更喜欢独特的语法,但我相信这更多是出于习惯而不是其他原因。
编辑:这不是一个关于聚合的问题。理解了GROUP BY与聚合函数的使用。
当前回答
对于你发布的查询,它们是相同的。但对于其他查询,这可能不是真的。
例如,它不等同于:
SELECT C FROM myTbl GROUP BY C, D
其他回答
如果对多个列使用DISTINCT,结果集将不会像使用GROUP BY那样进行分组,并且不能对DISTINCT使用聚合函数。
除了聚合函数的使用外,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
group by用于聚合操作——比如当您想要获得按列C分解的b的计数时
select C, count(B) from myTbl group by C
Distinct就是它听起来的样子——你得到唯一的行。
在sql server 2005中,查询优化器似乎能够优化掉我运行的简单示例中的差异。不过,不知道你是否能在所有情况下都指望它。
我知道这是一个旧帖子。但碰巧的是,我有一个查询,使用组通过只是返回不同的值时,使用该查询在蛤蟆和oracle报告一切都工作得很好,我的意思是一个很好的响应时间。当我们从Oracle 9i迁移到11g时,Toad中的响应时间非常好,但在报告中,完成报告需要35分钟,而使用以前的版本大约需要5分钟。
解决方案是通过使用DISTINCT更改组,现在报告在大约30秒内运行。
我希望这对有同样情况的人有用。
MusiGenesis的回答在功能上是正确的,关于你的问题;SQL Server足够聪明,可以意识到如果你使用“Group By”而不使用任何聚合函数,那么你实际上的意思是“Distinct”——因此它会生成一个执行计划,就像你只是使用“Distinct”一样。
然而,我认为重要的是要注意Hank的回应-漫不经心的对待“Group By”和“Distinct”可能会导致一些有害的陷阱,如果你不小心的话。说这“不是一个关于聚合的问题”并不完全正确,因为您问的是两个SQL查询关键字之间的功能差异,其中一个是用于聚合的,而另一个不是。
锤子有时可以用来拧螺丝,但如果你手边有螺丝刀,那又何苦呢?
(为了便于类比,Hammer:螺丝刀::GroupBy: Distinct和screw =>获取表列中唯一值的列表)