SQL在什么场景下应该使用Distinct和Group by?
In which scenario Distinct and Group by should be used in SQL?
面试时问到的
Stack overflow中有很多答案喜欢
如果您使用聚合函数,请使用 GROUP BY
,例如 AVG, MAX, MIN, SUM,
和 COUNT.
另一方面 DISTINCT
只是删除重复项。
没有区别(至少在 SQL 服务器中)。两个查询使用相同的 execution plan
.
我的实际问题是
如果我们使用聚合函数,我们会选择 Group By
function
如果我没有在查询中使用 aggregate functions
,那么在这种情况下
如果我们在那里使用Group by
功能,为什么不能使用Distinct
?
(因为两个查询使用相同的 execution plan
。)
如果我们在那里使用Distinct
功能,为什么不能使用Group by
?
(两个查询使用相同的 execution plan
。)
何时何地应该使用 Group by
和 Distinct
?
如果你只是想要不同的值,你可以使用任何一种方法,我想你已经确认了。
我会说,如果您只是获取不同的值,请使用 distinct 来表明您只是在这样做,如果您出于聚合或任何其他原因对结果进行分组,请使用 group by。
我还建议您在不聚集时随时使用 distinct
。使用 group by
需要让您的查询稍长一些,并在您调整 select
时调整 group by
子句。它还增加了出错的机会,因为您可以继续 group by
从 select
中删除的内容,这可能会导致您的查询实际上 return 不同的值。
此外,正如 JamesZ 提到的,阅读您的代码的人会更清楚。
我的观点很明确:distinct
是万恶之源:)
为什么?因为通常 distinct
表示你在数据、数据结构或查询设计中存在一些冗余问题。或者即使您的数据是正确的并且查询是合乎逻辑的,然后您有效地隐藏了重复值的来源 - 几个月后,当您必须修改您的查询或回答您的客户问题时,您很难理解隐藏的情况。当你需要添加一些 aggergates 时,事情很快就会变得一团糟。
使用group by
需要想清楚——哪些数据是唯一的,哪些字段需要聚合,为什么有些数据会出现两次等等。
好吧,对我来说 distinct
有地方 - 简短的即席查询以找出使用了哪些值。像 select distinct state from documents
或类似的 - 但是(因为它经常发生)如果我接下来需要知道我有多少种不同的记录,那么无论如何我都必须使用聚合重写我的临时:select state, count(*) from documents group by state
:)
面试时问到的
Stack overflow中有很多答案喜欢
如果您使用聚合函数,请使用
GROUP BY
,例如AVG, MAX, MIN, SUM,
和COUNT.
另一方面DISTINCT
只是删除重复项。没有区别(至少在 SQL 服务器中)。两个查询使用相同的
execution plan
.
我的实际问题是
如果我们使用聚合函数,我们会选择 Group By
function
如果我没有在查询中使用 aggregate functions
,那么在这种情况下
如果我们在那里使用
Group by
功能,为什么不能使用Distinct
?
(因为两个查询使用相同的execution plan
。)如果我们在那里使用
Distinct
功能,为什么不能使用Group by
?
(两个查询使用相同的execution plan
。)
何时何地应该使用 Group by
和 Distinct
?
如果你只是想要不同的值,你可以使用任何一种方法,我想你已经确认了。
我会说,如果您只是获取不同的值,请使用 distinct 来表明您只是在这样做,如果您出于聚合或任何其他原因对结果进行分组,请使用 group by。
我还建议您在不聚集时随时使用 distinct
。使用 group by
需要让您的查询稍长一些,并在您调整 select
时调整 group by
子句。它还增加了出错的机会,因为您可以继续 group by
从 select
中删除的内容,这可能会导致您的查询实际上 return 不同的值。
此外,正如 JamesZ 提到的,阅读您的代码的人会更清楚。
我的观点很明确:distinct
是万恶之源:)
为什么?因为通常 distinct
表示你在数据、数据结构或查询设计中存在一些冗余问题。或者即使您的数据是正确的并且查询是合乎逻辑的,然后您有效地隐藏了重复值的来源 - 几个月后,当您必须修改您的查询或回答您的客户问题时,您很难理解隐藏的情况。当你需要添加一些 aggergates 时,事情很快就会变得一团糟。
使用group by
需要想清楚——哪些数据是唯一的,哪些字段需要聚合,为什么有些数据会出现两次等等。
好吧,对我来说 distinct
有地方 - 简短的即席查询以找出使用了哪些值。像 select distinct state from documents
或类似的 - 但是(因为它经常发生)如果我接下来需要知道我有多少种不同的记录,那么无论如何我都必须使用聚合重写我的临时:select state, count(*) from documents group by state
:)