1. 程式人生 > >MySQL使用IN、EXISTS、ANY、ALL關鍵字的子查詢

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關鍵字則需要滿足內層查詢語句返回的所有結果,才可以執行外層查詢語句。