一.並集:
需求:匯總t1、t2兩表的數據
mysql、postgresql、oracle數據庫取並集都是用union/union all關鍵字,不再贅述
二.交集:
需求:選出既在t1表又在t2表的數據
1.mysql數據庫取交集,沒有對應的關鍵字,只能把所有要查詢的字段都加到where條件上,如下
select t1.name, t1.age from t1, t2 where t1.name = t2.name and t1.age = t2.age //如果t1, t2不是表而只是結果集的話,只需要加上with t1 as(...), t2 as (...)就可以了
2.postgresql/oracle數據庫取交集,可以用intersect關鍵字,如下
select t1.name, t1.age from t1
intersect
select t2.name, t2.age from t2
三.差集:
需求:選出在t1表中但不在t2表中的數據
1.mysql數據庫取差集,也沒有對應的關鍵字,有2種方式:
①.用not in
select name, age from t1
where (t1.name, t1.age) not in (select name, age from t2)
注意,where后面字段如果有多個,必須用括號括起來,同時子查詢語句也必須用括號括起來
not in這種方式雖然寫法簡單,但是如果兩個表的數據很多的話,那查詢起來非常慢
②.用連表查詢
sql92:
select t1.name, t1.age from t1
where t1.name != t2.name or t1.age != t2.age
或是
sql99:
select t1.name, t1.age inner join t2
on t1.name != t2.name or t1.age != t2.age
當然,如果t1、t2有多個字段的話,就要一個一個比對,然后用or連接起來
必須用內連接,這點想想左連接和右連接查出的結果集就明白了。
2.postgresql取差集,可以用except關鍵字,如下:
select t1.name, t1.age from t1
except
select t2.name, t2.age from t2
3.oracle數據庫取差集,可以用minus關鍵字,如下
select t1.name, t1.age from t1
minus
select t2.name, t2.age from t2