對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結束,不存入查詢結果,直接檢測下一位同學。