2016-02-26 231 views
1

在MySQL中,以下工作: 案例1:奇怪的行爲

Select X , MAX(Y) from table 

但在MS SQL Server中,你會得到 「它沒有包含在聚合函數或GROUP BY條款。」

適當的方式將

Select X, MAX(Y) from table group by X 

更糟糕的是,在MySQL中,您可以: 案例2:

Select X, Y, MAX(Z) from table group by X 

我的問題是,MySQL如何確定在上述情況下在Y? 情況1中的X值如何?爲什麼MySQL允許這種奇怪的行爲?

+2

它並不決定它只是爲Y返回一個隨機值。對於這種畸變,Mysql在數據庫提供程序中是唯一的。5.7 AFAIK http://dev.mysql.com/doc/refman/5.7/en/sql- mode.html#sqlmode_only_full_group_by將默認啓用,結束此行爲。 – Mihai

+0

您希望退還X&Y的什麼價值? – PaulF

+0

@Mihai mysql在這方面並不是那麼獨特,sybase也有這個功能,在某些情況下,即使是teradata也支持它。 – Shadow

回答

1

關於group by handling的Mysql文檔詳細解釋了在使用group by時,mysql在某些配置設置下的行爲方式和原因。

正如@Mihai已經在他的評論中指出,MySQL有only full group by sql mode管轄是否

許可證查詢要求選擇列表,HAVING條件,或ORDER BY 列表,請參閱既不非聚合列在GROUP BY子句中命名爲 ,在功能上依賴於GROUP BY列(由唯一確定的 )。

允許放寬語法的原因是,在許多情況下,表/視圖可能包含功能上依賴於其他字段的字段。簡而言之:一個字段的值決定了其他字段的值。使用寬鬆的語法,您只需包含確定group by子句中其他字段值的字段。

如果使用鬆散的語法,但功能依賴不存在,那麼

服務器可以自由選擇從每個組的值,所以,除非他們 相同,所選值不確定,這可能是 不是你想要的。

實際上,mysql爲掃描數據時遇到的字段選擇第一個值,因此它不是完全隨機的。然而,依靠這個特性有點自殺,因爲mysql可以隨時改變這種行爲而沒有任何通知。

正如我在評論中已經指出的那樣,mysql並不是唯一的這種方法。Sybase also allows this relaxed syntax

Transact-SQL擴展至基團通過和具有

Transact-SQL擴展到標準SQL化妝顯示數據更 靈活,通過允許列和不用於創建組的 表達式引用或摘要計算:

包含聚合的選擇列表可以包含不是集合函數參數的擴展列,也不是包含在group by子句中的 。由於顯示了更多的行,所以擴展列會影響最終結果的顯示結果 。

它的行爲與mysql的不同。