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

SQL 查詢未選某課程的學生:NOT EXISTS 子查詢標準寫法

     編輯:程式設計疑難解答

表結構

  • S(sno, sname, age, birthday)
  • SC(sno, cno, grade)

標準 SQL

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 反模式,未選課/未登錄/未購買等「缺失查詢」一網打盡。

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