表 學生(學號, 姓名, 性別, 年齡),查詢年齡大於「王波」的學員姓名。
SELECT s1.姓名, s1.年齡, s1.性別
FROM 學生 s1, 學生 s2
WHERE s1.姓名 = '王波' AND s1.年齡 < s2.年齡;
結果:**輸出「王波」自己**(20 歲),而非年齡大於他的人。
SELECT s1.姓名, s1.年齡, s1.性別
FROM 學生 s1, 學生 s2
WHERE s2.姓名 = '王波' AND s1.年齡 > s2.年齡;
結果:張莉(21 歲)。
| 角色 | 錯誤 SQL | 正確 SQL |
|---|---|---|
| 基準行(王波) | s1 | s2 |
| 比較目標(其他學生) | s2 | s1 |
| WHERE 條件 | s1.姓名='王波' AND s1.年齡 < s2.年齡 | s2.姓名='王波' AND s1.年齡 > s2.年齡 |
| SELECT 欄位 | s1.*(基準行) | s1.*(比較目標) |
**核心邏輯**:
「找出年齡 > 王波的人」=「以王波為基準,找其他行年齡 > 王波年齡」。
→ 基準行別名(s2)放在 WHERE 過濾條件 姓名='王波'。
→ 比較目標別名(s1)放在 SELECT 與比較條件 年齡 > 基準.年齡。
SELECT s.姓名, s.年齡, s.性別
FROM 學生 s
JOIN 學生 wb ON wb.姓名 = '王波'
WHERE s.年齡 > wb.年齡;
語意清晰:wb 固定為王波行,s 遍歷所有學生,篩選年齡大於 wb 的行。
-- 找出與「王波」同性別且年齡較大的學員
SELECT s.姓名, s.年齡, s.性別
FROM 學生 s
JOIN 學生 wb ON wb.姓名 = '王波' AND s.性別 = wb.性別
WHERE s.年齡 > wb.年齡;
「自我連接,**基準行別名寫在 WHERE 過濾條件,目標行別名寫在 SELECT 和比較條件**。」
b / wb)。t / s。WHERE b.key = 'value' AND t.col > b.col。SELECT t.*。總結: 教程示例別名角色顛倒,導致查出基準行而非目標行。理清「基準 vs 目標」,改用明確 JOIN 語法,自我連接不再出錯。