Sql GROUP BY和DISTINCT之间有什么区别吗
前几天我学到了一些关于SQL的简单知识:Sql GROUP BY和DISTINCT之间有什么区别吗,sql,group-by,distinct,Sql,Group By,Distinct,前几天我学到了一些关于SQL的简单知识: SELECT c FROM myTbl GROUP BY C 其结果与: SELECT DISTINCT C FROM myTbl 我好奇的是,SQL引擎处理命令的方式是否有什么不同,或者它们真的是一样的吗 我个人更喜欢这种独特的语法,但我相信它比其他任何东西都更不习惯 编辑:这不是关于聚合的问题。groupby与聚合函数的使用是可以理解的。它们具有不同的语义,即使它们恰好对特定数据具有相同的结果。groupby允许您使用聚合函数,如AVG、MAX、
SELECT c FROM myTbl GROUP BY C
其结果与:
SELECT DISTINCT C FROM myTbl
我好奇的是,SQL引擎处理命令的方式是否有什么不同,或者它们真的是一样的吗
我个人更喜欢这种独特的语法,但我相信它比其他任何东西都更不习惯
编辑:这不是关于聚合的问题。
groupby
与聚合函数的使用是可以理解的。它们具有不同的语义,即使它们恰好对特定数据具有相同的结果。groupby
允许您使用聚合函数,如AVG
、MAX
、MIN
、SUM
和COUNT
。
另一方面,DISTINCT
只删除重复项
例如,如果您有一组购买记录,并且您想知道每个部门花费了多少,您可以执行以下操作:
SELECT department, SUM(amount) FROM purchases GROUP BY department
这将为每个部门提供一行,其中包含部门名称以及该部门所有行中所有
金额的总和。如果只想删除重复项,请使用DISTINCT
。如果要应用聚合运算符(MAX
,SUM
,GROUP\u CONCAT
,…,或具有
子句的),请使用GROUPY BY
。对于您发布的查询,它们是相同的。但对于其他可能不正确的查询
例如,它不同于:
SELECT C FROM myTbl GROUP BY C, D
select a, b, c from table group by a, b, c
如果将DISTINCT与多列一起使用,结果集将不会像GROUP BY那样分组,并且不能将聚合函数与DISTINCT一起使用。在该特定查询中没有区别。但是,当然,如果您添加任何聚合列,那么您必须使用group by。group by用于聚合操作——例如,当您希望获得按列C细分的B计数时
select C, count(B) from myTbl group by C
distinct就是它听起来的样子--您可以得到唯一的行
在SQLServer2005中,查询优化器似乎能够优化我运行的简化示例中的差异。不知道你是否能在所有情况下都相信这一点。你之所以注意到这一点,是因为你只选择了一列
尝试选择两个字段,看看会发生什么
Group By的用途如下:
SELECT name, SUM(transaction) FROM myTbl GROUP BY name
name
------
barry
dave
bill
dave
dave
barry
john
name count
-------------
barry 2
dave 3
bill 1
john 1
它将显示每个人的所有交易的总和。GROUP BY有一个与distinct函数不同的非常具体的含义
GROUP BY使用所选表达式对查询结果进行分组,然后可以应用聚合函数,这些函数将作用于每个组,而不是整个结果集
下面是一个可能有帮助的示例:
给定一个如下所示的表:
SELECT name, SUM(transaction) FROM myTbl GROUP BY name
name
------
barry
dave
bill
dave
dave
barry
john
name count
-------------
barry 2
dave 3
bill 1
john 1
此查询:
SELECT name, count(*) AS count FROM table GROUP BY name;
将产生如下输出:
SELECT name, SUM(transaction) FROM myTbl GROUP BY name
name
------
barry
dave
bill
dave
dave
barry
john
name count
-------------
barry 2
dave 3
bill 1
john 1
这显然与使用DISTINCT非常不同。如果要对结果进行分组,请使用group BY;如果只需要特定列的唯一列表,请使用DISTINCT。这将使您的数据库有机会根据您的需要优化查询。没有区别(至少在SQL Server中是这样)。两个查询使用相同的执行计划
如果涉及子查询,则可能存在差异:
没有区别(Oracle风格):
我认为在执行过程中可能存在细微差异。
我在Oracle 10g中检查了两个功能相当的查询的执行计划:
core> select sta from zip group by sta;
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 58 | 174 | 44 (19)| 00:00:01 |
| 1 | HASH GROUP BY | | 58 | 174 | 44 (19)| 00:00:01 |
| 2 | TABLE ACCESS FULL| ZIP | 42303 | 123K| 38 (6)| 00:00:01 |
---------------------------------------------------------------------------
core> select distinct sta from zip;
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 58 | 174 | 44 (19)| 00:00:01 |
| 1 | HASH UNIQUE | | 58 | 174 | 44 (19)| 00:00:01 |
| 2 | TABLE ACCESS FULL| ZIP | 42303 | 123K| 38 (6)| 00:00:01 |
---------------------------------------------------------------------------
中间的操作略有不同:“HASH GROUP BY”与“HASH UNIQUE”,但估计成本等是相同的。然后,我在启用跟踪的情况下执行了这些操作,两个的实际操作计数相同(除了第二个操作由于缓存而不必进行任何物理读取)
但我认为,由于操作名称不同,执行将遵循一些不同的代码路径,这可能会带来更显著的差异
我认为您应该更喜欢这种独特的语法。这不仅仅是习惯,它更清楚地表明了查询的目的。'对于所述的问题,回答在功能上是正确的;SQL Server足够聪明,可以意识到如果您使用“分组依据”而不使用任何聚合函数,那么您实际的意思是“不同的”——因此它会生成一个执行计划,就像您只使用“不同的”一样
然而,我认为重要的是要注意到他的反应——如果你不小心的话,傲慢地对待“分组”和“不同”可能会导致一些有害的陷阱。说这“不是关于聚合的问题”是不完全正确的,因为您询问的是两个SQL查询关键字之间的功能差异,其中一个是,用于聚合,另一个不是
锤子有时可以用来拧螺丝,但如果你手边有螺丝刀,何必麻烦呢
(出于此类比的目的,Hammer:rozzle::GroupBy:Distinct
和screw=>获取表列中唯一值的列表
)请不要在表示Distinct时使用GROUP BY,即使它们恰好工作相同。我假设您试图从查询中节省毫秒,我必须指出,开发人员的时间比计算机的时间要贵几个数量级。我一直理解的方式是,使用distinct与按您选择的每个字段的顺序分组是一样的
i、 e:
同:
SELECT C FROM myTbl GROUP BY C, D
select a, b, c from table group by a, b, c
从“SQL语言”的角度来看,这两种结构是等效的,您选择哪一种是我们都必须做出的“生活方式”选择之一。我认为有一个很好的理由可以让DISTINCT更明确(因此更周密)