比?在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 ?
例表A:TableIn 例表B:TableEx
(一? 在子查???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即为?true)?即为?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适合于?表小而内表大的情况??
如果两个表中??小,??大表,则子查询表大的用exists,子查?表小的用in