数据库exists(sql 中exists 在where中怎样用)
老铁们,大家好,相信还有很多朋友对于数据库exists和sql 中exists 在where中怎样用的相关问题不太懂,没关系,今天就由我来为大家分享分享数据库exists以及sql 中exists 在where中怎样用的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
sql中in和exist语句的区别
两者都能实现表功能查询,主要区别如下:
1、适用表的类型不同。
in是子查询为驱动表,外面的表为被驱动表,故适用于子查询结果集小而外面的表结果集大的情况。
exists是外面的表位驱动表,子查询里面的表为被驱动表,故适用于外面的表结果集小而子查询结果集大的情况。
2、子查询关联不同。
exists一般都是关联子查询。对于关联子查询,必须先执行外层查询,接着对所有通过过滤条件的记录,执行内层查询。外层查询和内层查询相互依赖,因为外层查询会把数据传递给内层查询。
in则一般都是非关联子查询,非关联子查询则必须先完成内层查询之后,外层查询才能介入。
3、执行次数不同。
IN语句:只执行一次,确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。
EXISTS语句:执行次数根据表的长度而定。指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。
参考资料来源:百度百科--In操作符
参考资料来源:百度百科--Exists
关于查询语句中的in和exists的区别
1、适用表的类型不同。
in是子查询为驱动表,外面的表为被驱动表,故适用于子查询结果集小而外面的表结果集大的情况。
exists是外面的表位驱动表,子查询里面的表为被驱动表,故适用于外面的表结果集小而子查询结果集大的情况。
2、子查询关联不同。
exists一般都是关联子查询。对于关联子查询,必须先执行外层查询,接着对所有通过过滤条件的记录,执行内层查询。外层查询和内层查询相互依赖,因为外层查询会把数据传递给内层查询。
in则一般都是非关联子查询,非关联子查询则必须先完成内层查询之后,外层查询才能介入。
3、执行次数不同。
IN语句:只执行一次,确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。
EXISTS语句:执行次数根据表的长度而定。指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。
SQL语句语言特点:
1、SQL风格统一
SQL可以独立完成数据库生命周期中的全部活动,包括定义关系模式、录人数据、建立数据库、査询、更新、维护、数据库重构、数据库安全性控制等一系列操作,这就为数据库应用系统开发提供了良好的环境,在数据库投入运行后,还可根据需要随时逐步修改模式,且不影响数据库的运行,从而使系统具有良好的可扩充性。
2、高度非过程化
非关系数据模型的数据操纵语言是面向过程的语言,用其完成用户请求时,必须指定存取路径。而用SQL进行数据操作,用户只需提出“做什么”,而不必指明“怎么做”,因此用户无须了解存取路径,存取路径的选择以及SQL语句的操作过程由系统自动完成。这不但大大减轻了用户负担,而且有利于提高数据独立性。
sql中in和exists的区别效率问题 转
很多人和说法会认为in和Exists相比后者的效率要高。
但是以我本人使用数据库的经验来看,两者的运行效率其实不相伯仲,不管有无可被利用的索引,它们在运行速度上没有太明显的分别,硬要说哪个快一些的话exists可能会快一点点,但是这种区别通常可以忽略。
然而在求非交集时 not in和not exists运行效率上的差距就很大,碰到大数据表时not in不管有无可被利用的索引,都会导致效率悲剧,其运行速度极之糟糕往往要运行很长的时间才能返回结果,期间系统就像假死一样。not exists在有可被利用的索引的情况下碰到大数据表时其运行效率非常高、表现优异,但是若没有可被利用索引的情况下其运行效率也很不好,此时其运行速度尽管要比not in快上不少但还是属于那种令人无法接受的“蜗速”。
in和exists随各人喜好随便用,特别是数据量不大时。面对大数据表时就要小心,not in无论有无可被利用的索引都应避免使用,not exists在有可被利用索引的情况下可作为首选,反之也要避免使用。
sql 中exists 在where中怎样用
比如在Northwind数据库中有一个查询为
SELECT c.CustomerId,CompanyName FROM Customers c
WHERE EXISTS(
SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID)
这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的是CustomerID和CompanyName字段,这两个字段肯定不在OrderID里面啊,这是如何匹配的呢?
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。
EXISTS指定一个子查询,检测行的存在。
语法: EXISTS subquery
参数: subquery是一个受限的 SELECT语句(不允许有 COMPUTE子句和 INTO关键字)。
结果类型: Boolean如果子查询包含行,则返回 TRUE,否则返回 FLASE。
在子查询中使用 NULL仍然返回结果集
select* from TableIn where exists(select null)
等同于: select* from TableIn
比较使用 EXISTS和 IN的查询。注意两个查询返回相同的结果。
select* from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select* from TableIn where ANAME in(select BNAME from TableEx)
比较使用 EXISTS和= ANY的查询。注意两个查询返回相同的结果。
select* from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select* from TableIn where ANAME=ANY(select BNAME from TableEx)
NOT EXISTS的作用与 EXISTS正好相反。如果子查询没有返回行,则满足了 NOT EXISTS中的 WHERE子句。
结论:
EXISTS(包括 NOT EXISTS)子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT... FROM...),我将其称为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适合于外表小而内表大的情况。
OK,关于数据库exists和sql 中exists 在where中怎样用的内容到此结束了,希望对大家有所帮助。