簡介
MySQL 對 GROUP BY 的擴充子句允許選擇未包含在分組中的列,這引發了有關遵守 SQL 標準的問題。本文探討了這種偏差的歷史背景和影響。
標準
在 SQL-2003 之前,標準做法是禁止選擇非聚合不屬於 GROUP BY 子句的欄位。此限制透過消除不明確的分組來確保一致的結果。
MySQL 的擴展
MySQL 引入了一個擴展,允許選擇非聚合列,即使它們不屬於分組依據。根據 MySQL 文檔,這樣做是為了透過避免不必要的排序和分組來優化效能。但是,它有一個警告:非聚合值可能是不確定的,這意味著伺服器可以從每個群組中選擇任何值。
標準SQL 解釋
SQL-2003 標準允許選擇清單中的非聚合列參考(如果它們在功能上依賴於分組列或包含在聚合參數中)。函數依賴確保對於分組列的每個值,非聚合列都有一個唯一的值。
MySQL 的實作
MySQL 的擴充偏離標準允許選取所有資料列,即使是那些在功能上不依賴分組列的資料列。當非聚合值在群組內變化時,這可能會導致意外結果。
MySQL 擴展的後果
MySQL 的實現有兩個主要含義:
解決 MySQL 的偏差
MySQL使用者可以透過將 sql_mode 設為 ONLY_FULL_GROUP_BY 來停用非標準行為。此外,MySQL 5.7 中還引入了改進,以便更好地符合標準。 PostgreSQL 9.1 也提供了更嚴格的實現,嚴格遵守函數依賴要求。
以上是MySQL 的非標準 GROUP BY 行為是否違反 SQL 標準?的詳細內容。更多資訊請關注PHP中文網其他相關文章!