首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

SQL 自我連接查詢:找出年齡大於「王波」的學員——別名混淆是關鍵

     編輯:程式設計疑難解答

題目

表 學生(學號, 姓名, 性別, 年齡),查詢年齡大於「王波」的學員姓名。

錯誤 SQL(教程示例)

SELECT s1.姓名, s1.年齡, s1.性別
FROM 學生 s1, 學生 s2
WHERE s1.姓名 = '王波' AND s1.年齡 < s2.年齡;

結果:**輸出「王波」自己**(20 歲),而非年齡大於他的人。

正確 SQL

SELECT s1.姓名, s1.年齡, s1.性別
FROM 學生 s1, 學生 s2
WHERE s2.姓名 = '王波' AND s1.年齡 > s2.年齡;

結果:張莉(21 歲)。

根因分析:別名角色搞反

角色錯誤 SQL正確 SQL
基準行(王波)s1s2
比較目標(其他學生)s2s1
WHERE 條件s1.姓名='王波' AND s1.年齡 < s2.年齡s2.姓名='王波' AND s1.年齡 > s2.年齡
SELECT 欄位s1.*(基準行)s1.*(比較目標)

**核心邏輯**:
「找出年齡 > 王波的人」=「以王波為基準,找其他行年齡 > 王波年齡」。
→ 基準行別名(s2)放在 WHERE 過濾條件 姓名='王波'。
→ 比較目標別名(s1)放在 SELECT 與比較條件 年齡 > 基準.年齡。

現代寫法:明確 JOIN 語法

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 語法,自我連接不再出錯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved