数据库EXISTS的⽤法
版权声明:本⽂为博主原创⽂章,未经博主允许不得转载。 blog.csdn/amanicspater/article/details/78315575 EXISTS⽤于检查⼦查询是否⾄少会返回⼀⾏数据,该⼦查询实际上并不返回任何数据,⽽是返回值True或False
EXISTS 指定⼀个⼦查询,检测 ⾏ 的存在。
语法: EXISTS subquery
参数: subquery 是⼀个受限的 SELECT 语句 (不允许有 COMPUTE ⼦句和 INTO 关键字)。
结果类型: Boolean 如果⼦查询包含⾏,则返回 TRUE ,否则返回 FLASE 。
使⽤:
user表:
user_1011表:
语句:
select * from user u1 where exists(select * from user_1011 u2 where u1.name = u2.name);
结果:
exists的用法注意,⼦查询中与主查询中的是否有关联会影响到结果!
在某些情况下,EXISTS关键字可以⽤=ANY和IN来代替功能。
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME in(select BNAME from TableEx)
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME=ANY(select BNAME from TableEx)
总结:
EXISTS(包括 NOT EXISTS )⼦句的返回值是⼀个BOOL值。 EXISTS内部有⼀个⼦查询语句(SELECT ... ), 我将其称为EXIST的内查询语句。其内查询语句返回⼀个结果集。 EXISTS⼦句根据其
内查询语句的结果集空或者⾮空,返回⼀个布尔值。
⼀种通俗的可以理解为:将外查询表的每⼀⾏,代⼊内查询作为检验,如果内查询返回的结果取⾮空值,则EXISTS⼦句返回TRUE,这⼀⾏⾏可作为外查询的结果⾏,否则不能作为结果。
分析器会先看语句的第⼀个词,当它发现第⼀个词是SELECT关键字的时候,它会跳到FROM关键字,然后通过FROM关键字到表名并把表装⼊内存。接着是WHERE关键字,如果不到则返回到SELECT字段解析,如果到WHERE,则分析其中的条件,完成后再回到SELECT分析字段。最后形成⼀张我们要的虚表。
WHERE关键字后⾯的是条件表达式。条件表达式计算完成后,会有⼀个返回值,即⾮0或0,⾮0即为真(true),0即为假(false)。同理WHERE后⾯的条件也有⼀个返回值,真或假,来确定接下来执不执⾏SELECT。
分析器先到关键字SELECT,然后跳到FROM关键字将STUDENT表导⼊内存,并通过指针到第⼀条记录,接着到WHERE关键字计算它的条件表达式,如果为真那么把这条记录装到⼀个虚表当中,指针再指向下⼀条记录。如果为假那么指针直接指向下⼀条记录,⽽不进⾏其它操作。⼀直检索完整个表,并把检索出来的虚拟表返回给⽤户。EXISTS是条件表达式的⼀部分,它也有⼀个返回值(true或false)。
在插⼊记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执⾏插⼊操作,可以通过使⽤ EXISTS 条件句防⽌插⼊重复记录。
INSERT INTO TableIn (ANAME,ASEX)
SELECT top 1 '张三', '男' FROM TableIn
WHERE not exists (select * from TableIn where TableIn.AID = 7)
EXISTS与IN的使⽤效率的问题,通常情况下采⽤exists要⽐in效率⾼,因为IN不⾛索引,但要看实际情况具体使⽤:
IN适合于外表⼤⽽内表⼩的情况;EXISTS适合于外表⼩⽽内表⼤的情况。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论