Sql GROUP BY和DISTINCT之间有什么区别吗

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、

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

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更明确(因此更周密)