【问题标题】:In which scenario Distinct and Group by should be used in SQL? [closed]SQL中应该在哪些场景下使用Distinct和Group by? [关闭]
【发布时间】:2015-10-14 16:24:31
【问题描述】:
在采访中被问到。
堆栈溢出里面有很多答案
如果您使用聚合函数,请使用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?
【问题讨论】:
标签:
sql
sql-server
sql-server-2008
group-by
distinct
【解决方案1】:
如果您只想要不同的值,您可以使用其中一种方法,我认为您已经确认了。
我想说,如果您只是获取不同的值,请使用 distinct 来表明您只是在这样做,如果您出于聚合或任何其他原因对结果进行分组,请使用 group by。
【解决方案2】:
我还建议在您不进行聚合的任何时候使用distinct。使用group by 需要使查询稍长一些,并在调整select 时调整group by 子句。它还增加了出错的可能性,因为您可以继续使用您从 select 中删除的内容 group by,这可能会导致您的查询实际上不返回不同的值。
此外,正如 JamesZ 所提到的,阅读您的代码的人会更清楚。
【解决方案3】:
我的观点很明确:distinct 是万恶之源 :)
为什么?因为通常distinct 表示,您在数据、数据结构或查询设计方面存在一些冗余问题。或者即使您的数据是正确的并且查询是合乎逻辑的,那么您有效地隐藏了重复值的来源 - 几个月后,当您必须修改您的查询或回答您的客户问题时,您很难理解在掩护下发生了什么。而当你需要添加一些 aggergates 时,事情很快就会变得一团糟。
使用group by需要你想清楚——哪些数据是唯一的,哪些字段需要聚合,为什么有些数据会出现两次等等。
嗯,distinct 对我来说有一个位置 - 简短的临时查询来找出使用了哪些值。就像select distinct state from documents 或类似的一样——但是(经常发生)如果我接下来需要知道我有多少不同类型的记录,那么无论如何我都必须使用聚合重写我的临时:select state, count(*) from documents group by state :)