Mysql

不使用 ‘INTERSECT’ ,如何只檢索兩個表中存在的行?

  • September 14, 2021

我是一個初學者閱讀本書Sams Teach Yourself SQL in 10 Minutes (Fifth Edition)來學習SQL。

這是來自第 14 章 - 組合查詢的書中的一個範例 SQL 查詢

我的問題是關於其他UNION類型的註釋 -INTERSECT

首先 - 從這個Db 結構中查看表的結構 - 圖像

這是查詢

SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL','IN','MI')
INTERSECT
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All'
ORDER BY cust_name, cust_contact;

在這個例子後面的註釋中,它說

INTERSECT 可用於僅檢索兩個表中都存在的行。

在那條線之下

然而,在實踐中,這些 UNION 類型很少使用,因為使用連接可以實現相同的結果。

那麼,我如何使用 joins 而不是INTERSECT. 我嘗試了所有我學到的東西,但沒有得到結果。

請通過分享所需的查詢來提供幫助。

謝謝

INTERSECT並且INNER JOIN可以獲得類似的結果,但有一些警告:

  • INTERSECT(即INTERSECT DISTINCT,這是預設操作)從結果集中刪除重複項。INNER JOIN不會自行執行此操作。因此,如果您的客戶表中有多個客戶實例,那麼您的INTERSECT行為INNER JOIN將有所不同,除非您這樣做SELECT DISTINCT
  • 一個連接條件,例如INNER JOIN ... ON x = y在 NULL 值上不匹配,因此在其中一個條件中具有 NULL 的行將被排除,而INTERSECT將匹配。要獲得與連接條件相同的效果,請使用<=>匹配 NULL 值的運算符。

在您的範例查詢中,只有一個表。因此,即使沒有JOIN. 只需使用 aSELECT DISTINCT並將WHERE條件與a 結合起來AND

SELECT DISTINCT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL','IN','MI') AND cust_name = 'Fun4All'
ORDER BY cust_name, cust_contact;

JOIN如果您真的想要,當然可以使用 a ,或者如果您確實有兩個不同的表。如果是這樣,它可能看起來像這樣:

SELECT DISTINCT c1.cust_name, c1.cust_contact, c1.cust_email
FROM Customers c1
 INNER JOIN Customers c2 ON 
   c1.cust_name <=> c2.cust_name AND 
   c1.cust_contact <=> c2.cust_contact AND 
   c1.cust_email <=> c2.cust_email
WHERE c1.cust_state IN ('IL','IN','MI') AND c2.cust_name = 'Fun4All'
ORDER BY c1.cust_name, c1.cust_contact;

INNER關鍵字是可選的。

如果您的數據沒有重複值或 NULL 值,或者如果您不關心獲得與 with 完全相同的結果INTERSECT,那麼您可以DISTINCT在連接條件中刪除並使用正常相等運算符。

引用自:https://dba.stackexchange.com/questions/299539