主页 > 你问我答

exists sql用法(SQL中EXISTS怎么用)

空寄云 1970年01月01日 4673次 你问我答

EXISTS运算符EXISTS运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回True,否则返回False。SQLEXISTS语法-fromshulanxt如果楼主还不够理解,可以到一个叫树懒学堂的站点去看看,那里面有很多相关的教程,exsists那一节还有具体的例子,可以跟着做做,因为实例的内容比较多我就不帮忙整理了哈~回答不易,望楼主采纳~

文章目录

SQL中EXISTS怎么用

EXISTS在SQL中的作用是:检验查询是否返回数据。

select a.* from tb a where exists(select 1 from tb where name =a.name)返回真假,当 where 后面的条件成立,则列出数据,否则为空。

exists强调的是是否返回结果集,不要求知道返回什么。比如:select name from student where sex = 'm' and mark exists(select 1 from grade where ...)

只要exists引导的子句有结果集返回,那么exists这个条件就算成立了,大家注意返回的字段始终为1

如果改成“select 2 from grade where ...”,那么返回的字段就是2,这个数字没有意义。所以exists子句不在乎返回什么,而是在乎是不是有结果集返回。

SQL中IN和EXISTS用法的区别

一、EXISTS 并非总比IN 快,究竟应该选用 IN 还是 EXISTS ,可参考以下分析:

1、Select * from t1 where x in ( select y from t2 )

相当于

select *

from t1, ( select distinct y from t2 ) t2

where t1.x = t2.y;

2、select * from t1 where exists ( select null from t2 where y = x )

相当于

for x in ( select * from t1 )

loop

if ( exists ( select null from t2 where y = x.x )

then

OUTPUT THE RECORD

end if

end loop

如果t2的记录很多而t1的记录相对较少的话,建议采用第二种写法;相反,如果t1的记录很多而t2的记录相对较少,则建议采用第一种写法。

其它情况,则需要仔细分析再决定是选择IN还是选择EXISTS

二、NOT IN 并不等价于NOT EXISTS

例如下面这两个句子,只有在t1.c1不为NULL的时候,两者返回的记录才是相同的,大家在用NOT EXISTS来替换NOT IN 时可能会忽略掉这一点

select t1.*

from table1 t1

where not exists

(select t2.c1 from table2 t2 where t2.c1 = t1.c1)

select t1.*

from table1 t1

where t1.c1 not in (select t2.c1 from table2 t2)

SQL 怎么用EXISTS替代IN

我们在程序中一般在做SQL优化的时候讲究使用EXISTS带替代IN的做法,理由是EXISTS执行效率要比IN高。

之前我一直挺懵懂的一件事情是如何使用EXISTS来替换IN呢,二者表示的意义又是什么呢?今天就我个人理解记录一下

IN表示范围,指某一字段在某一范围之内,这个范围一般使用子查询来获取,由此可知IN子查询返回的结果应该就是这个范围集。

EXISTS表示存在,指至少存在一处,这个条件由EXISTS子查询来完成,但是在这里EXISTS子查询返回的结果却不再是一个结果集,而是一个布尔值(true或false),其实这个挺好理解的,EXISTS就表示如果子查询能查到值则返回true,则执行EXISTS之前的语句。

举个栗子

假如有一个表user,它有两个字段id和name,我们要查询名字中带a的用户信息:

最简单的SQL:select * from user where name like '%a%';

使用IN的SQL:select u.* from user u where u.id in (select uu.id from user uu where uu.name like '%a%');

我们现在将使用IN的SQL修改为使用EXISTS的SQL该怎么写呢?

一开始我直接将u.id in 替换为EXISTS,获得如下语句 :

select u.* from user u where exists(select uu.id from user uu where uu.name like '%a%');

经过测试发现输出结果错误,该语句将所有的用户全部一个不漏的查询出来了,相信你也发现了问题,后来我对上述语句做了修改如下:

select u.* from user u where exists (select uu.id from user uu where uu.name like '%a%' and uu.id=u.id);

如你所见,只是在子查询中添加了“and uu.id=u.id”,结果查询结果正确。

那么原因为何呢?

总结:EXISTS子查询可以看成是一个独立的查询系统,只为了获取真假逻辑值,EXISTS子查询与外查询查询的表是两个完全独立的毫无关系的表(当第二个表中的name中有包含a的姓名存在,那么就执行在第一个表中查询所有用户的操作),当我们在子查询中添加了id关联之后,EXISTS子查询与外查询查询的表就统一了,是二者组合组建的虚表,是同一个表(这样当子查询查询到虚表中当前行的uu.name中包含a时,则将虚表当前行中对应的u.id与u.name查询到了)

所以一切的重点就在这个ID关联之上,添加ID关联,数据库会先将两张表通过ID关联组合成一张虚表,所有的查询操作都在这张虚表上完成,操作的是同一张表,当然就不会出现之前的那种情况了!

oracle中exists用法

exists可以说是oracle数据库开发中比较常见的用法,用exists可以提高sql的效率,可以取代in。

比如 a,b 关联列为 a.id = b.id,现在要取 a 中的数据,其中id在b中也存在:select * from a where exists(select 1 from b where a.id = b.id)

现在要取 a 中的数据,其中id在b中 不存在:select * from a where not exists(select 1 from b where a.id = b.id)

用法详解

exists是判断exits后面的sql语句是否为真,若为真则整个sql句子成立,否则没有任何记录。例子:

select 1 from dual where exists (select 1 from dual where 2=1);

上面的情况肯定是没有记录。

select 1 from dual where exists (select 1 from dual where 1=1);

上面的情况是有记录返回的。

判断另外的表中是否包含某个表的外键记录。例子:

select * from table_test a

where exists (select 1 from scott.carol_tmp where pps_master=a.pps_master);

这个sql是要检查table_test中的pps_master是否在carol_tmp中。其实用in也可以实现同样的效果,但是in的话效率要低些,特别是碰上一些大表。用exists和in的性能就体现出来了。

(0)

相关推荐

发表评论

登录后才能评论

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 1719901459@qq.com 举报,一经查实,本站将立刻删除。