目录
一、in
解释:in 进行子查询时,内层语句仅返回一个数据列,数据列的值提供给外层语句进行比较操作。
语法格式:select * from table_1 where id in (select id from table_2 );
中文注释:select * from 表名 where 字段 in (子查询/结果集);
用法:
select * from table_1 where id in (select id from table_2 where name = '张三');
二、exists
解释:exists的右操作数是一个子查询,这个子查询是用来做存在性检查的,若子查询的行存在结果,即子查询能够找到匹配的记录,exists的结果为ture,否则为false。
使用EXISTS时,若子查询有结果,则返回true,外表能够提取查询数据。
使用NOT EXISTS时,若子查询找不到匹配记录,则返回true,外表能够提取查询数据。
语法格式:select * from table_1 where exists (select 1 from table_2 where table_1.id=table_2.id);
中文注释:select * from 表名 where exists (子查询条件筛选);
用法:
select * from table_1 where exists (select 1 from table_2 where table_1.id=table_2.id)
三、区别
1、 IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况;内外表一样,用那个都行。
2、使用IN时,IN不对NULL进行处理,exists会对NULL进行处理。
3、in可以走索引,但数据量过大就不走索引,not in、exist、not exists也都可以走索引,但数据库版本不同也会有区别,最好是测试一下
4、exists,not exists一般是与子查询使用;in,not in可以与子查询使用,也可以直接in ('a','b',......,'结果集')。