別名 是 SQL 可讀性與無衝突查詢的基石。MySQL 完整支援標準 SQL AS 關鍵字,並允許省略 AS。本文詳細說明表別名、欄位別名的語法、作用域、常見用法 (自連接、多表同名欄位、衍生表)、以及省略 AS 的風險。
SELECT a.title, u.username FROM article AS a INNER JOIN user AS u ON a.uid = u.uid;
AS 可省略:FROM article a JOIN user u ...。FROM/JOIN 後開始,至該查詢塊 (含 WHERE、GROUP BY、ORDER BY、SELECT) 結束。WHERE 中使用尚未定義的別名 (需用原表名或子查詢)。| 場景 | 原因 |
|---|---|
| 自連接 | 同一表出現兩次,需區分左右實例 |
| 衍生表 | FROM (SELECT ...) AS dt 強制要求別名 |
| 多表同名欄位 | 消除 SELECT title 歧義 |
| 長表名簡化 | 提升可讀性,減少輸入錯誤 |
SELECT e.name AS employee, m.name AS manager FROM employee AS e LEFT JOIN employee AS m ON e.manager_id = m.id;
SELECT username AS name, email AS contact_email FROM user;
SELECT username AS `user name`。SELECT 清單 → ORDER BY、GROUP BY、HAVING 可直接使用別名;WHERE、**不可**使用別名 (邏輯執行順序:WHERE → SELECT)。-- article 與 user 皆有 title 欄位 SELECT a.title AS article_title, u.title AS user_title FROM article a JOIN user u ON a.uid = u.uid;
SELECT COUNT(*) AS article_count, AVG(views) AS avg_views FROM article GROUP BY uid;
無別名時,MySQL 自動產生 COUNT(*)、AVG(views) 作為欄位名,應用層解析極不便。
SELECT username name FROM user; -- 合法,name 為別名 SELECT username, name FROM user; -- 合法,name 為欄位名 (若存在) SELECT username name, email FROM user; -- 合法,name 為 username 別名
**風險**:若表新增 name 欄位,語意瞬間改變且不報錯。
AS**:語意明確、防誤改、便於靜態分析工具檢查。snake_case、有意義縮寫 (如 article_cnt)、避免保留字。WITH ranked AS (
SELECT uid, COUNT(*) AS cnt FROM article GROUP BY uid
)
SELECT r.uid, r.cnt FROM ranked r WHERE r.cnt > 5;
ranked) 即為表別名,後續引用必須加前綴 (r.cnt)。| 錯誤 | 原因 | 修正 |
|---|---|---|
Unknown column 'a.title' in 'where clause' | 別名 a 定義在子查詢外,WHERE 在子查詢內 | 將條件移至外層或在子查詢內使用原表名 |
Column 'title' in field list is ambiguous | 多表同名欄位未加前綴 | 加表別名前綴 a.title |
Every derived table must have its own alias | FROM (SELECT ...) 缺少 AS alias | 補上 AS dt |
| 別名在 WHERE 中無效 | 執行順序 WHERE → SELECT | 改用原欄位名、或包一層子查詢/CTE |
結語: 別名看似微小,實則是 SQL 工程化的關鍵細節。堅持「永遠寫 AS、統一命名規範、作用域清晰」,能消除 90% 的欄位歧義與維護陷阱,讓團隊協作與自動化工具更順暢。