MySQL 早期版本不支援子查詢(4.1 才引入),且舊專案常使用 mysql 擴展而非 mysqli,無法使用新特性。表別名讓同一張表在單一查詢中以不同身份出現多次,完美解決「自我關聯」場景。
假設分類表 categories:
cat_id:主鍵parent_id:父分類 ID,頂級為 NULL需求:刪除某分類($cat_id),其子分類的 parent_id 自動指向被刪除分類的父分類(即「扁平化」一層)。
-- 1. 鎖定本表及兩個別名,防止併發修改
LOCK TABLES `categories` WRITE, `categories` AS `c1` WRITE, `categories` AS `c2` WRITE;
-- 2. 更新:將 c1(子分類) 的 parent_id 指向 c2(父分類) 的 parent_id
UPDATE `categories` AS `c1`, `categories` AS `c2`
SET `c1`.`parent_id` = `c2`.`parent_id`
WHERE `c1`.`parent_id` = `c2`.`cat_id`
AND `c2`.`cat_id` = $cat_id;
-- 3. 刪除目標分類
DELETE FROM `categories` WHERE `cat_id` = $cat_id;
-- 4. 釋放鎖
UNLOCK TABLES;
LOCK TABLES 時需列出原表名與所有別名,否則後續 DML 會報錯 Table 'c1' was not locked with LOCK TABLES。UPDATE 的多表語法中視為獨立表,可正常 JOIN。SELECT u.name FROM `very_long_user_table_name` AS ubuyer、seller 兩個用戶角色。表別名不只是為了「寫少幾個字」,更是在不支援子查詢或為了效能時,將單表轉化為多表關聯的利器。善用別名 + 鎖表,能優雅解決樹狀結構的遞迴操作難題。