在接受采访时被问及。
堆栈溢出有很多答案,如
如果您使用汇总功能,请使用GROUP BY
,例如AVG, MAX, MIN, SUM,
和COUNT.
其他手DISTINCT
只会删除重复项。
没有区别(至少在SQL Server中)。两个查询都使用相同的execution plan
。
我的实际问题是
如果我们使用聚合函数,我们选择Group By
函数
如果我在查询中没有使用aggregate functions
,那么在这种情况下
如果我们在那里使用Group by
功能,为什么不能使用Distinct
?
(因为两个查询都使用相同的execution plan
。)
如果我们在那里使用Distinct
功能,为什么不能使用Group by
?
(两个查询都使用相同的execution plan
。)
何时何地应使用Group by
和Distinct
?
答案 0 :(得分:2)
如果你只想要不同的值,你可以使用我认为你已经确认的任何一种方法。
我想说如果你只是获取不同的值,请使用distinct来清楚地表明你只是这样做,如果你要将结果分组以进行聚合或任何其他原因,那么请使用group by。
答案 1 :(得分:0)
我也说在你没有聚合时使用distinct
。使用group by
需要稍微延长查询时间,并在调整group by
时调整select
子句。它还会增加出错的可能性,因为您可以继续group by
从select
删除的内容,这可能会导致您的查询实际上不返回不同的值。
此外,正如JamesZ所提到的,阅读代码的人更清楚。
答案 2 :(得分:0)
我的观点很清楚:distinct
是万恶之源:)
为什么呢?因为通常distinct
表示您在数据,数据结构或查询设计中存在一些冗余问题。或者即使您的数据正确且查询合乎逻辑,您也可以有效地隐藏重复值的来源 - 几个月之后,当您必须修改查询或回答客户问题时,您很难理解,在封面下会发生什么。当你需要添加一些aggergates时,事情会变得非常快。
使用group by
,您需要清楚地思考 - 哪些数据是唯一的,哪些字段需要汇总,为什么某些数据会出现两次等等。
嗯,我有distinct
的地方 - 简短的即席查询,找出使用的值。就像select distinct state from documents
或类似 - 但是(经常发生)如果我需要知道下一个,我有多少种不同类型的记录,那么我必须使用聚合重写我的ad-hoc:select state, count(*) from documents group by state
:)