MySQL使用IN、EXISTS、ANY、ALL關鍵字的子查詢
子查詢是SELECT查詢的另一個查詢的附屬,MySQL 4.1可以巢狀多個查詢,在外面一層的查詢中使用裡面一層查詢產生的結果集。這樣就不是執行兩個(或者多個)獨立的查詢,而是執行包含一個(或者多個)子查詢的單獨查詢。
建立圖書資訊表和編號資訊表,用於後續的例項使用。
(1)建立圖書資訊表,並新增資料。
-- 建立圖書資訊表 CREATE TABLE tb_book ( id INT AUTO_INCREMENT PRIMARY KEY, book_name VARCHAR(30) NOT NULL, row_no INT ); -- 新增資料 INSERT INTO tb_book(book_name,row_no) VALUES ('Java程式設計',12) ,('PHP經典模組',95) ,('C#專案整合',NULL) ,('MySQL入門',8) ,('Java高階程式設計',12) ,('Oracle資料庫',15)
(2)建立編號資訊表,並新增資料。
-- 建立編號資訊表
CREATE TABLE tb_row
(
id INT AUTO_INCREMENT PRIMARY KEY,
row_no INT NOT NULL
);
-- 新增資料
INSERT INTO tb_row(row_no) VALUES(8),(12),(80),(90);
1、帶IN關鍵字的子查詢
只有子查詢返回的結果列包含一個值時,比較運算子才適用。假如一個子查詢返回的結果集是值的列表,這時比較運算子就必須用IN運算子代替。
IN運算子可以檢測結果集中是否存在某個特定的值,如果檢測成功就執行外部的查詢。
示例:帶IN關鍵字的子查詢。
SELECT * FROM tb_book
WHERE row_no IN (SELECT row_no FROM tb_row);
執行結果:
2、帶EXISTS關鍵字的子查詢
使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄。而是返回一個真假值。如果內層查詢語句查詢到滿足條件的記錄,就返回一個真值(true),否則,將返回一個假值(false)。當返回的值為true時,外層查詢語句將進行查詢;當返回的為false時,外層查詢語句不進行查詢或者查詢不出任何記錄。
示例:帶EXISTS關鍵字的子查詢。
SELECT * FROM tb_book WHERE EXISTS (SELECT row_no FROM tb_row WHERE row_no = 12);
執行結果:
說明:與EXISTS關鍵字剛好相反,使用NOT EXISTS關鍵字時,當返回的值是true時,外層查詢語句不執行查詢;當返回值是false時,外層查詢語句將執行查詢。
3、帶ANY關鍵字的子查詢
ANY關鍵字表示滿足其中任意一個條件。使用ANY關鍵字時,只要滿足內層查詢語句返回的結果中的任意一個,就可以通過該條件來執行外層查詢語句。
示例:帶ANY關鍵字的子查詢。
SELECT * FROM tb_book
WHERE row_no < ANY(SELECT row_no FROM tb_row);
執行結果:
4、帶ALL關鍵字的子查詢
ALL關鍵字表示滿足所有條件。使用ALL關鍵字時,只有滿足內層查詢語句返回的所有結果,才可以執行外層查詢語句。
示例:帶ALL關鍵字的子查詢。
SELECT * FROM tb_book
WHERE row_no >= ALL(SELECT row_no FROM tb_row);
執行結果:
說明:ANY關鍵字和ALL關鍵字的使用方式是一樣的,但是這兩者有很大的區別。使用ANY關鍵字時,只要滿足內層查詢語句返回的結果中的任何一個,就可以通過該條件來執行外層查詢語句;而ALL關鍵字則需要滿足內層查詢語句返回的所有結果,才可以執行外層查詢語句。