基本語法
SELECT `column_name` AS `alias_name` FROM `table`;
SELECT `column_name` `alias_name` FROM `table`; -- AS 可省略,建議保留
命名規則與限制
| 規則 | 說明 | 範例 |
| 含空格/特殊字元 | 必須用反引號包裹 | AS \`Total Amount\` |
| MySQL 關鍵字 | 建議用反引號避免衝突 | AS \`select\`, AS \`order\` |
| 大小寫敏感度 | 依 lower_case_table_names,預設 Linux 區分、Windows 不區分 | 統一用小寫底線 total_amount |
| 長度限制 | 最大 256 字元(MySQL 8.0) | 足夠長,勿過度縮寫 |
| 重複別名 | 同一 SELECT 別名不可重複 | 第二個同名會報錯 |
實戰範例
-- 1. 簡單別名
SELECT `first_name`, `last_name` FROM `users`;
-- 2. 運算結果別名
SELECT (`price` * `quantity`) AS `subtotal` FROM `order_items`;
-- 3. 聚合函數別名(必須,否則欄位名為 SUM(price))
SELECT SUM(`price`) AS `total_revenue` FROM `orders`;
-- 4. 字串串接別名
SELECT CONCAT(`first_name`, ' ', `last_name`) AS `full_name` FROM `users`;
-- 5. 含空格別名(需反引號)
SELECT COUNT(*) AS `User Count` FROM `users`;
-- 6. 子查詢別名(衍生表必須有別名)
SELECT * FROM (SELECT `id`, `name` FROM `users`) AS `u`;
PHP 變數映射:為什麼別名對程式開發至關重要
<?php
$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", 'root', 'pass');
// ❌ 無別名:陣列鍵名為運算式,難以使用
$stmt = $pdo->query("SELECT SUM(price), COUNT(*) FROM orders");
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// $row = ['SUM(price)' => '12345', 'COUNT(*)' => '100']
// 存取:$row['SUM(price)'] 很醜、易錯
// ✅ 有別名:陣列鍵名清晰、可直接對應變數/物件屬性
$stmt = $pdo->query("SELECT SUM(price) AS total_revenue, COUNT(*) AS order_count FROM orders");
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// $row = ['total_revenue' => '12345', 'order_count' => '100']
// 存取:$row['total_revenue'] 乾淨、可直接 json_encode 給前端
// 最佳:別名符合 PHP 變數命名規範(小寫底線)
$stmt = $pdo->query("SELECT SUM(price) AS total_revenue, COUNT(*) AS order_count FROM orders");
$data = $stmt->fetchAll(PDO::FETCH_CLASS, 'OrderSummary');
// class OrderSummary { public $total_revenue; public $order_count; }
?>
進階:別名在 ORDER BY、GROUP BY、HAVING 中的使用
-- ORDER BY 可用別名(標準 SQL 支援)
SELECT `name`, `price` * `qty` AS `total` FROM `items` ORDER BY `total` DESC;
-- GROUP BY 可用別名(MySQL 擴充支援)
SELECT `category`, COUNT(*) AS `cnt` FROM `products` GROUP BY `category` HAVING `cnt` > 10;
-- WHERE 不可用別名(執行順序:WHERE → SELECT 別名產生)
-- ❌ SELECT name, price*qty AS total FROM items WHERE total > 100;
-- ✅ 使用子查詢或重寫條件
SELECT * FROM (SELECT name, price*qty AS total FROM items) t WHERE total > 100;
-- ✅ 或直接重寫
SELECT name, price*qty AS total FROM items WHERE price*qty > 100;
避坑指南
| 坑點 | 現象 | 解決 |
| 別名用雙引號 | AS "Total" 在 ANSI_QUOTES 模式下被視為字串 | 統一用反引號 AS \`Total\` |
| 別名與表欄位同名 | SELECT id AS id FROM t 造成歧義 | 避免同名,或用表前綴 t.id AS user_id |
| GROUP BY 別名不生效 | 某些版本/模式不支援 | 用欄位位置 GROUP BY 1 或完整運算式 |
| UNION 別名以第一個查詢為準 | 後續查詢別名被忽略 | 第一個查詢定義好別名即可 |
| PDO::FETCH_CLASS 屬性名需與別名完全一致 | 大小寫、底線不匹配 → 屬性為 null | 別名用小寫底線,類別屬性對應 |
總結
MySQL 別名 AS 不只是好看,是 SQL 結果集與應用層資料結構的契約。核心原則:必加別名、用反引號、小寫底線命名、符合程式語言變數規範。善用別名讓 ORDER BY/HAVING 可讀、PDO::FETCH_CLASS 直接映射、API 回傳 JSON 乾淨無需轉換。