Mysql
不使用 ‘INTERSECT’ ,如何只檢索兩個表中存在的行?
我是一個初學者閱讀本書
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
在連接條件中刪除並使用正常相等運算符。