SQL----EXISTS 關鍵字


轉自:http://blog.sina.com.cn/s/blog_65dbc6df0100mvfx.html

1.EXISTS基本意思

  英語解釋就是存在,不過他的意思也差不多,相當於存在量詞'З'。他不返回數據的,當后帶帶的查詢為空值是,返回“FALSE”,非空則返回“TRUE”。

   就因為 EXISTS 返回的是真值或假值,所以他所帶的子查詢一般直接用'select *' 因為給出列名也沒多少意義。

   其實,EXISTS屬於相關子查詢,也就是說子查詢的條件依賴於外層父查詢的查個屬性值。比如:
select Sname
from Student
where exists (
      select *
      from SC                                 
      where Sno=Student.Sno and Cno ='1');
所說的依賴也就是這一句“ Sno=Student.Sno”。這里要說明一下,這個查詢過程不是一般的自下而上執行,他與外查詢依賴,執行的時候是先從父查詢中取一個元組,然后根據條件 Sno=Student.Sno 處理內查詢,得到結果再進行父查詢中取第二個元組,如果反復。

可與NOT 連用,反意思反過來理解,如:
select Sname
from Student
where not esists (
      select *
      from SC
      where Sno=Student.Sno and Cno ='1');

EXISTS 的子查詢,有一些是不能被其它形式的子查詢等價替換的,但是所有 IN、比較運算符、ANY 和ALL的子查詢都能用帶有EXISTS 的子查詢等價替換。但是在做的時候,請考慮效率問題,哪種高效用啊種,這是優化問題。

例如在上一篇 IN 的講述中第一個例子,我們就可以改一下,變成:
select Sno,Sname,Sdept
from Student S1
where exists (
select *
from Student S2
where S2.Sdept=S1.Sdept and S2.Sname='A');

在這里,EXISTS只要知道內查詢是否為空值就可以了,所以效率要比用IN的查詢要高效一些。

2. 如何理解一下語句:

        SELECT Sname
        FROM Student
        WHERE NOT EXISTS
                    (SELECT *
                        FROM Course
                        WHERE NOT EXISTS
                                      (SELECT *
                                       FROM SC
                                       WHERE Sno= Student.Sno
                                             AND Cno= Course.Cno
                                       )
                       );

這個例子目的是查找數據庫三個表中是否存在不對應的記錄(各表應存在如下關系SC.Cno= Course.Cno ,sc.Sno= Student.Sno

)

它的功能和in有點類似,這條語句改成用in的方法就是這樣,這樣就比較容易理解了.

 

SELECT Sname FROM Student

WHERE Sno IN (SELECT Sno FROM SC WHERE Cno IN (SELECT Cno FROM Course))

3. exist與in的區別

in 和 exists也是很好區別的.

in 是一個集合運算符.

A   in {a,c,d,s,d....}

這個運算中,前面是一個元素,后面是一個集合,集合中的元素類型是和前面的元素一樣的.

   而exists是一個存在判斷,如果后面的查詢中有結果,則exists為真,否則為假.

   in 運算用在語句中,它后面帶的select 一定是選一個字段,而不是select *.

   比如說你要判斷某班是否存在一個名為"小明"的學生,你可以用in 運算:

"小明" in

(select sname from student)

這樣(select sname from student)

返回的是一個全班姓名的集合,in用於判斷"小明"是否為此集合中的一個數據;

同時,你也可以用exists語句:

exists

(select * from student where sname="小明")

這兩個涵數是差不多的, 但是由於優化方案的不同, 通常NOT

EXISTS要比NOT IN 要快, 因為NOT EXISTS可以使用結合算法而NOT IN 就不行了,而EXISTS則不如IN快,

因為這時候IN可能更多的使用結合算法.

select * from 表A where exists(select * from 表B

where 表B.id=表A.id)

這句相當於 

select * from 表A where id in (select id

from 表B)

:對於表A的每一條數據,都執行(select * from 表B where

B.id=表A.id )的存在性判斷,如果表B中存在表A當前行相同的id,則exists為真,該行顯示,否則不顯示

exits適合內小外大的查詢,in適合內大外小的查詢

IN
確定給定的值是否與子查詢或列表中的值相匹配。 
EXISTS
指定一個子查詢,檢測行的存在。


比較使用 EXISTS 和 IN 的查詢
這個例子比較了兩個語義類似的查詢。第一個查詢使用 EXISTS 而第二個查詢使用 IN。注意兩個查詢返回相同的信息。 

USE

pubs
GO
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')
GO

=============================================================
-- Or, using the IN clause:
USE pubs
GO
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
(SELECT

pub_id
FROM titles
WHERE type = 'business')
GO

下面是任一查詢的結果集: 
pub_name
----------------------------------------
Algodata

Infosystems
New Moon Books

(2 row(s) affected)

exits 相當於存在量詞:表示集合存在,也就是集合不為空只作用一個集合.例如 exist P

表示P不空時為真; not exist P表示p為空時 為真 in表示一個標量和一元關系的關系。例如:s in P表示當s與P中的某個值相等時為真; s

not in P 表示s與P中的每一個值都不相等時 為真


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM