【D1n910】(21/42) C++語言程序設(shè)計(jì) - MySQL數(shù)據(jù)庫學(xué)習(xí)筆記 2.5 子查詢
正常操作,正常分析,大家好,我是D1N910,這是我觀看【MySQL數(shù)據(jù)庫】C++語言程序設(shè)計(jì) - MySQL數(shù)據(jù)庫的學(xué)習(xí)筆記。

之前的筆記內(nèi)容請看我的專欄。這里便不再累述了。

Unit11 子查詢
Contents 目錄
01、子查詢的概念
02、where 子句中的子查詢
03、from 子句中的子查詢
01、子查詢的概念
>?如果一個(gè)select語句嵌入到另一個(gè)SQL語句(例如select. insert、 update、delete語句)中,那么該select語句稱為〞子查詢〞,包含子查詢的語句稱為“主查詢〞。
>?為了標(biāo)記子查詢和主查詢之間的關(guān)系,通常將子查詢寫在小括號內(nèi)。
> 子查詢可以用在主查詢的where子句、having子句、select子句或者from子句中。
02、where 子句中的子查詢
1)單值
列出成績低于平均分的信息
(1)查看平均分
????條件表達(dá)式中可以使用比較運(yùn)算符
????示例:列出考試成績低于平均分的信息,包括學(xué)號、課程號和成績
????【結(jié)果】
(2)列出成績低于65的
????上一條語句查詢得到的平均分結(jié)果是 65.
????把上一條語句的結(jié)果作為條件,進(jìn)行檢索,下面是直接書寫
【結(jié)果】
(3)合并:
【結(jié)果】
和剛剛直接寫 65 保持一致。
以上是子查詢返回單指的場景。
2)多值
????子查詢返回多值
????????條件表達(dá)式中的運(yùn)算符可以使用in、 not in等
????????示例:檢索沒有開設(shè)選修課的教師的信息
????????下面給出老師的表和課程表
?????????????使用表連接
????????【結(jié)果】
????????????? 使用子查詢
????? ? 【結(jié)果】
可以注意到,因?yàn)槭欠祷囟鄠€(gè)值,所以我們要使用 in 或者 not in 這樣能夠從多個(gè)值里篩數(shù)據(jù)的。
現(xiàn)在我們這邊看一個(gè) not in 容易犯錯的場景
我們目前的需求改為想通過 student 表找到 classes 表中沒有學(xué)生的班級。
下面是兩張表的信息
先舉出錯誤例子,可以看到下面是查不出結(jié)果的。
之所以我們沒有查出?class_no=6 的原因是因?yàn)?`select class_no from student;` 這條SQL預(yù)計(jì)查找出來的結(jié)果 有 NULL
通過前面的實(shí)驗(yàn),我們知道 NULL 的比對無論如何都是沒意義的
所以上面 6 與 NULL 的對比最終因?yàn)榧炔皇?0 也不是 1,所以沒輸出了。
通過過濾掉 null,我們可以得到正確輸出
以后注意 not in 注意?NULL 的問題
根據(jù)上面的原理,我們知道 in 不會有這樣的問題。
03、from 子句中的子查詢
from子句中的子查詢
????每一個(gè)select語句可以看成是一個(gè)虛擬的內(nèi)存表,可以在結(jié)果集的基礎(chǔ)上進(jìn)行進(jìn)一步的查詢
????示例
????????檢索表的數(shù)量多于50的數(shù)據(jù)庫的信息
? ? 上面的 db 是別名,這是必須要的,通過命名一個(gè)別名,以臨時(shí)保存在內(nèi)存中。否則外層會無法使用的。PS:這里?where cnt > 50; 使用的不能算是別名,是 db 這個(gè)表中的字段名!
下面是去掉別名后的報(bào)錯信息
????????檢索考試成績比自己的平均分高的課程的信息,這里用了表連接的方式
【結(jié)果】

恭喜我們,掌握了數(shù)據(jù)庫表的子查詢
我們的學(xué)習(xí)進(jìn)度為 21/42!
未完待續(xù)!