数据库学习之EXISTS的⽤法
在项⽬中总要多多少少接触⼀些sql语句,对于这个⼤概就是⽐较弱项了,既然是弱项了,那遇到就来个总结学习吧。
今天要总结的是exists的⽤法,对于这个感觉熟悉⼜陌⽣;熟悉是因为经常看到⼀些⼈⽤到,陌⽣是因为他们写的竟然有些看不懂,很是⽆语,那就百度⼀下吧!
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⼦句不在乎返回什么,⽽是在乎是不是有结果集返回。
⽽ exists 与 in 最⼤的区别在于 in引导的⼦句只能返回⼀个字段,⽐如:
select name from student where sex = 'm' and mark in (select 1,2,3 from grade where ...)
,
in⼦句返回了三个字段,这是不正确的,exists⼦句是允许的,但in只允许有⼀个字段返回,在1,2,3中随便去了两个字段即可。
in 和 exists的区别: 如果⼦查询得出的结果集记录较少,主查询中的表较⼤且⼜有索引时应该⽤in, 反之如果外层的主查询记录较少,⼦查询中的表⼤,⼜有索引时使⽤exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执⾏⼦查询,所以我们会以驱动表的快速返回为⽬标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进⾏处理。
in 是把外表和内表作hash 连接,⽽exists是对外表作loop循环,每次loop循环再对内表进⾏查询。⼀直以来认为exists⽐in效率⾼的说法是不准确的。exists的用法
总结:
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)。
以上是搜了多篇总结⽽来,只供学习交流!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论