閱讀538 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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_name1
MINUS
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_Information
UNION 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

  上一篇:go Objective-C中的基本數據類型
  下一篇:go 如何讓service不被殺死