前几天我学了一些关于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与聚合函数的使用。
当前回答
在这个特定的查询中没有区别。但是,当然,如果您添加任何聚合列,那么就必须使用group by。
其他回答
它们具有不同的语义,即使它们恰好在特定数据上具有相同的结果。
对于你发布的查询,它们是相同的。但对于其他查询,这可能不是真的。
例如,它不等同于:
SELECT C FROM myTbl GROUP BY C, D
我阅读了上面所有的评论,但除了聚合位之外,没有看到任何人指出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行。
原因就是我上面说的,这样他们就能表现得不一样!
在这个特定的查询中没有区别。但是,当然,如果您添加任何聚合列,那么就必须使用group by。
group by用于聚合操作——比如当您想要获得按列C分解的b的计数时
select C, count(B) from myTbl group by C
Distinct就是它听起来的样子——你得到唯一的行。
在sql server 2005中,查询优化器似乎能够优化掉我运行的简单示例中的差异。不过,不知道你是否能在所有情况下都指望它。