假設籃球選手所屬球隊和球賽得分的二個資料表分別為:選手(識別碼, 姓名, 球隊)與球賽(識別碼, 場次, 得分),下列 SQL 查詢要找出那些球隊有從未上場過的球員:
SELECT DISTINCT 球隊
FROM 選手 P
WHERE ________ (
SELECT *
FROM 球賽 G
WHERE G.識別碼 = P.識別碼
);
請問空格處要填入那個運算子?
AEXISTS
BNOT EXISTS正確答案
CIN
DNOT IN
答案與詳解
B
正確答案
找『從未上場』的球員 → 子查詢無對應資料 → NOT EXISTS
為什麼答案是 B
NOT EXISTS 搭配相關子查詢(G.識別碼 = P.識別碼),表示該選手在球賽表找不到任何紀錄,即『從未上場』,完全符合題意。
載入中…
完整詳解
Pro · 無限
重點找『從未上場』的球員 → 子查詢無對應資料 → NOT EXISTS
秒殺技巧
關鍵字『從未』『不存在』→ 直覺聯想 NOT EXISTS;相關子查詢用 EXISTS 家族
逐選項分析
A✕
EXISTS 代表『存在對應資料』,會找出有上場過的球員,與題意『從未上場』相反。
B✓ 正確
NOT EXISTS 搭配相關子查詢(G.識別碼 = P.識別碼),表示該選手在球賽表找不到任何紀錄,即『從未上場』,完全符合題意。
C✕ 陷阱
IN 後面需接單欄位的值清單(如 IN (SELECT 識別碼 FROM...)),此處子查詢是 SELECT *,語法不符,且語意也錯誤。
D✕ 陷阱
NOT IN 語意雖接近,但同樣需接單欄位子查詢(SELECT 識別碼),此處為 SELECT * 無法使用;且 NOT IN 遇 NULL 會有陷阱。
SQL 存在性運算子比較
運算子
子查詢形式
語意
適用情境
EXISTS
SELECT * (相關子查詢)
存在對應列即為真
找有關聯的資料
NOT EXISTS
SELECT * (相關子查詢)
不存在對應列為真
找無關聯的資料(本題)
IN
SELECT 單欄位
值在清單中
值比對
NOT IN
SELECT 單欄位
值不在清單中
排除特定值(小心 NULL)
陷阱提醒
看到『從未』很多人直覺選 NOT IN,但要注意子查詢形式是 SELECT *(非單欄位)且有 WHERE G.識別碼=P.識別碼 的相關性,這是 EXISTS/NOT EXISTS 的典型結構,不是 IN/NOT IN。