SQL在什么场景下应该使用Distinct和Group by?

In which scenario Distinct and Group by should be used in SQL?

面试时问到的

Stack overflow中有很多答案喜欢

  1. 如果您使用聚合函数,请使用 GROUP BY,例如 AVG, MAX, MIN, SUM,COUNT. 另一方面 DISTINCT 只是删除重复项。

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

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

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

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

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

何时何地应该使用 Group byDistinct

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

我会说,如果您只是获取不同的值,请使用 distinct 来表明您只是在这样做,如果您出于聚合或任何其他原因对结果进行分组,请使用 group by。

我还建议您在不聚集时随时使用 distinct。使用 group by 需要让您的查询稍长一些,并在您调整 select 时调整 group by 子句。它还增加了出错的机会,因为您可以继续 group byselect 中删除的内容,这可能会导致您的查询实际上 return 不同的值。

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

我的观点很明确:distinct是万恶之源:)

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

使用group by需要想清楚——哪些数据是唯一的,哪些字段需要聚合,为什么有些数据会出现两次等等。

好吧,对我来说 distinct 有地方 - 简短的即席查询以找出使用了哪些值。像 select distinct state from documents 或类似的 - 但是(因为它经常发生)如果我接下来需要知道我有多少种不同的记录,那么无论如何我都必须使用聚合重写我的临时:select state, count(*) from documents group by state :)