SQL中 in 、not in 、exists、not exists 用法和差別


如下:

A

ID NAME

1    A1

2    A2

3  A3

 

B

ID AID NAME

1    1 B1

2    2 B2

3    2 B3

 

A和表B是1對多的關系 A.ID => B.AID

1 SELECT ID,NAME FROM A WHERE EXIST (SELECT*FROM B WHERE A.ID=B.AID) 

 

執行結果為

 

1 A1

 

2 A2

 

 

原因可以按照如下分析

 

 1 SELECT ID,NAME FROM A WHEREEXISTS (SELECT*FROM B WHERE B.AID=1)
 2 
 3 --->SELECT * FROM B WHERE B.AID=1有值返回真所以有數據
 4 
 5  
 6 
 7 SELECT ID,NAME FROM A WHEREEXISTS (SELECT*FROM B WHERE B.AID=2)
 8 
 9 --->SELECT * FROM B WHERE B.AID=2有值返回真所以有數據
10 
11  
12 
13 SELECT ID,NAME FROM A WHEREEXISTS (SELECT*FROM B WHERE B.AID=3)
14 
15 --->SELECT * FROM B WHERE B.AID=3無值返回真所以沒有數據

 

 

 

NOTEXISTS就是反過來

 

 

1 SELECT ID,NAME FROM A WHERENOT EXIST (SELECT*FROM B WHERE A.ID=B.AID) 

 

執行結果為

 

3 A3

 

 

===========================================================================

 

EXISTS=IN,意思相同不過語法上有點點區別,好像使用IN效率要差點,應該是不會執行索引的原因

 

SELECT ID,NAME FROM A WHEREID IN (SELECT AID FROM B)

 

 

 

NOTEXISTS=NOTIN ,意思相同不過語法上有點點區別

 

SELECT ID,NAME FROM A WHEREIDNOTIN (SELECT AID FROM B)

 

 

 

 

 

下面是普通的用法:

 

 

 

SQLIN,NOTIN,EXISTS,NOT EXISTS的用法和差別:

 

IN:確定給定的值是否與子查詢或列表中的值相匹配。

 

IN關鍵字使您得以選擇與列表中的任意一個值匹配的行。

 

當要獲得居住在 CaliforniaIndiana Maryland 州的所有作者的姓名和州的列表時,就需要下列查詢:

 

SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID =1OR CategoryID =4OR CategoryID =5

 

然而,如果使用IN,少鍵入一些字符也可以得到同樣的結果:

 

SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID IN (1, 4, 5)

 

IN關鍵字之后的項目必須用逗號隔開,並且括在括號中。

 

下列查詢在 titleauthor 表中查找在任一種書中得到的版稅少於50%的所有作者的 au_id,然后從 authors 表中選擇 au_id

 

titleauthor 查詢結果匹配的所有作者的姓名:

 

SELECT au_lname, au_fname FROM authors WHERE au_id IN (SELECT au_id FROM titleauthor WHERE royaltyper <50)

 

結果顯示有一些作者屬於少於50%的一類。

 

NOTIN:通過NOTIN關鍵字引入的子查詢也返回一列零值或更多值。

 

以下查詢查找沒有出版過商業書籍的出版商的名稱。

 

SELECT pub_name FROM publishers WHERE pub_id NOTIN (SELECT pub_id FROM titles WHERE type ='business')

 

使用EXISTSNOTEXISTS引入的子查詢可用於兩種集合原理的操作:交集與差集。

 

      兩個集合的交集包含同時屬於兩個原集合的所有元素。

 

差集包含只屬於兩個集合中的第一個集合的元素。

 

EXISTS:指定一個子查詢,檢測行的存在。

 

本示例所示查詢查找由位於以字母 B 開頭的城市中的任一出版商出版的書名:

 

SELECTDISTINCT pub_name FROM publishers WHEREEXISTS (SELECT*FROM titles WHERE pub_id = publishers.pub_id AND type =

 

'business')

 

SELECTdistinct pub_name FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles WHERE type ='business')

 

兩者的區別:

 

EXISTS:后面可以是整句的查詢語句如:SELECT*FROM titles

 

IN:后面只能是對單列:SELECT pub_id FROM titles

 

NOTEXISTS:

 

例如,要查找不出版商業書籍的出版商的名稱:

 

SELECT pub_name FROM publishers WHERENOTEXISTS (SELECT*FROM titles WHERE pub_id = publishers.pub_id AND type =

 

'business')

 

下面的查詢查找已經不銷售的書的名稱:

 

SELECT title FROM titles WHERENOTEXISTS (SELECT title_id FROM sales WHERE title_id = titles.title_id)

 

 

 

語法

 

 

 

EXISTS subquery

 

參數

 

subquery:是一個受限的SELECT語句 (不允許有COMPUTE子句和INTO關鍵字)。有關更多信息,請參見SELECT中有關子查詢的討論。

 

 

 

結果類型:Boolean

 

 

 

 

 

結果值:如果子查詢包含行,則返回 TRUE

 

 

 

 

 

示例

 

A. 在子查詢中使用NULL仍然返回結果集

 

 

 

這個例子在子查詢中指定NULL,並返回結果集,通過使用EXISTS仍取值為 TRUE

 

 

 

USE Northwind

 

GO

 

SELECT CategoryName

 

FROM Categories

 

WHEREEXISTS (SELECTNULL)

 

ORDERBY CategoryName ASC

 

GO

 

 

 

B. 比較使用EXISTSIN的查詢

 

 

 

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

 

 

 

USE pubs

 

GO

 

SELECTDISTINCT pub_name

 

FROM publishers

 

WHEREEXISTS

 

    (SELECT*

 

    FROM titles

 

    WHERE pub_id = publishers.pub_id

 

    AND type = /'business/')

 

GO

 

 

 

-- Or, using the IN clause:

 

 

 

USE pubs

 

GO

 

SELECTdistinct pub_name

 

FROM publishers

 

WHERE pub_id IN

 

    (SELECT pub_id

 

    FROM titles

 

    WHERE type = /'business/')

 

GO

 

 

 

 

 

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

 

 

 

pub_name                               

 

----------------------------------------

 

Algodata Infosystems                   

 

New Moon Books                         

 

 

 

C.比較使用EXISTS=ANY的查詢

 

 

 

本示例顯示查找與出版商住在同一城市中的作者的兩種查詢方法:第一種方法使用=ANY,第二種方法使用EXISTS。注意這兩種方法返回相同的信息。

 

 

 

USE pubs

 

GO

 

SELECT au_lname, au_fname

 

FROM authors

 

WHEREexists

 

    (SELECT*

 

    FROM publishers

 

    WHERE authors.city = publishers.city)

 

GO

 

 

 

-- Or, using = ANY

 

 

 

USE pubs

 

GO

 

SELECT au_lname, au_fname

 

FROM authors

 

WHERE city =ANY

 

    (SELECT city

 

    FROM publishers)

 

GO

 

 

 

 

 

D.比較使用EXISTSIN的查詢

 

 

 

本示例所示查詢查找由位於以字母 B 開頭的城市中的任一出版商出版的書名:

 

 

 

USE pubs

 

GO

 

SELECT title

 

FROM titles

 

WHEREEXISTS

 

    (SELECT*

 

    FROM publishers

 

    WHERE pub_id = titles.pub_id

 

    AND city LIKE /'B%/')

 

GO

 

 

 

-- Or, using IN:

 

 

 

USE pubs

 

GO

 

SELECT title

 

FROM titles

 

WHERE pub_id IN

 

    (SELECT pub_id

 

    FROM publishers

 

    WHERE city LIKE /'B%/')

 

GO

 

 

 

 

 

E. 使用NOTEXISTS

 

 

 

NOTEXISTS的作用與EXISTS正相反。如果子查詢沒有返回行,則滿足NOTEXISTS中的WHERE子句。本示例查找不出版商業書籍的出版商的名稱:

 

 

 

USE pubs

 

GO

 

SELECT pub_name

 

FROM publishers

 

WHERENOTEXISTS

 

    (SELECT*

 

    FROM titles

 

    WHERE pub_id = publishers.pub_id

 

    AND type = /'business/')

 

ORDERBY pub_name

 

GO

 


免責聲明!

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



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