前几天我学了一些关于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与聚合函数的使用。
当前回答
我知道这是一个旧帖子。但碰巧的是,我有一个查询,使用组通过只是返回不同的值时,使用该查询在蛤蟆和oracle报告一切都工作得很好,我的意思是一个很好的响应时间。当我们从Oracle 9i迁移到11g时,Toad中的响应时间非常好,但在报告中,完成报告需要35分钟,而使用以前的版本大约需要5分钟。
解决方案是通过使用DISTINCT更改组,现在报告在大约30秒内运行。
我希望这对有同样情况的人有用。
其他回答
我对它的理解是,使用distinct就相当于按照所选字段的顺序对它们进行分组。
i.e:
select distinct a, b, c from table;
等于:
select a, b, c from table group by a, b, c
在这个特定的查询中没有区别。但是,当然,如果您添加任何聚合列,那么就必须使用group by。
功能效率是完全不同的。 如果你想只选择“返回值”,除了重复的一个,使用distinct比group by更好。因为“group by”包括(排序+删除),“distinct”包括(删除)
在Hive (HQL)中,GROUP BY可以比DISTINCT快得多,因为前者不需要比较表中的所有字段。
参见:https://sqlperformance.com/2017/01/t-sql-queries/surprises-assumptions-group-by-distinct。
你之所以注意到这一点,是因为你只选择了一列。
尝试选择两个字段,看看会发生什么。
Group By的用法如下:
SELECT name, SUM(transaction) FROM myTbl GROUP BY name
这将显示每个人的所有交易的总和。