MySQL 對 GROUP BY 的擴充:遵守還是偏離 SQL 標準?
簡介
傳統上,在SQL Server 和其他RDBMS 中,選擇非聚合SQL 標準禁止不屬於聚合查詢中GROUP BY 子句的列。然而,在 MySQL 中,這種行為偏離了標準,引發了對 MySQL 遵守情況的質疑。
MySQL 的擴充 GROUP BY
在 1992 年之前的 SQL 版本中,標準確實禁止選擇未包含在 GROUP BY 子句中的非聚合欄位。然而,從 SQL-2003 開始,該標準允許選擇功能上依賴分組列的列。
MySQL 急於實現這一新標準,擴展了 GROUP BY 以允許選擇所有列,而不僅僅是那些功能上依賴於分組列的。雖然此擴充符合最新的 SQL 標準,但其實作偏離了預期行為。
MySQL 擴充的後果
允許SELECT 清單中的所有欄位,甚至是那些欄位不依賴功能,如果非分組依據欄位在群組內包含不同的值,則可能會導致不確定的結果。這種與標準的偏差可能會給用戶帶來混亂和不可預測的行為。
為了解決這個問題,MySQL 引入了 ONLY_FULL_GROUP_BY sql_mode,它禁用 MySQL 的擴展 GROUP BY 行為並恢復為更嚴格的 SQL -92 標準。
MySQL 的基本原理和比較其他 RDBMS
MySQL 進行此擴充的基本原理是效能最佳化。透過允許 SELECT 清單中的所有列,MySQL 可以避免不必要的排序和分組,從而提高效能。
但是,其他 RDBMS,例如 PostgreSQL 和更高版本的 MySQL(5.7)已經實現了更符合標準的方法透過識別函數依賴性並相應地限制 SELECT 清單中的非聚合列。這確保了效能並遵守 SQL 標準。
結論
MySQL 的擴展 GROUP BY 雖然受到 SQL 標準的啟發,但偏離了其預期的實現。這種擴展可能會導致不確定的結果,並且需要對函數依賴性有更細緻的理解。透過設定 ONLY_FULL_GROUP_BY sql_mode,使用者可以恢復到更嚴格的 SQL-92 行為。 MySQL 的更高版本 (5.7) 改進了 GROUP BY 的處理,以更好地符合標準。
以上是MySQL 的「GROUP BY」擴充符合 SQL 標準還是偏差?的詳細內容。更多資訊請關注PHP中文網其他相關文章!