首頁 > 資料庫 > mysql教程 > 為什麼在沒有聚合函數的情況下 MySQL 的「GROUP BY」行為是不可預測的?

為什麼在沒有聚合函數的情況下 MySQL 的「GROUP BY」行為是不可預測的?

Susan Sarandon
發布: 2025-01-08 07:33:41
原創
562 人瀏覽過

Why is MySQL's `GROUP BY` behavior unpredictable without aggregate functions?

SQL 中GROUP BY 子句在無聚合函數情況下的行為

在沒有使用聚合函數的情況下執行 GROUP BY 查詢時,MySQL 傳回的行選擇並非一目了然。理解其底層行為對於調試此類場景和確保查詢結果的可靠性至關重要。

例如查詢 SELECT * FROM emp GROUP BY dept,伺服器選擇返回 Jill 和 Fred 而不是 Jack 和 Tom,這是由於 MySQL 使用了一種最佳化技術。然而,這種優化只有在省略的列(本例中為name 和salary)在每個組內具有相同值時才可靠(例如,Jill 和Tom 在組'a' 中具有相同的姓名和薪水,Fred和Tom 在組'b' 中具有相同的姓名和薪水)。

如果省略的列在群組內具有不同的值,則選擇是不確定的,這表示伺服器可以從群組中傳回任何行。 MySQL 文件中明確說明了此行為:

<code>使用此功能时,每个组中的所有行对于从 GROUP BY 部分省略的列都应具有相同的值。服务器可以自由返回组中的任何值,因此除非所有值都相同,否则结果是不确定的。</code>
登入後複製

當在 SELECT 子句中使用 * 而不是明確列舉列舉時,此行為會帶來問題。在提供的範例中,查詢 SELECT A.*, MIN(A.salary) AS min_salary FROM emp AS A GROUP BY A.dept 如果省略的列在群組內具有不同的值,則可能無法始終傳回每個部門的最低薪水行。

為了避免不確定的結果,強烈建議在 SELECT 子句中明確指定所需的列,確保省略的列在每個組內具有相同的值。應使用類似 SELECT A.* FROM emp AS A WHERE A.salary = (SELECT MAX(B.salary) FROM emp B WHERE B.dept = A.dept) 的查詢,而不是依賴不確定的行為。

以上是為什麼在沒有聚合函數的情況下 MySQL 的「GROUP BY」行為是不可預測的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板