在哪种情况下,应该在SQL中使用Distinct和Group by?

时间:2015-07-24 05:44:05

标签: sql sql-server sql-server-2008 group-by distinct

在接受采访时被问及。

堆栈溢出有很多答案,如

  1. 如果您使用汇总功能,请使用GROUP BY,例如AVG, MAX, MIN, SUM,COUNT.其他手DISTINCT只会删除重复项。

  2. 没有区别(至少在SQL Server中)。两个查询都使用相同的execution plan

  3. 我的实际问题是
     如果我们使用聚合函数,我们选择Group By函数

    如果我在查询中没有使用aggregate functions,那么在这种情况下

    1. 如果我们在那里使用Group by功能,为什么不能使用Distinct
      (因为两个查询都使用相同的execution plan。)

    2. 如果我们在那里使用Distinct功能,为什么不能使用Group by
      (两个查询都使用相同的execution plan。)

    3. 何时何地应使用Group byDistinct

3 个答案:

答案 0 :(得分:2)

如果你只想要不同的值,你可以使用我认为你已经确认的任何一种方法。

我想说如果你只是获取不同的值,请使用distinct来清楚地表明你只是这样做,如果你要将结果分组以进行聚合或任何其他原因,那么请使用group by。

答案 1 :(得分:0)

我也说在你没有聚合时使用distinct。使用group by需要稍微延长查询时间,并在调整group by时调整select子句。它还会增加出错的可能性,因为您可以继续group byselect删除的内容,这可能会导致您的查询实际上不返回不同的值。

此外,正如JamesZ所提到的,阅读代码的人更清楚。

答案 2 :(得分:0)

我的观点很清楚:distinct是万恶之源:)

为什么呢?因为通常distinct表示您在数据,数据结构或查询设计中存在一些冗余问题。或者即使您的数据正确且查询合乎逻辑,您也可以有效地隐藏重复值的来源 - 几个月之后,当您必须修改查询或回答客户问题时,您很难理解,在封面下会发生什么。当你需要添加一些aggergates时,事情会变得非常快。

使用group by,您需要清楚地思考 - 哪些数据是唯一的,哪些字段需要汇总,为什么某些数据会出现两次等等。

嗯,我有distinct的地方 - 简短的即席查询,找出使用的值。就像select distinct state from documents或类似 - 但是(经常发生)如果我需要知道下一个,我有多少种不同类型的记录,那么我必须使用聚合重写我的ad-hoc:select state, count(*) from documents group by state :)