
什么是子查询?
子查询指一个查询语句嵌套在另一个查询语句内部的查询。
在
select
子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。
初识
子查询中常用的操作符有ANY(SOME)
、ALL
、IN
、EXISTS
。
子查询可以添加到select
、update
和delete
语句中,而且可以进行多层嵌套,子查询中也可以使用比较运算符,例如:<
|<=
|>
|>=
|!=
等符号。
ANY、SOME
ANY
和SOME
关键词是同义词,表示满足其中任一条件即可,他们可以创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。
首先我们准备下环境;
mysql> create table ceshi1 (id int not null);
Query OK, 0 rows affected (0.03 sec)
mysql> create table ceshi2 (id int not null);
Query OK, 0 rows affected (0.02 sec)
mysql>
然后我们往表中插入数据;
mysql> insert into ceshi1 values(1), (2), (10), (20), (30);
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> insert into ceshi2 values(5), (15), (25);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql>
然后我们现在看下这两个表中的数据;
mysql> select * from ceshi1;
+----+
| id |
+----+
| 1 |
| 2 |
| 10 |
| 20 |
| 30 |
+----+
5 rows in set (0.00 sec)
mysql> select * from ceshi2;
+----+
| id |
+----+
| 5 |
| 15 |
| 25 |
+----+
3 rows in set (0.00 sec)
mysql>
ANY
关键字接在一个比较操作符的后面,表示若与子查询返回的任何值比较为TRUE
,则返回TRUE
;
举个例子:找出ceshi1
中大于ceshi2
中任何一个数据的值;
正常来说,我们需要找出ceshi1
中最小的值,然后和ceshi1
中的数据进行对比,这样的方法可行,但是我们这里就可以使用子查询ANY
的方式来进行;
mysql> select id from ceshi1 where id > any (select id from ceshi2);
+----+
| id |
+----+
| 10 |
| 20 |
| 30 |
+----+
3 rows in set (0.01 sec)
mysql>
ALL
ALL
关键字和ANY
和SOME
是不同的,使用ALL
的时候需要同时满足内层查询的条件。
举个例子,还是前面的例子,我们将ANY
换成ALL
看一下效果。
mysql> select id from ceshi1 where id > all (select id from ceshi2);
+----+
| id |
+----+
| 30 |
+----+
1 row in set (0.02 sec)
mysql>
从结果上可以看到使用ANY
和ALL
的结果是不一样的,其他的都是一样的,不同的是,ceshi1
表中的信息全部大于ceshi2
的值,只有30
这一个值。
EXISTS
EXISTS
关键字后面的参数是一个任意的子查询,数据库根据子查询的运算结果进行判断,如果至少返回一行内容,那么就认定为TRUE
,同时运行外层的查询语句;反之,则认定为FALSE
,切外层语句将不执行。
例如,我们查询下ceshi2
中有没有大于50
的值,如果有的话,使用ceshi1
中的数据减去50,计算出结果;
mysql> select id-50 from ceshi1 where exists (select id from ceshi2 where id > 50);
Empty set (0.00 sec)
mysql>
可以看到并没有查询出来结果,那么我们换个条件呢?换成看下ceshi2
中是否有数据大于20,如果有的话,那么ceshi1
中的数据就减去50,计算出结果;
mysql> select id-50 from ceshi1 where exists (select id from ceshi2 where id > 20);
+-------+
| id-50 |
+-------+
| -49 |
| -48 |
| -40 |
| -30 |
| -20 |
+-------+
5 rows in set (0.00 sec)
mysql>
小提示:
NOT EXISTS
和EXISTS
使用方法相同,返回的结果相反。在此就不进行举例了。
IN
IN
关键字进行子查询的时候,内查询语句仅仅返回一个数据列,这个数据列里面的值将提供给外层查询语句进行比较。
环境准备:
给ceshi2
的数据表中新插入几条数据;
mysql> insert into ceshi2 values (20), (30);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql>
例如,我们查下在ceshi2
的数据表中大于15
的数据,并查看ceshi1
中是否有该值,如果有,就列出;
mysql> select id from ceshi1 where id in (select id from ceshi2 where id > 15);
+----+
| id |
+----+
| 20 |
| 30 |
+----+
2 rows in set (0.00 sec)
mysql>
我们查出来了两条数据;
小提示
NOT IN
的作用和IN
的作用正好相反;
将上面的sql
语句,使用not in
看看结果;
mysql> select id from ceshi1 where id not in (select id from ceshi2 where id > 15);
+----+
| id |
+----+
| 1 |
| 2 |
| 10 |
+----+
3 rows in set (0.00 sec)
mysql>
可以看到结果确实不一样,且正好相反。
比较运算符
比较运算符无非就是<
、<=
、>
、>=
、!=
等等。
较为简单,就不进行举例了。

往期推荐




