MYSQL中EXISTS的用法

语法结构

SELECT column1 FROM t1 WHERE [conditions] and EXISTS (SELECT * FROM t2 );

说明:

括号中的子查询并不会返回具体的查询到的数据,只是会返回true或者false,如果外层sql的字段在子查询中存在则返回true,不存在则返回false
即使子查询的查询结果是null,只要是对应的字段是存在的,子查询中则返回true,下面有具体的例子

执行过程:

1、首先进行外层查询,在表t1中查询满足条件的column1
2、接下来进行内层查询,将满足条件的column1带入内层的表t2中进行查询,
3、如果内层的表t2满足查询条件,则返回true,该条数据保留
4、如果内层的表t2不满足查询条件,则返回false,该条数据不保留
5、最终将数据进行返回
总结:先进行最外层数据检索,将满足条件的数据集再带入到内层进行筛选,满足条件的数据进行返回;

exists和in查询原理的区别

exists : 外表先进行循环查询,将查询结果放入exists的子查询中进行条件验证,确定外层查询数据是否保留;

in : 先查询内表,将内表的查询结果当做条件提供给外表查询语句进行比较;

外层小表,内层大表(或者将sql从左到由来看:左面小表,右边大表): exists 比 in 的效率高

外层大表,内层小表(或者将sql从左到由来看:左面大表,右边小表): in 比 exists 的效率高

 

exists和not exists的区别

exists           (返回结果集,为真)   
not exists       (不返回结果集,为真) 

 

示例:

 

 

表A和表B是1对多的关系   A.ID   =>   B.AID 

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID = B.AID);

 

原理如下:

(1)SELECT   ID,NAME   FROM   A   WHERE   EXISTS   (SELECT   *   FROM   B   WHERE   B.AID=) 
---> SELECT   *   FROM   B   WHERE   B.AID=1; -- 有值,返回真,所以有数据

(2)SELECT   ID,NAME   FROM   A   WHERE   EXISTS   (SELECT   *   FROM   B   WHERE   B.AID=2) 
---> SELECT   *   FROM   B   WHERE   B.AID=2; -- 有值,返回真,所以有数据

(3)SELECT   ID,NAME   FROM   A   WHERE   EXISTS   (SELECT   *   FROM   B   WHERE   B.AID=3) 
---> SELECT   *   FROM   B   WHERE   B.AID=3; -- 无值,返回假,所以没有数据

得到的结果为,A.ID=1或2时才有数据,所以最终的条件等于

SELECT ID,NAME FROM A where id in (1,2);

 

 

参考:https://blog.csdn.net/wxf_suzhou/article/details/82962515

参考:https://blog.csdn.net/zhangzehai2234/article/details/124652056

posted @ 2022-07-21 16:44  DHaiLin  阅读(6546)  评论(1编辑  收藏  举报