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


exists (sql 返回結果集為真) 
not exists (sql 不返回結果集為真) 
如下: 
表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 

SELECT ID,NAME FROM A WHERE EXIST (SELECT * FROM B WHERE A.ID=B.AID) 
執行結果為 
1 A1 
2 A2 
原因可以按照如下分析 
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=
--->SELECT * FROM B WHERE B.AID=1有值返回真所以有數據 

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2
--->SELECT * FROM B WHERE B.AID=2有值返回真所以有數據 

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3
--->SELECT * FROM B WHERE B.AID=3無值返回真所以沒有數據 

NOT EXISTS 就是反過來 
SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID) 
執行結果為 
3 A3 
=========================================================================== 
EXISTS = IN,意思相同不過語法上有點點區別,好像使用IN效率要差點,應該是不會執行索引的原因 
SELECT ID,NAME FROM A  WHERE ID IN (SELECT AID FROM B) 

NOT EXISTS = NOT IN ,意思相同不過語法上有點點區別 
SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B) 


下面是普通的用法: 

SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差別: 


  IN:確定給定的值是否與子查詢或列表中的值相匹配。 
  IN 關鍵字使您得以選擇與列表中的任意一個值匹配的行。 


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


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


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


  SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID IN (145


  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 WHEREroyaltyper <50


  結果顯示有一些作者屬於少於 50% 的一類。 
  NOT IN:通過 NOT IN 關鍵字引入的子查詢也返回一列零值或更多值。 
  以下查詢查找沒有出版過商業書籍的出版商的名稱。 


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


  使用 EXISTS 和 NOT EXISTS 引入的子查詢可用於兩種集合原理的操作:交集與差集。 
      兩個集合的交集包含同時屬於兩個原集合的所有元素。 
  差集包含只屬於兩個集合中的第一個集合的元素。 
  EXISTS:指定一個子查詢,檢測行的存在。 
  本示例所示查詢查找由位於以字母 B 開頭的城市中的任一出版商出版的書名: 


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


  SELECT distinct pub_name FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles WHEREtype = 'business') 


  兩者的區別: 
  EXISTS:后面可以是整句的查詢語句如:SELECT * FROM titles 
  IN:后面只能是對單列:SELECT pub_id FROM titles 
  NOT EXISTS: 
  例如,要查找不出版商業書籍的出版商的名稱: 


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


  下面的查詢查找已經不銷售的書的名稱: 
  SELECT title FROM titles WHERE NOT EXISTS (SELECT title_id FROM sales WHERE title_id =titles.title_id) 



比較使用 EXISTS 和 = ANY 的查詢 

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

USE pubs 
GO 
SELECT au_lname, au_fname 
FROM authors 
WHERE exists 
    (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 


比較使用 EXISTS 和 IN 的查詢 

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

USE pubs 
GO 
SELECT title 
FROM titles 
WHERE EXISTS 
    (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 


免責聲明!

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



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