對SQL 子查詢 NOT EXISTS 的一點理解

對SQL 子查詢 NOT EXISTS 的一點理解

  首先,瞭解一下NOT EXISTS在子查詢中的用法

SELECT--1號SELECT
FROM table 
WHERE NOT EXISTS (
SELECT--2號SELECT
FROM table
WHERE)

  要使1號SELECT查詢中的WHERE爲真,則需要2號SELECT查詢結果爲空。
  接下來看一個例子。

學生表

在這裏插入圖片描述

學生選課表

在這裏插入圖片描述

  • 以以下查詢語句爲例

要求:查詢至少選修了學號爲“g0940201”的學生所選修的所有課程的學生的學號和姓名。

SELECT S.學號, S.學生姓名			--1號SELECT
FROM [學生] S
WHERE NOT EXISTS (
	SELECT *						--2號SELECT
    FROM [學生選課] A
    WHERE A.學號='g0940201' 
    AND NOT EXISTS (
    	SELECT *					--3號SELECT
    	FROM [學生選課] B 
        WHERE S.學號 = B.學號 
        AND B.課程號 = A.課程號
    )
);

  在3號SELECT中,查詢指定學生A每一個所選課B學生是否也選了,如果選了,3號SELECT有結果,2號SELECT中的WHERE值爲假,2號SELECT無查詢結果。如果所有課程檢測完畢,2號SELECT一直無查詢結果,那麼1號SELECT中的WHERE值爲真,對下一位同學進行檢測。如果出現一門課學生A選了,學生B沒選,此時3號SELECT無結果,2號SELECT中的WHERE值爲真,2號SELECT有查詢結果,1號SELECT中的WHERE值將一直爲假,直到所有課程檢測完畢,對下一位同學進行檢測。

狀態機

在這裏插入圖片描述
  輸入隊列爲A同學所選所有課程,條件爲B同學是否選擇這門課程。如果以狀態2結束,存入查詢結果,檢測下一位同學,如果以狀態3結束,不存入查詢結果,直接檢測下一位同學。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章