遙想公瑾當年小喬出嫁了,錯,亂入的什麼東西,就是上學沒好好學,之後花費大把大把的時間進行補習,沒有了學校的環境真的好難,有人會說“這樣的語法是給那些思路特別的人用的”,但是怎麼辦,考試會考啊,你學不學?
目錄
第一章、高山仰止
數據庫系統概論-數據查詢-嵌套查詢 人大老師杜小勇版本視頻。
數據庫系統概論(第5版)
看視頻的時候覺得好多人都說,看不懂,聽不懂,其實是我們這代人心太浮了,老師講的好好的,我們需要認真聽,認真聽,再認真聽,實在不行就看看我的文章和我錄製的視頻。哈哈。
第二章、閉門讀書
不講原理和底層執行順序啥的,就是隨便聊聊。
類比於in:
in理解爲先求出後面表的計算結果或者說範圍,再在主表中看條件是否滿足。
exist是先在主表中取出要的結果,之後去後面的循環檢查是否exist或者不存在,是否滿足後面的條件。
用not exists都比not in要快。
注意:存在一種not in 會導致索引失效
select * from A where c2 not in (select c2 from B); -->執行結果:無
先取 (select c2 from B) 【2,NULL】;使用not in 的時候,如果not in後面的選項中有null,不會查詢出來任何數據。sql語句本身直接返回false。
select * from A where not exists(select 1 from B where B.c2=A.c2) -->執行結果:1 3
先取前面的 【1,2】 、【1,3】 一結合就得【1,3】
exists [ɪɡˈzɪsts] (返回結果集,爲真)
not exists (不返回結果集,爲真)
--------------------------------------------------------------
(一)比如說你要判斷某班是否存在一個名爲"Kevin"的學生,我們可以用in 運算:
"Kevin" in (select SNAME from Student)
這樣(select SNAME from Student) 返回的是一個全班姓名的集合,in用於判斷"Kevin"是否爲此集合中的一個數據;
同時,我們也可以用exists語句:
exists (select * from Student where SNAME="Kevin")
(二)SELECT id FROM table WHERE name not exists (SELECT 1 FROM table where name=‘aaa’)
查詢name不等於aaa的所有ID
是不是我們一般就瞭解到這裏了,就廢廢了。
第三章、熟能生巧
(EXISTS && NOT EXISTS)數據庫系統概論-嵌套查詢
(一)查詢沒有選修‘102’課的學生
SELECT SNO,SNAME FROM S WHERE not exists (SELECT * FROM SC where S.SNO=SNO and CNO=‘102’)
(二) 學生關係S(S#,SNAME,AGE,SEX)
學習關係SC(S#,C#,GRADE)
課程關係C(C#,CNAME)
其中S#學號、C#課程號、SNAME姓名、AGE年齡、SEX性別、GRADE成績、CNAME課程名
用SQL表達 【檢索選修了全部課程的學生姓名】
SELECT SNAME FROM S
WHERE NOT EXISTS
(SELECT * FROM C
WHERE NOT EXISTS
(SELECT * FROM SC
WHERE S#=S.S# AND C#=C.C#
)
)
解析:SELECT SNAME FROM S 取出了學生
WHERE (不存在一門課,這個學生沒選)
WHERE NOT EXISTS
(SELECT * FROM C 課---這個學生沒選
WHERE NOT EXISTS 不存在他和這個課的關係
(SELECT * FROM SC WHERE SC.S#=S.S# AND SC.C#=C.C#
)
)
-----------------------------------------------------------------------------------------------------------------------------
(三)學生表Student (Sno,Sname,Sex,Sage,Sdept)
課程表Course (Cno,Cname,Credit)
學生選課表SC (Sno,Cno,Grade)
其中Sno(學號)、Sname(姓名)、Sex(性別)、Sage(年齡)、Sdept(所在系名)、Cno(課程號)、Cname(課程名)、Ccredit(學分)、Grade(成績)
用SQL【查詢選修課程包括“1042”號學生所學的課程的學生學號】
SELECT SNO FROM SC SCX
WHERE NOT EXISTS
(SELECT * FROM SC SCY
WHERE SCY.Sno ='1042' AND
NOT EXISTS
(SELECT * FROM SC SCZ
WHERE SCZ.SNO=SCX.SNO AND SCZ.CNO=SCY.CNO
)
);
解析:這個學生A學號選出來,這學生咋樣呢?不存在一門課,‘1042’號學生選了,但是A沒有選
SELECT SNO FROM SC SCX
WHERE NOT EXISTS 不存在一門課
(SELECT * FROM SC SCY
WHERE SCY.Sno ='1042' AND ‘1042’選了,但是A和可沒有關係
NOT EXISTS
(SELECT * FROM SC SCZ
WHERE SCZ.SNO=SCX.SNO AND SCZ.CNO=SCY.CNO
)
);