資料庫有查詢有四種運算:選擇、投影、連線、除運算;而not exists關鍵字則是基於除運算的查詢。
例如:sc表(sno是學生號,cno是課程號)
student表+-----------+-----+-------+
| sno | cno | grade |
+-----------+-----+-------+
| 201215121 | 1 | 92 |
| 201215121 | 2 | 85 |
| 201215121 | 3 | 88 |
| 201215122 | 2 | 90 |
| 201215122 | 3 | 80 |
+-----------+-----+-------+
course表+-----------+--------+------+------+-------+
| sno | sname | s*** | sage | sdept |
+-----------+--------+------+------+-------+
| 201215121 | 李勇 | 男 | 20 | cs |
| 201215122 | 劉晨 | 女 | 19 | cs |
| 201215123 | 王敏 | 女 | 18 | ma |
| 201215125 | 張立 | 男 | 19 | is |
+-----------+--------+------+------+-------+
+-----+--------------+------+---------+
| 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學生沒有選。
此處的s1.sno=s3.sno 的作用和圖.1一樣。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));
資料庫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 必須不存在非關鍵字段對組合的關鍵字段中的某些的依賴,比如某個表有 個關鍵字,但是它的非關鍵屬性 依賴第乙個關鍵字,非關鍵屬...