首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL ORDER BY 與 GROUP BY 差異詳解:排序 vs 分組聚合

     編輯:關於SqlServer

一句話區別

ORDER BY:決定輸出結果集的行順序(升序/降序)。
GROUP BY:將資料分組聚合,每組輸出一行彙總結果,必須搭配聚合函數。

語法與用法對比

特性ORDER BYGROUP BY
核心目的排序顯示分類彙總
必需搭配無(可單獨用)聚合函數
欄位要求任意可排序欄位分組鍵 + 聚合函數包裹非分組欄位
結果行數不變減少(壓縮為組數)
典型函數無SUM、COUNT、AVG、MAX、MIN

實戰範例

ORDER BY:員工薪資排序

SELECT emp_name, salary
FROM employees
ORDER BY salary DESC, emp_name ASC  -- 多欄排序:薪資降序、同薪資按名字升序

GROUP BY:部門薪資統計

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 deptsalary 非分組欄位未聚合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 salarysalary 非分組欄位且未聚合GROUP BY dept ORDER BY AVG(salary)

進階:GROUPING SETS / ROLLUP / CUBE

單一查詢產生多層級彙總:

SELECT dept, job, COUNT(*), SUM(salary)
FROM emp
GROUP BY ROLLUP (dept, job)  -- 部門小計 + 總計
-- 或 GROUP BY CUBE (dept, job)  -- 所有維度組合小計
-- 或 GROUP BY GROUPING SETS ((dept), (job), ())  -- 自定義組合

總結

  • ORDER BY:調整顯示順序,不改變資料粒度。
  • GROUP BY:改變資料粒度(明細 → 彙總),必須配合聚合函數。
  • 兩者常聯合使用:先 GROUP BY 聚合,再 ORDER BY 排序彙總結果。
  • 記住順序:WHERE → GROUP BY → HAVING → SELECT → ORDER BY。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved