2016-07-12 77 views
1

最近我發現,儘管patientID在我Samples表複製,下面的查詢工作如果沒有指定聚合函數,MySQL會做什麼?

SELECT * FROM Samples GROUP BY patientID 

和多個列返回多個值。

默認使用哪種聚合函數?

+0

在非嚴格模式下,這是可能的。看看這個[doc](http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html) – 1000111

回答

3

首先,這是嚴重形成的SQL,你應該根本不使用它。

但它有什麼作用?它會根據PatientId返回一個結果集。 SELECT *指定的附加列來自數據中不確定的行。不能保證多餘的列甚至來自同一行。

實際上,值似乎來自遇到的第一行。但是,MySQL很清楚你不能依賴這種行爲。通常,您應該避免使用SELECT中未包含在GROUP BY中的未聚合列的聚合語句。其他數據庫不支持此語法(除非GROUP BY鍵在要聚合的數據上形成唯一/主鍵)。

1

MySQL不會出現在所有使用聚合函數。在這種情況下所選擇的記錄是不確定的,因爲documentation規定:

在這種情況下,服務器可以自由選擇從每個組中的任何值,所以,除非它們是相同的,所選擇的值是不確定的,這可能不是你想要的。

但是,您可能想知道爲什麼此功能甚至存在於第一位。如果你正在編寫一個查詢,你知道列中的所有值都是相同的,那麼這個特性可以通過不必編寫連接或子查詢來使GROUP BY嚴格遵從而節省一些工作。

+0

在數學上不可能將多個值轉換成一個值而不使用聚合函數。你所描述的是一些聚合函數(我稱之爲「選擇不可預測的值」) – Dims

0

無。如果沒有啓用ONLY_FULL_GROUP_BY SQL模式,然後MySQL allows

MySQL擴展到標準SQL使用GROUP BY的許可選擇列表,HAVING條件,或ORDER BY列表指非聚合列,即使列不在功能上依賴於GROUP BY列。這會導致MySQL接受前面的查詢。在這種情況下,服務器可以自由選擇每個組中的任何值,因此除非它們相同,否則所選的值是不確定的,這可能不是您想要的值。

此sql模式默認啓用v5.7.5。

0

由於您尚未指定MySQL服務器的版本,因此有兩種可能的答案。

以前的MySQL 5.7。5,以上查詢是有效的,但在GROUP BY沒有列出,也聚集了所有列如下評論:

的服務器可以自由地從每組中選擇任意值,所以除非它們是相同的,所選的值是不確定的。

https://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html

從MySQL 5.7.5,此行爲已更改和MySQL實現SQL99標準:如果他們在功能上是每可選功能T301

SQL99後來允許這樣nonaggregates依賴GROUP BY

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

因此,某些列可能有效,但查詢本身無效,因爲並非所有列在功能上都依賴於患者ID列(可能有血液和皮膚樣本)。

通常,使用SELECT *並不定義如何處理聚合查詢中的所有列。

TL; DR; MySQL之前的版本5.7.5會執行查詢並且結果是不可預測的,5.7.5之後的MySQL會拋出一個錯誤。

相關問題