GROUP BY 是 SQL 分組查詢的核心,通常搭配聚合函數(COUNT、SUM、AVG 等)使用。許多開發者在初學時容易誤解:分組後「非聚合欄位」該如何顯示?本文透過具體範例釐清核心原則。
假設資料如下:
| A | B |
|---|---|
| 1 | abc |
| 1 | bcd |
| 1 | asdfg |
若執行 SELECT A, B FROM table GROUP BY A,資料庫無法決定 B 欄位該顯示 abc、bcd 還是 asdfg,因為同一群組內有多個不同值。因此必須用聚合函數將多值「縮減」為單一值:
SELECT A, COUNT(B) AS 數量 FROM table GROUP BY A;
結果:
| A | 數量 |
|---|---|
| 1 | 3 |
這是 ANSI SQL 標準,也是避免邏輯錯誤的關鍵。若 SELECT 含有未聚合的欄位 C,則 GROUP BY 必須包含 C,否則查詢將報錯或產生不確定結果(視資料庫實作而定)。
ROW_NUMBER() OVER (PARTITION BY ...))而非 GROUP BY。HAVING 過濾群組,而非 WHERE(WHERE 作用於分組前)。掌握此原則,即可撰寫正確、高效的分組查詢。