MySQL使用IN、EXISTS、ANY、ALL关键字的子查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pan_junbiao/article/details/86006839

子查询是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关键字则需要满足内层查询语句返回的所有结果,才可以执行外层查询语句。

猜你喜欢

转载自blog.csdn.net/pan_junbiao/article/details/86006839
今日推荐