暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql查询语法汇总-子查询

运维家 2022-11-14
445

 

什么是子查询?

子查询指一个查询语句嵌套在另一个查询语句内部的查询。

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>

可以看到结果确实不一样,且正好相反。

比较运算符

比较运算符无非就是<
<=
>
>=
!=
等等。

较为简单,就不进行举例了。

 

长按以识别二维码关注运维家~
微信号:yunweijia0909


往期推荐

mysql查询语法汇总-中

记一次mysql查询慢的优化历程

mysql中最常用的基本查询语句



文章转载自运维家,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论