SQL 子查詢2
1. 前言
在上一小節(jié)中,我們一起學(xué)習(xí)了 SQL 子查詢的語法,并介紹了 SQL 子查詢是如何在 Insert、Select、Update 和 Delete 中使用的。
本小節(jié),我們將繼續(xù)學(xué)習(xí)子查詢中的兩個特殊關(guān)鍵字語法——ANY
和ALL
。
本小節(jié)測試數(shù)據(jù)如下,請先在數(shù)據(jù)庫中執(zhí)行:
DROP TABLE IF EXISTS imooc_user;
CREATE TABLE imooc_user
(
id int PRIMARY KEY,
username varchar(20),
age int,
score int
);
INSERT INTO imooc_user(id,username,age,score) VALUES (1,'peter', 18, 100),
(2,'pedro', 24, 200),(3,'jerry', 28, 500),
(4,'mike', 12, 300),(5,'tom', 27, 1000);
DROP TABLE IF EXISTS imooc_user_score_rank;
CREATE TABLE imooc_user_score_rank
(
id int PRIMARY KEY,
srank int,
score int
);
INSERT INTO imooc_user_score_rank(id,srank,score) VALUES (1,1,10000),(2,2,8000),(3,9,700);
2. ANY 和 ALL
ANY 和 ALL 主要解決,子查詢返回多條記錄而主查詢需要使用單值比較符的問題。
在上一節(jié)中,我們談到如果子查詢返回多條記錄,那么主查詢部分只能使用多值比較符,如 In,對于單值比較符,如 > ,則無法工作。
有了 ANY 和 ALL,就可以在一定程度上解決這個問題,針對子查詢返回的結(jié)果,ANY 和 ALL 的作用分別如下:
作用 | 說明 | |
---|---|---|
ANY | 子查詢結(jié)果集任一條記錄滿足比較符即可 | 如 > 比較符,主查詢部分大于任意一條子查詢記錄即可 |
ALL | 子查詢結(jié)果集所有記錄滿足比較符才可 | 如 > 比較符,主查詢部分須大于所有子查詢記錄才可 |
簡單的理解,ALL 和 ANY 讓單值比較符跟子查詢結(jié)果集中的每一條記錄都做比較,ALL 必須滿足所有比較才為真,而 ANY 只需滿足任意一個比較則為真。
3. 實踐
我們還是以例子來更加詳細(xì)的說明 ANY 和 ALL 的用法。
3.1 例1 子查詢使用 ANY
請書寫 SQL 語句,獲取imooc_user
表中分?jǐn)?shù)大于imooc_user_score_rank
表中任意一個分?jǐn)?shù)的用戶。
分析:
從題干中得出,imooc_user 表中的 score 對應(yīng) imooc_user_score_rank 中的 score,我們使用 ANY 子查詢,第一步從子查詢中獲取 imooc_user_score_rank 表中的所有分?jǐn)?shù)項,第二步在主查詢中使用 ANY 與子查詢結(jié)果比較。
語句:
整理可得語句如下:
SELECT username FROM imooc_user
WHERE score > ANY(SELECT score FROM imooc_user_score_rank);
結(jié)果如下:
+----------+
| username |
+----------+
| tom |
+----------+
tom 的分?jǐn)?shù)為 1000, 大于 imooc_user_score_rank 表中的最小值 700,而其它的用戶均小于 imooc_user_score_rank 表中任意分?jǐn)?shù)。
3.2 例2 子查詢使用 ALL
請書寫 SQL 語句,獲取imooc_user
表中分?jǐn)?shù)大于imooc_user_score_rank
表中所有分?jǐn)?shù)的用戶。
分析:
同上,只需將 ANY 換成 ALL 即可。
語句:
整理可得語句如下:
SELECT username FROM imooc_user
WHERE score > ALL(SELECT score FROM imooc_user_score_rank);
結(jié)果如下:
+----------+
| username |
+----------+
在 imooc_user_score_rank 表中,最大的分?jǐn)?shù)是 10000,而 imooc_user 表中用戶分?jǐn)?shù)均小于 10000,因此結(jié)果為空。
4. 小結(jié)
- ALL 和 ANY 的使用其實比較少,多加練習(xí)理解即可。
- 子查詢重在積少成多和融匯貫通,請務(wù)必多加練習(xí)形成自己的知識網(wǎng)。