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中文網其他相關文章!