EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
EXISTS 指定一个子查询,检测 行 的存在。
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME in(select BNAME from TableEx)
这两个查询返回相同结果,也就是TableIn表的name 需要在 TableEx表的name存在。如果exists子查询是有结果集,就返回true,否则返回false;
exists的运行方式:先运行主查询一次 再去子查询里查询是否有对应记录,如果有,返回ture,反之返回false,再根据主查询中的每一行去子查询里去查询.
IN的运行方式:in的子查询要返回结果集。子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.
EXISTS与IN的使用效率比较,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
NOT IN 和 NOT EXISTS的道理是一样的,NOT EXISTS的效率依然高于NOT IN
文章借鉴于:https://www.cnblogs.com/qlqwjy/p/8598091.html