轉自: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中的每一個值都不相等時 為真
