MySQL 的 GROUP BY
子句:沒有聚合函數會出現意外結果
SQL 中的 GROUP BY
子句對於資料聚合至關重要。 然而,當 SUM
語句中沒有聚合函數(如 AVG
、COUNT
、SELECT
等)使用時,它的行為可能是違反直覺的,尤其是在 MySQL 中。
讓我們用一個例子來說明這一點。 考慮一個包含員工資料的表格 emp
:
name | dept | salary |
---|---|---|
Jack | a | 2 |
Jill | a | 1 |
Tom | b | 2 |
Fred | b | 1 |
以下查詢:
<code class="language-sql">SELECT * FROM emp GROUP BY dept;</code>
可能似乎意味著檢索所有不同的部門。 然而MySQL的輸出往往是:
name | dept | salary |
---|---|---|
Jill | a | 1 |
Fred | b | 1 |
為什麼是吉爾和弗雷德,而不是傑克和湯姆?
MySQL 的 GROUP BY
最佳化是罪魁禍首。如果沒有聚合函數,MySQL 可能會為 GROUP BY
子句中未包含的欄位選擇任意值。 此最佳化優先考慮速度,假設(在本例中錯誤)非分組列在每個組內是一致的。
要記住的重點:
GROUP BY
子句中的欄位時,MySQL 對這些欄位的值選擇是不可預測的。 ORDER BY
不保證確定性: 增加 ORDER BY
子句不會使結果在這種情況下具有確定性。 這個看似簡單的查詢凸顯了在 GROUP BY
子句中明確包含所有非聚合列的重要性,以確保結果可預測且可靠。 否則,您可能會獲得不一致且可能具有誤導性的數據。
以上是為什麼 MySQL 的 GROUP BY 子句在沒有聚合函數的情況下會產生意外的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!