SQL中MINUS、INTERSECT、UNION、UNION All
一、基本概念差集:MINUS
交集:INTERSECT
並集:UNION、UNION All。UNION將重複的元組去掉,UNION ALL則不會。

表Store_Information 店麵營業表
store_name |
Sales |
Date |
分店1 |
1500 |
2013-01-05 |
分店2 |
250 |
2013-01-07 |
分店1 |
300 |
2013-01-08 |
分店3 |
700 |
2013-01-08 |
表Internet Sales 網絡營業表
Date |
Sales |
2013-01-07 |
850 |
2013-01-10 |
535 |
2013-01-11 |
320 |
2013-01-12 |
750 |
應用兩個集合的相減,相交和相加時,是有嚴格要求的:內部的SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。每條SELECT 語句中的列的順序必須相同。
①兩個集合的字段必須明確,用*報錯
②字段類型和順序相同,名稱可以不同,如集合1的字段1是NUMBER,字段2是VARCHAR,那集合2的字段1必須也是NUMBER,字段2必須是VARCHAR
③不能排序,如果要對結果排序,可以在集合運算後,外麵再套一個查詢,然後排序。
SELECT * FROM (SELECT order_id FROM made_order MINUS SELECT order_id FROM charge_detail) ORDER
BY ORDER_ID
二、MINUS
SELECT column_name(s) FROM table_name1MINUS
SELECT column_name(s) FROM table_name2
查找有店麵營業額,但沒有網絡營業額的日期。
SELECT Date FROM Store_Information
MINUS
SELECT Date FROM Internet_Sales
結果:
Date
2013-01-05
2013-01-08
可以這樣理解,兩個表的Date字段組成了一個[5,7,8,10,11,12]全集,減去網絡營業表的Date[7,10,11,12]剩下[5,8]就是需要的結果。
三、UNION、UNION All
查找所有有營業額的日子
SELECT Date FROM Store_Information
UNION
SELECT Date FROM Internet_Sales
Date
2013-01-05
2013-01-07
2013-01-08
2013-01-10
2013-01-11
2013-01-12
UNION ALL 和 UNION 不同之處在於 UNION ALL 會將每一筆符合條件的數據都列出來,無論資料值有無重複。
SELECT Date FROM Store_InformationUNION ALL
SELECT Date FROM Internet_Sales
Date
2013-01-05
2013-01-07
2013-01-08
2013-01-08
2013-01-07
2013-01-10
2013-01-11
2013-01-12
四、INTERSECT可以查相關資料
五、性能問題和注意點
雖然同樣的功能可以用簡單SQL語句來實現,但性能差別非常大。made_order共23萬筆記錄,charge_detail共17萬筆記錄:
SELECT order_id FROM made_order
MINUS
SELECT order_id FROM charge_detail
耗時:1.14 sec
SELECT a.order_id FROM made_order a
WHERE a.order_id NOT exists (
SELECT order_id
FROM charge_detail
WHERE order_id = a.order_id
)
耗時:18.19 sec
性能相差15.956倍。因此在遇到這種問題的時候,還是用MINUS,INTERSECT和UNION ALL來解決問題。
原帖地址:
https://www.cnblogs.com/fxgachiever/archive/2010/09/10/1823057.html
https://blog.csdn.net/gan690416372/article/details/5012397
最後更新:2017-04-03 12:55:06