2009-02-12 151 views
2

According to the documentation,MySQL中的MAX()和Min()聚集函数接受DISTINCT关键字:MySQL中的最大值(distinct ...)?

DISTINCT关键字可以用于 找出最大expr的不同 值的,但是,这将产生 与省略DISTINCT的结果相同。

也许我错过了一些东西,但是这怎么会有用呢?

UPDATE:

的MySQL ,违背了几个答案,支持不同的每一个聚合函数。 (),count(),min(),max(),group_concat()和sum()支持不同的特征。它不支持std(),variance(),其他几个统计函数或者按位集合函数。

+0

更好的问题可能是“为什么你会打扰防止这种情况?”。如果你正在为算术表达式指定一种语言,你会明确排除“+ 0”和“* 1”,因为它们什么都不做? – 2009-02-13 01:01:53

回答

0

据我所知,SQL92标准定义了五个聚合函数。这五个是平均值,数量,最大值,最小值和总和。巧合的是,这些都接受DISTINCT关键字。

*并由此我的意思是“不巧合”

5

它们将DISTINCT作为所有聚合函数进行操作,但是,当超过最大值时,可能存在多个值的事实是无关紧要的,因此它总是相同的。

计数是独特会产生不同结果的关键示例。

+0

同意。只需要明确OP:它对MIN()或MAX()没有用处,但只对那里有用,因为它支持所有聚合。 – dwc 2009-02-12 23:20:38

0

根据定义,不同集合的最大值将与具有重复集合的集合的最大值完全相同。

但是要回答你的问题,它可能会在select子句中的其他聚合函数中使用相同的不同值进行操作。

1

我认为它通常被允许/支持将DISTINCT放入聚合函数中,即使它在结果上没有差异。

-1

我也在挠我的脑袋;我唯一能想到的就是select max(foo)可能会执行表扫描来查找最大值,但选择max(distinct foo)可能会首先进入索引。也许这对于某些桌子尺寸更快?

+0

如果你在列上有一个索引,那么很明显`SELECT MAX(foo)`将使用该索引:升序(或降序)索引中的最后一个(或第一个)项将是具有最大值的那个。 – Quuxplusone 2014-02-21 18:05:53

1

值得一提的是,ANSI SQL标准规定全部聚合函数接受可选的DISTINCT关键字。在MIN()MAX()的情况下,这看起来没有意义,因为结果是相同的。

但对于其他集合函数,例如COUNT(),SUM()AVG()DISTINCT选项可能会影响结果。

我假设标准的SQL调用每个聚合函数来支持DISTINCT来简化语言的语法。支持DISTINCT没有任何影响,并且任何实现都可以自由地将其视为内部禁用操作。

+1

优秀的答案! – Quuxplusone 2014-02-21 18:06:52