S(sno, sname, age, birthday)SC(sno, cno, grade)SELECT s.sno, s.sname
FROM S
WHERE NOT EXISTS (
SELECT 1 FROM SC
WHERE SC.sno = S.sno
AND SC.cno = '1001'
);
-- LEFT JOIN + IS NULL
SELECT s.sno, s.sname
FROM S
LEFT JOIN SC ON S.sno = SC.sno AND SC.cno = '1001'
WHERE SC.sno IS NULL;
-- NOT IN (注意 NULL 陷阱)
SELECT sno, sname FROM S
WHERE sno NOT IN (SELECT sno FROM SC WHERE cno = '1001');
SC(sno, cno) 建立聯合索引,子查詢極快。NOT EXISTS 語義最清晰,優化器通常轉為 Anti-Join,性能最優。NOT IN 子查詢返回 NULL 導致結果集為空的陷阱。掌握 NOT EXISTS 反模式,未選課/未登錄/未購買等「缺失查詢」一網打盡。