前几天我学了一些关于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使用聚合函数。
它们具有不同的语义,即使它们恰好在特定数据上具有相同的结果。
从“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;
通常我们可以使用DISTINCT来消除表中特定列上的重复项。
在'GROUP BY'的情况下,我们可以应用聚合函数像 AVG, MAX, MIN, SUM和COUNT在特定列和获取 列名和它的聚合函数在同一列上产生。
例子:
select specialColumn,sum(specialColumn) from yourTableName group by specialColumn;
当你指的是DISTINCT时,请不要使用GROUP BY,即使它们的工作方式是一样的。我假设您正在尝试从查询中减少毫秒数,我必须指出,开发人员的时间比计算机的时间要昂贵几个数量级。