簡體   English   中英

為什么這個MySQL語句中的GROUP BY子句沒有拋出錯誤?

[英]Why isn't the GROUP BY clause in this MySQL statement throwing errors?

我在這里使用w3s作為我的例子

SELECT Shippers.ShipperName,COUNT(Orders.OrderID) AS NumberOfOrders,
    Orders.OrderDate 
FROM Orders
LEFT JOIN Shippers
ON Orders.ShipperID=Shippers.ShipperID
GROUP BY ShipperName;

我很困惑為什么上面的陳述沒有拋出錯誤。 當我們通過所有OrderID進行聚合時,MySQL如何知道要使用哪個OrderDate

當我們通過所有OrderID進行聚合時,mysql如何知道要使用哪個OrderDate?

它沒有。 它只選擇一個,因為它假定您將按所有必需的列進行分組,並且任何不在GROUP BY且不受任何聚合函數約束的列將為每個組具有相同的值。

這是非標准行為,可用作優化,允許服務器將源行中每個組的一個值“泄漏”到結果集中,從而減少GROUP BY必須管理的數據大小。 每個組使用哪個源行的值是未定義的,因此這僅用於非分組列在功能上依賴於分組列的查詢...因為,在這種情況下,“哪個”行不會無所謂,因為他們在每個小組中都是一樣的。

MySQL擴展了GROUP BY的標准SQL使用,因此選擇列表可以引用GROUP BY子句中未命名的非聚合列。 這意味着[不包括非聚合列的查詢]在MySQL中是合法的。 您可以通過避免不必要的列排序和分組來使用此功能來獲得更好的性能。 但是,當GROUP BY中未命名的每個非聚合列中的所有值對於每個組都相同時,這非常有用。 服務器可以自由選擇每個組中的任何值,因此除非它們相同,否則所選的值是不確定的。 此外,添加ORDER BY子句不會影響每個組中值的選擇。 [強調補充]

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

您可以通過在@@ SQL_MODE中包含ONLY_FULL_GROUP_BY來禁用此行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM