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

SELECT c FROM myTbl GROUP BY C

结果与:

SELECT DISTINCT C FROM myTbl

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

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

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


当前回答

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

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

Group By的用法如下:

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

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

其他回答

group by用于聚合操作——比如当您想要获得按列C分解的b的计数时

select C, count(B) from myTbl group by C

Distinct就是它听起来的样子——你得到唯一的行。

在sql server 2005中,查询优化器似乎能够优化掉我运行的简单示例中的差异。不过,不知道你是否能在所有情况下都指望它。

如果您只想删除重复项,请使用DISTINCT。如果你想应用聚合操作符(MAX, SUM, GROUP_CONCAT,…),请使用GROUPY BY,或HAVING从句)。

当你指的是DISTINCT时,请不要使用GROUP BY,即使它们的工作方式是一样的。我假设您正在尝试从查询中减少毫秒数,我必须指出,开发人员的时间比计算机的时间要昂贵几个数量级。

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

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

例子:

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

我阅读了上面所有的评论,但除了聚合位之外,没有看到任何人指出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行。

原因就是我上面说的,这样他们就能表现得不一样!