在工作和学习中,我们经常使用到mysql子查询in,not in还有不常用的any,!=any,all,!=all,some等。今天刚好整理一下mysql子查询,便于后面查阅。

一、可以按照mysql子查询的类型划分。

Mysql in子句 mysql子查询in_子查询

1)、按照使用结构。

Mysql in子句 mysql子查询in_mysql in any all_02

where子查询

from子查询

exists子查询

2)、按照返回结果。

Mysql in子句 mysql子查询in_mysql in any all_03

标量子查询

列子查询

行子查询

表子查询

下面我们就按照返回结果的顺序讲解mysql子查询。

1、标量子查询

说明:子查询的返回值是一个标量。

例如:

select * from table where filed = ( select max(filed1) from table1 where filed2 = 'filed2' );

注意:

标量子查询中返回的是一个值,不能有多个值。

这里可以使用 >,=。

2、列子查询

集合运算符

一定要使用集合类的操作符来完成。

in (集合)  | not in(集合)

any(集合) 等于集合中的任何一个即可。等同于in

!=any(集合) 不等于集合中的任意一个。只要与集合中的一些元素,不相等即可。

some 与 any 是同义词。用法语法都是一样的。

all(集合) 集合中的所有元素

!=all(集合) 不等于其中的所有元素,等同于not in。

例如:

select * from table where filed not in ( select id from table1 where filed1 = 'filed1');
select * from table where filed in ( select id from table1 where filed1 = 'filed1');

注意:

这里出来in和not in外,其他的都可以使用 >,=。

3、行子查询

在参与比较时,使用括号可以构建一行。

例如:

select * from table where (filed1,filed2) = (select filed1,filed2 from table2 limit 1);

注意:

1、这里一定要使用limit 1,只能获取到一行记录。否则不能实现行子查询的效果。

2、值得注意的是,where后面的字段和子查询里面的查询的字段要一致,否则不行。

4、表子查询

例如:

select * from (select filed1,filed2,filed3 from table where filed4='filed4') as temp where filed5 = 'filed5';

注意:

如果用于from子查询子句内,from子句内,要求使用一个表,而不能是一个结果。所以应该给这个查询结果起别名。

exists子查询

为什么说它特殊了,因为他的执行流程不同。类似于双重循环。

select * from table where exists ( select * from table1 where table.id=id );

相等于

select * from table where id in ( select id from table1 );

每当查询table表里面的id,就去table1里面全部匹配一遍。

exists与in的区别。

主要区别与解决思路不一样。

ezists:先获得table表里面的每一条记录,然后再去获得table1表里面的记录,找到,则说明符合条件。

in : 先获得table1里面所有的id字段,再去检索table当前id,是否在id的集合内。