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

SELECT c FROM myTbl GROUP BY C

结果与:

SELECT DISTINCT C FROM myTbl

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

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

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


当前回答

功能效率是完全不同的。 如果你想只选择“返回值”,除了重复的一个,使用distinct比group by更好。因为“group by”包括(排序+删除),“distinct”包括(删除)

其他回答

在使用方面,GROUP BY用于对要计算的行进行分组。DISTINCT将不做任何计算。它不会显示重复的行。

如果我想要呈现无重复的数据,我总是使用DISTINCT。

如果我想做计算,比如合计芒果的总数,我会使用GROUP BY

你之所以注意到这一点,是因为你只选择了一列。

尝试选择两个字段,看看会发生什么。

Group By的用法如下:

SELECT name, SUM(transaction) FROM myTbl GROUP BY name

这将显示每个人的所有交易的总和。

GROUP BY允许您使用聚合函数,如AVG、MAX、MIN、SUM和COUNT。 另一方面,DISTINCT只是删除重复项。

例如,如果你有一堆购买记录,你想知道每个部门花了多少钱,你可能会这样做:

SELECT department, SUM(amount) FROM purchases GROUP BY department

这将为每个部门提供一行,其中包含部门名称和该部门所有行中所有金额值的总和。

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

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

从“SQL语言”的角度来看,这两种结构是等价的,你选择哪一种是我们都必须做出的“生活方式”选择之一。我认为DISTINCT更明确(因此对继承你代码的人更体贴)是一个很好的例子,但这并不意味着GROUP BY结构是一个无效的选择。

我认为“GROUP BY是用于聚合的”是错误的重点。人们应该意识到set函数(MAX, MIN, COUNT等)可以省略,这样他们就可以理解编码器的意图。

理想的优化器将识别等效的SQL结构,并始终相应地选择理想的计划。对于现实生活中选择的SQL引擎,您必须测试:)

PS注意DISTINCT关键字在select子句中的位置可能会产生不同的结果,例如对比:

SELECT COUNT(DISTINCT C) FROM myTbl;

SELECT DISTINCT COUNT(C) FROM myTbl;