資料庫NOT EXISTS的理解

2021-07-11 01:48:30 字數 2866 閱讀 2363

資料庫有查詢有四種運算:選擇、投影、連線、除運算;而not exists關鍵字則是基於除運算的查詢。

例如:sc表(sno是學生號,cno是課程號)

+-----------+-----+-------+

| sno | cno | grade |

+-----------+-----+-------+

| 201215121 | 1 | 92 |

| 201215121 | 2 | 85 |

| 201215121 | 3 | 88 |

| 201215122 | 2 | 90 |

| 201215122 | 3 | 80 |

+-----------+-----+-------+

student表

+-----------+--------+------+------+-------+

| sno | sname | s*** | sage | sdept |

+-----------+--------+------+------+-------+

| 201215121 | 李勇 | 男 | 20 | cs |

| 201215122 | 劉晨 | 女 | 19 | cs |

| 201215123 | 王敏 | 女 | 18 | ma |

| 201215125 | 張立 | 男 | 19 | is |

+-----------+--------+------+------+-------+

course表

+-----+--------------+------+---------+

| cno | cname | cpno | ccredit |

+-----+--------------+------+---------+

| 1 | 資料庫 | 5 | 4 |

| 2 | 數學 | null | 2 |

| 3 | 資訊系統 | 1 | 4 |

| 4 | 作業系統 | 6 | 3 |

| 5 | 資料結構 | 7 | 4 |

| 6 | 資料處理 | null | 2 |

| 7 | pascal語言 | 6 | 4 |

+-----+--------------+------+---------+

一. 查詢選修了全部課程的學生的姓名。此時,查詢涉及到三個表。查詢方式如下:

select sname

from student

where not exists // (1)沒有一門課程他沒選的 (對於某個sname)

(select *

from course

where not exists // (2)一門課程他沒選的。(對於某個cno)

(select *

from sc

where sno=student.sno and cno=course.cno));

因為,題目的意思也就是:

沒有一門課程他沒有選的。

可以將這個句子看成兩部分,所以:

最外層查詢:

沒有 就是代表不存在,也就是說,對於student,就是為了尋找符合

《沒有》 這個條件的sname;好的,這個語句的一部分工作完成了,接下來寫子語句的時候就不再考慮 《沒有》 條件。

第一層子查詢:

現在開始考慮 《一門課程他沒選的》 , 也就是說,現在的工作是:子查詢試圖努力找出一門他沒選的課程;即是,對於某個cno ,不存在 .... (然後開始第二層子查詢)。

第二層子查詢:

這個時候,又是對第一層查詢的否定了,這時候意思是:

對於從第二層查詢迭代來的cno , 看有沒有與內層cno相等的;且,sno=student.sno。

sno=student.sno作用:

圖.1 sno=student.sno作用

二.查詢至少選修了學生201215122選修的全部課程的學生號碼。

此時,查詢只涉及sc表。

即是:對於符合條件的y,不存在一門課程,201215122選了,而y學生沒有選。

select distinct sno

from sc s1

where not exists // 不存在

( select *

from sc s2

where s2.sno='201215122' and not exists // 201215122選了,y學生沒有選(對於被20121522選了的cno)

(select *

from sc s3

where s1.sno=s3.sno and s3.cno=s2.cno));

此處的s1.sno=s3.sno 的作用和圖.1一樣。

資料庫not exists 例題分析

查詢選修了所有課程的學生姓名 sc表 sno是學生號,cno是課程號 sno cno grade 201215121 1 92 201215121 2 85 201215121 3 88 201215122 2 90 201215122 3 80 student表 sno sname s sage ...

資料庫中的巢狀Not Exists語句

最近在準備複試,看到一道sql查詢題,涉及到兩層not exists,不是很理解,檢視了乙個dalao的解析之後,才明白了啥意思。查詢選修了所有課程的學生 的姓名 select sname from s where not exists select from c where not exists ...

資料庫正規化的理解

就是滿足了單一屬性不能再分割,正常情況下,你在資料庫裡建立的表肯定是滿足這個正規化的,要想不滿足這個正規化,可以在excel中嘗試合併單元格,拆分單元格體會下,就明白了。2nf 必須不存在非關鍵字段對組合的關鍵字段中的某些的依賴,比如某個表有 個關鍵字,但是它的非關鍵屬性 依賴第乙個關鍵字,非關鍵屬...