2012-03-28 159 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运算符!]