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=1) ---> 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