MySQL GROUP BY 中的非聚合列:與標準的偏差
MySQL 的GROUP BY 實現允許包含非聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚合列即使它們未聚集包含在分組標準中,也會出現在SELECT 清單中。此行為與 ANSI SQL 標準不同,後者禁止在此類查詢中選擇非分組資料列。
這種差異源自於函數依賴的概念。在 MySQL 中,如果非分組列在功能上依賴分組列,MySQL 會默默地選擇並傳回該列的單一值。但是,需要注意的是,如果不強制執行函數依賴,則此類查詢可能會導致不明確的結果。
例如,以下查詢在 ANSI SQL 中將無效:
SELECT AVG(table1.col1), table1.personID, persons.col4 FROM table1 JOIN persons ON (table1.personID = persons.id) GROUP BY table1.personID;
在 MySQL 中,允許此查詢,因為 Persons.col4 在功能上透過連結依賴 table1.personID。但是,如果多個人具有相同的 personID,則 Persons.col4 的結果可能是任意的。
為了防止這種歧義,MySQL 提供了 ONLY_FULL_GROUP_BY SQL 模式,該模式強制執行符合 ANSI 標準的更嚴格的分組規則。預設情況下,此模式未啟用,但可以啟動它以確保查詢遵循標準行為。
請注意,SQLite 也允許在 GROUP BY 查詢中使用非聚合列,但它選擇最後一個值在一組中而不是任意一個中。不應依賴此行為,因為它可能在未來版本中發生變化。為了避免歧義,建議將查詢重寫為明確且確定的。
以上是MySQL 如何處理 GROUP BY 子句中的非聚合資料列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!