2012-03-28 317 views
-1

科(branch_name,branch_city,資產)
顧客(CUSTOMER_NAME,customer_street,customer_city)
貸款(loan_number,branch_name之間的差異,量)
借款人(CUSTOMER_NAME,loan_number)
帳戶(ACCOUNT_NUMBER,branch_name,平衡)
存款(CUSTOMER_NAME,ACCOUNT_NUMBER)「=」 和 「IN」/ 「NOT IN」 和 「MINUS」

如何是 「=」 和 「IN」 和 「NOT IN」 和「 MINUS「在

select c.customer_name 
from Customer c, Borrower b, Loan l 
where c.customer_city = 'Fairfax AND c.customer_name = b.customer_name 
       AND b.loan_number = l.loan_number 
minus 
select d.customer_name 
from Depositer d, Account a 
where d.account_number = a.account_number 

select c.customer_name 
from Customer c 
where c.customer_city = 'Fairfax' AND c.customer_name in 
    (select b.customer_name 
    from Borrower b 
    where b.loan_number in 
     (select l.loan_number 
     from Loan l 
     where b.customer_name not in 
      (select d.customer_name 
      from Account a, Depositor d 
      where a.account_number = d.account_number))) 

彼此不同?他們應該完成相同的事情

+0

通常... =運算符用於單個值檢查,其中IN用於執行多值檢查。 – Teja 2012-03-28 19:45:53

+0

你在第一個查詢中缺少'b'的聲明,可能想補充一點,所以人們知道你從哪裏得到它 – jzworkman 2012-03-28 19:46:32

+1

令人驚訝的是......或者不......這些都在[參考手冊](http ://dev.mysql.com/doc/refman/5.5/en/select.html) – 2012-03-28 19:56:07

回答

0

=用於比較單個值,而IN用於比較幾個值。那麼NOT IN就會恰好相反,即它等於除了這些值之外的任何值,並且MINUS實際上是從第二子查詢中減去第一子查詢中的每個結果。

你可以找到約零下這裏更多的信息:MINUS keyword

+0

從什麼時候MySQL支持'MINUS'運算符?我剛剛在5.5版本中試過並發現錯誤(如果我沒有弄錯,它也不支持標準EXCEPT運算符) – 2012-03-28 21:06:15

+0

「=用於比較單個值」 - 我不確定是否正確:在我的答案中查看「使用量化比較的交叉點」示例。 – onedaywhen 2012-03-29 09:16:20

0

WHERE ... IN ...允許你搜索值的列表,例如:

SELECT * FROM `orders` WHERE `status` IN("placed", "processed", "fulfilled") 

這比寫這個簡單:

SELECT * FROM `orders` WHERE `status` = "placed" OR `status` = "processed" OR `status` = "fulfilled" 

特別是當你不知道可能值的「範圍」,或者你想結合該條件與其他條件(它會得到nast y有很多括號條件)。例如:

SELECT * FROM `orders_items` WHERE `order_id` IN (
    SELECT `order_id` FROM `orders` WHERE `status` IN ("processed", "fulfilled") 
) 

很多時候,一個JOIN會更合適(如在最後一個例子),但WHERE ... IN ...是好的,當你有一個ENUM列,或可能的過濾器預先定義的列表。

WHERE ... NOT IN ...是一樣的,但否定。

要回答你的實際問題,老實說,我沒有時間看看這些查詢是如何不同的。我寧願以前對後者的查詢,如果只是可讀性。當您處理主鍵引用(即INT列)時,我幾乎總是傾向於JOIN s而不是WHERE INWHERE NOT IN

1

SQL的「樂趣」之一是可以使用各種等效的SQL結構編寫相同的關係運算符(相交,差異等)(這部分解釋了爲什麼SQL優化器並不總是選擇最佳計劃沒有用戶的幫助)。

使用這些簡單的例子表:

WITH A AS (SELECT * FROM (VALUES (1), (2), (3)) AS T (n)), 
    B AS (SELECT * FROM (VALUES (3), (4), (5)) AS T (n)) 

交叉口使用IN (<subquery>)

SELECT n 
    FROM A 
WHERE n IN (SELECT n FROM B) ; 

交叉口使用利用量化比較

SELECT n 
    FROM A 
WHERE n = ANY (SELECT n FROM B) ; 

INTERSEC使用INTERSECT使用INTERSECT

SELECT n 
    FROM A 
INTERSECT 
SELECT n 
    FROM B; 

交叉口和灰,替代語法:

TABLE A 
INTERSECT 
TABLE B; 

使用利用EXISTS (<subquery>)

SELECT n 
    FROM A 
WHERE EXISTS (SELECT * 
        FROM B 
       WHERE B.n = A.n 
      ); 

交叉口交叉口加入

SELECT n 
    FROM A NATURAL JOIN B; 

交叉口使用使用利用NOT IN (<subquery>)

SELECT n 
    FROM A 
WHERE n NOT IN (SELECT n FROM B) ; 

差分MATCH (<subquery>)

SELECT n 
    FROM A 
WHERE n MATCH (SELECT n FROM B) ; 

使用差分量化比較

SELECT n 
    FROM A 
WHERE n <> ALL (SELECT n FROM B) ; 

差異o使用EXCEPT [MINUS racle]使用EXCEPT

SELECT n 
    FROM A 
EXCEPT 
SELECT n 
    FROM B; 

差異,替代語法:

TABLE A 
EXCEPT 
TABLE B; 

使用利用NOT EXISTS (<subquery>)

SELECT n 
    FROM A 
WHERE NOT EXISTS (SELECT * 
         FROM B 
        WHERE B.n = A.n 
       ); 

差差加入

SELECT A.n 
    FROM A LEFT OUTER JOIN B ON A.n = B.n 
WHERE B.n IS NULL; 

[SQL沒有NOT MATCH運算符!]