2009-02-12 150 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