語句:
SELECT a.EMPLOYEE_NAME as 姓名, b.EMPLOYEE_NAME as 管理者
FROM EMPLOYEES as a, EMPLOYEES as b
WHERE a.MANAGER is not null and a.MANAGER = b.EMPLOYEE_ID
疑問:`a`、`b` 在 `FROM` 中定義,但 `SELECT` 和 `WHERE` 中直接使用,為什麼「定義在後,使用在前」?
數據庫引擎解析 SQL 時,按固定邏輯順序執行,**別名在定義該子句時即生效,供後續子句使用**:
SELECT a.name AS n -- 列別名 n 在此定義
FROM table AS a -- 表別名 a 在此定義
WHERE a.id > 10 -- ✅ 可用表別名 a
GROUP BY a.dept -- ✅ 可用表別名 a
HAVING COUNT(*) > 1 -- ✅ 可用表別名 a
ORDER BY n -- ✅ 可用列別名 n (SELECT 已執行)
-- WHERE n = 'Tom' -- ❌ 錯誤:列別名 n 尚未定義
MySQL 為了兼容性,**允許** `WHERE n = 'Tom'`,但**不建議依賴**,遷移到 PostgreSQL/Oracle/SQL Server 會報錯。標準寫法:`WHERE a.name = 'Tom'` 或包一層子查詢。