在MySQL 中,可以選擇不包含在聚合函數或GROUP BY 中的列子句,這可能會讓來自其他SQL 資料庫的程式設計師感到困惑。此行為偏離 ANSI SQL 標準,該標準要求所有選定的列都成為分組的一部分或出現在聚合函數中。
不明確的查詢和任意值選擇
當MySQL遇到這樣的查詢時,它會默默地從每個群組的欄位中傳回任意值,通常是組中第一行或最後一行的值。此行為可能會導致不明確的結果,特別是當非分組列中的值在每個組內不一致時。
範例查詢
考慮以下MySQL 查詢:
在此查詢中,col4 不是GROUP BY 子句或聚合函數的一部分。 MySQL 將為每個群組任意選擇一個 col4 值。如果群組中的不同行具有不同的 col4 值,這可能會出現問題。
函數依賴性和確定性結果
MySQL 允許在功能正常時選擇非分組資料列取決於 GROUP BY 子句中的欄位。這意味著對於分組列的每個值,非分組列只有一個可能的值。在這種情況下,查詢將傳回確定性結果。
但是,需要注意的是,MySQL 對於模糊查詢的行為可能會在未來版本中發生變化。因此,建議避免在 SELECT 子句中使用非分組列,除非它們明確包含在 GROUP BY 子句或聚合函數中。
"ONLY_FULL_GROUP_BY" SQL 模式
MySQL 5.7 引入了「ONLY_FULL_GROUP_BY」SQLSQL 模式,該模式強制執行GROSIUP 標準查詢的 ANROSI SQLSI。啟用此模式後,選擇沒有聚合函數的非分組列將導致錯誤。
以上是為什麼 MySQL 允許選擇不在 GROUP BY 子句中的欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!