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

SELECT c FROM myTbl GROUP BY C

结果与:

SELECT DISTINCT C FROM myTbl

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

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

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


当前回答

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

其他回答

没有区别(至少在SQL Server中)。两个查询使用相同的执行计划。

http://sqlmag.com/database-performance-tuning/distinct-vs-group

如果有子查询,可能会有区别:

http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/

没有区别(oracle风格):

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:32961403234212

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

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

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

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

通常我们可以使用DISTINCT来消除表中特定列上的重复项。

在'GROUP BY'的情况下,我们可以应用聚合函数像 AVG, MAX, MIN, SUM和COUNT在特定列和获取 列名和它的聚合函数在同一列上产生。

例子:

select  specialColumn,sum(specialColumn) from yourTableName group by specialColumn;

在Teradata透视图:

从结果集的角度来看,在Teradata中使用DISTINCT或GROUP BY并不重要。答案集是一样的。

从性能的角度来看,这是不一样的。

要了解什么会影响性能,您需要知道在使用DISTINCT或GROUP BY执行语句时Teradata上发生了什么。

在DISTINCT的情况下,行被立即重新分配,而不发生任何预聚合,而在GROUP BY的情况下,第一步完成预聚合,然后才在amp之间重新分配唯一值。

现在不要认为GROUP BY从性能角度来看总是更好。当您有许多不同的值时,GROUP BY的预聚合步骤不是很有效。Teradata必须对数据进行排序以删除重复项。在这种情况下,最好先重新分配,即使用DISTINCT语句。只有当有许多重复值时,GROUP BY语句可能是更好的选择,因为只有在重分发之后才执行重复数据删除步骤。

简而言之,DISTINCT vs. GROUP BY在Teradata中的意思是:

GROUP BY ->用于多个重复 DISTINCT ->没有或只有几个重复项。 在使用DISTINCT时,有时会耗尽AMP上的线轴空间。原因是重新分配立即发生,倾斜可能会导致AMP耗尽空间。

如果发生这种情况,使用GROUP BY可能会有更好的机会,因为在第一步中已经删除了重复项,并且在amp之间移动的数据更少。

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

例如,它不等同于:

SELECT C FROM myTbl GROUP BY C, D