前言
在日常开发中,用mysql进行查询的时候,有一个比较少见的关键词exists,我们今天来学习了解一下这个exists这个sql关键词的用法,这样在工作中遇到一些特定的业务场景就可以有更加多样化的解决方案。
EXISTS示例:
SELECT * FROM A WHERE EXISTS (SELECT 1 FROM B WHERE B.id = A.id);
说明
括号中的子查询并不会返回具体的查询到的数据,只是会返回true或者false,如果外层sql的字段在子查询中存在则返回true,不存在则返回false
EXISTS执行顺序:
1、首先执行一次外部查询,并缓存结果集,如 SELECT * FROM A
2、遍历外部查询结果集的每一行记录,代入子查询中作为条件进行查询,如 SELECT 1 FROM B WHERE B.id = A.id
3、如果子查询有返回结果,则EXISTS子句返回TRUE,该条数据保留
4、如果子查询没有返回结果,则EXISTS子句返回FALSE,则删除该条数据
NOT EXISTS示例:
SELECT * FROM A WHERE NOT EXISTS (SELECT 1 FROM B WHERE B.id = A.id);
说明
括号中的子查询并不会返回具体的查询到的数据,只是会返回true或者false,如果外层sql的字段在子查询中存在则返回true,不存在则返回false
NOT EXISTS执行顺序:
1、首先执行一次外部查询,并缓存结果集,如 SELECT * FROM A
2、遍历外部查询结果集的每一行记录,代入子查询中作为条件进行查询,如 SELECT 1 FROM B WHERE B.id = A.id
3、如果子查询有返回结果(与EXISTS相反),则NOT EXISTS子句返回FALSE,则删除该条数据
4、如果子查询没有返回结果(与EXISTS相反),则NOT EXISTS子句返回TRUE,该条数据保留
IN
IN常用于where表达式中,其作用是查询某个范围内的数据。
示例:
select * from where field in (value1,value2,value3,…)
NOT IN
当 IN 前面加上 NOT 运算符时,表示与 IN 相反的意思,即不在这些列表项内的选择
示例:
select * from where field not in (value1,value2,value3,…)
EXISTS查询:先执行一次外部查询,然后为外部查询返回的每一行执行一次子查询,如果外部查询返回100行记录,sql就将执行101次查询。
IN查询:先查询子查询,然后把子查询的结果放到外部查询中进行查询。IN语句在mysql中没有参数个数的限制,但是mysql中sql语句有长度大小限制,整段最大为4M。IN引导的子查询只能返回一个字段。
当子查询的表大的时候,使用EXISTS可以有效减少总的循环次数来提升速度,当外查询的表大的时候,使用IN可以有效减少对外查询表循环遍历来提升速度,显然,外表大而子表小时,IN的效率更高,而外表小,子表大时,EXISTS的效率更高,若两表差不多大,则差不多。
NOT EXISTS:先执行一次外部查询,然后为外部查询返回的每一行记录R执行一次子查询,如果子查询没有返回记录,则NOT EXISTS子句返回TRUE,这一行R可作为外部查询的结果行。
NOT IN:外部查询在表中查询每条记录,符合要求的就返回结果集,不符合的就继续查询下一条记录,直到把表中的记录查询完,也就是说为了证明找不到,需要查询全部记录才能证明,NOT IN不会用到索引。
注意:EXISTS或NOT EXISTS写法需要注意子查询中的条件语句一般需要带上外查询的表做关联,不然子查询的条件可能会一直为真,或者一直为假,外查询的表进行循环匹配的时候,要么全部都查询出来,要么一条也没有。
评论记录:
回复评论: