ORDER BY:決定輸出結果集的行順序(升序/降序)。
GROUP BY:將資料分組聚合,每組輸出一行彙總結果,必須搭配聚合函數。
| 特性 | ORDER BY | GROUP BY |
|---|---|---|
| 核心目的 | 排序顯示 | 分類彙總 |
| 必需搭配 | 無(可單獨用) | 聚合函數 |
| 欄位要求 | 任意可排序欄位 | 分組鍵 + 聚合函數包裹非分組欄位 |
| 結果行數 | 不變 | 減少(壓縮為組數) |
| 典型函數 | 無 | SUM、COUNT、AVG、MAX、MIN |
SELECT emp_name, salary FROM employees ORDER BY salary DESC, emp_name ASC -- 多欄排序:薪資降序、同薪資按名字升序
SELECT dept_name, COUNT(emp_id) AS emp_count, SUM(salary) AS total_salary, AVG(salary) AS avg_salary FROM employees GROUP BY dept_name ORDER BY total_salary DESC -- 群組結果再排序
→ 每部門一行,含人數、薪資總和、平均薪資。
SELECT select_list FROM table_source WHERE search_condition GROUP BY group_by_expression HAVING search_condition ORDER BY order_expression
GROUP BY 在 ORDER BY 之前執行。先分組聚合,產生彙總結果集,再對彙總結果排序。
| 錯誤寫法 | 錯誤原因 | 修正寫法 |
|---|---|---|
| SELECT dept, salary FROM emp GROUP BY dept | salary 非分組欄位未聚合 | SELECT dept, AVG(salary) FROM emp GROUP BY dept |
| SELECT dept, COUNT(*) FROM emp ORDER BY dept | 無 GROUP BY 卻用聚合 | SELECT dept, COUNT(*) FROM emp GROUP BY dept ORDER BY dept |
| GROUP BY dept ORDER BY salary | salary 非分組欄位且未聚合 | GROUP BY dept ORDER BY AVG(salary) |
單一查詢產生多層級彙總:
SELECT dept, job, COUNT(*), SUM(salary) FROM emp GROUP BY ROLLUP (dept, job) -- 部門小計 + 總計 -- 或 GROUP BY CUBE (dept, job) -- 所有維度組合小計 -- 或 GROUP BY GROUPING SETS ((dept), (job), ()) -- 自定義組合
WHERE → GROUP BY → HAVING → SELECT → ORDER BY。