首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 執行順序:SELECT 先於 ORDER BY,為何可用未 SELECT 欄位排序?

     編輯:程式設計綜合問答

SQL 邏輯執行順序(標準):

  1. FROM / JOIN
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT(含運算式、別名)
  6. ORDER BY
  7. LIMIT / OFFSET

為何 `SELECT id, name FROM tb ORDER BY age` 合法?

執行到 ORDER BY 時,SELECT 尚未投射最終欄位,關聯表的所有欄位仍在中間結果集中,故可引用 `age` 排序。最終輸出時才依 SELECT 清單裁剪欄位。

驗證實驗

-- PostgreSQL / MySQL / SQL Server 均可執行
EXPLAIN SELECT id, name FROM tb_student ORDER BY age;
-- 執行計畫會顯示 Sort Key: age

常見誤區

誤區事實
ORDER BY 只能用 SELECT 欄位可用表達式、未輸出欄位、聚合函式(配合 GROUP BY)
別名在 ORDER BY 不可用標準 SQL 允許 ORDER BY 使用 SELECT 別名(因 ORDER BY 在 SELECT 之後)
DISTINCT + ORDER BY 未 SELECT 欄位會報錯部分資料庫(如 PostgreSQL)要求 ORDER BY 欄位必須出現在 SELECT 清單

效能提示

  • 排序欄位加索引:`CREATE INDEX idx_age ON tb_student(age);`
  • 避免 `ORDER BY RAND()` 大表隨機排序,改用應用層抽樣。
  • 複合索引順序符合 `WHERE` + `ORDER BY` 可避免 filesort。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved