1. 程式人生 > SQL入門教學 >28 SQL 子查詢2

28 SQL 子查詢2

1. 前言

上一小節中,我們一起學習了 SQL 子查詢的語法,並介紹了 SQL 子查詢是如何在 Insert、Select、Update 和 Delete 中使用的。

本小節,我們將繼續學習子查詢中的兩個特殊關鍵字語法——ANYALL

本小節測試資料如下,請先在資料庫中執行:

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 主要解決,子查詢返回多條記錄而主查詢需要使用單值比較符的問題。

在上一節中,我們談到如果子查詢返回多條記錄,那麼主查詢部分只能使用多值比較符,如 In,對於單值比較符,如 > ,則無法工作。

有了 ANY 和 ALL,就可以在一定程度上解決這個問題,針對子查詢返回的結果,ANY 和 ALL 的作用分別如下:

作用 說明
ANY 子查詢結果集任一條記錄滿足比較符即可 如 > 比較符,主查詢部分大於任意一條子查詢記錄即可
ALL 子查詢結果集所有記錄滿足比較符才可 如 > 比較符,主查詢部分須大於所有子查詢記錄才可

簡單的理解,ALL 和 ANY 讓單值比較符跟子查詢結果集中的每一條記錄都做比較,ALL 必須滿足所有比較才為真,而 ANY 只需滿足任意一個比較則為真。

3. 實踐

我們還是以例子來更加詳細的說明 ANY 和 ALL 的用法。

3.1 例1 子查詢使用 ANY

請書寫 SQL 語句,獲取imooc_user表中分數大於imooc_user_score_rank表中任意一個分數的使用者。

分析:

從題幹中得出,imooc_user 表中的 score 對應 imooc_user_score_rank 中的 score,我們使用 ANY 子查詢,第一步從子查詢中獲取 imooc_user_score_rank 表中的所有分數項,第二步在主查詢中使用 ANY 與子查詢結果比較。

語句:

整理可得語句如下:

SELECT username FROM imooc_user 
WHERE score > ANY(SELECT score FROM imooc_user_score_rank);

結果如下:

+----------+
| username |
+----------+
| tom      |
+----------+

tom 的分數為 1000, 大於 imooc_user_score_rank 表中的最小值 700,而其它的使用者均小於 imooc_user_score_rank 表中任意分數。

3.2 例2 子查詢使用 ALL

請書寫 SQL 語句,獲取imooc_user表中分數大於imooc_user_score_rank表中所有分數的使用者。

分析:

同上,只需將 ANY 換成 ALL 即可。

語句:

整理可得語句如下:

SELECT username FROM imooc_user 
WHERE score > ALL(SELECT score FROM imooc_user_score_rank);

結果如下:

+----------+
| username |
+----------+

在 imooc_user_score_rank 表中,最大的分數是 10000,而 imooc_user 表中使用者分數均小於 10000,因此結果為空。

4. 小結

  • ALL 和 ANY 的使用其實比較少,多加練習理解即可。
  • 子查詢重在積少成多和融匯貫通,請務必多加練習形成自己的知識網。