SQL 交集 差集 並集 笛卡爾積 應用實例

一、 交集 Join   

1、inner join 其處理結果與等值/自然連接相同  

mssql :      

-- mssql 中 inner join   連接需要 on Connection條件 否則會報錯, mysql 不會,其結果等於cross join 
select * from Major m  inner JOIN   
dbo.DepNmOrSubjectNm d on m.DepNoOrSubjectNo =d.DepNoOrSubjectNo 
mysql: 
-- 其結果等於 crose join 
select * from Major m inner join  Department d ; 
-- 等值連接 
select m.*,d.* from Major m inner  join   Department d on m.dptId = d.dptId; 

2、 left join /left outer join 左連接/左外連接    

注:在sql 中, left join 爲 left outer join 的縮寫    

mssql:

select * from Major m   left  outer  JOIN   
dbo.DepNmOrSubjectNm d on m.DepNoOrSubjectNo =d.DepNoOrSubjectNo 

mysql:

select * from Major m   left    join `department` d on m.dptId = d.dptId; 

3、 right join/right outer join 右連接/右外連接   

mssql:    

select * from Major m   right  outer  JOIN   
dbo.DepNmOrSubjectNm d on m.DepNoOrSubjectNo =d.DepNoOrSubjectNo 

mysql:    

select * from Major m   right outer    join `department` d on m.dptId = d.dptId; 

4、full join 全連接

mssql:

--a 
select * from Major m  FULL OUTER JOIN   
dbo.DepNmOrSubjectNm d on m.DepNoOrSubjectNo =d.DepNoOrSubjectNo 
--b
select * from Major m   left  outer  JOIN   
dbo.DepNmOrSubjectNm d on m.DepNoOrSubjectNo =d.DepNoOrSubjectNo 
union 
select * from Major m   right  outer  JOIN   
dbo.DepNmOrSubjectNm d on m.DepNoOrSubjectNo =d.DepNoOrSubjectNo 
--c 
select * from Major m   left  outer  JOIN   
dbo.DepNmOrSubjectNm d on m.DepNoOrSubjectNo =d.DepNoOrSubjectNo 
union all 
select * from Major m   right  outer  JOIN   
dbo.DepNmOrSubjectNm d on m.DepNoOrSubjectNo =d.DepNoOrSubjectNo 
where m.DepNoOrSubjectNo is null 

mysql:    
注:mysql 5.0版本還不支持 full join ,但可以採用 join + union方法實現,詳細可以參考:    
http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/    

--全連接 == 一個左連接 + 一個右連接 + union(去掉相同行) 
--a
select * from Major m  left outer join `department` d on m.dptId = d.dptId 
union   
select * from Major m  right outer join `department` d on m.dptId = d.dptId 
--b
select * from Major m  left outer join `department` d on m.dptId = d.dptId 
union  all 
select * from Major m  right outer join `department` d on m.dptId = d.dptId 
where m.dptId is null 
--大力提倡使用b,尤其是在處理很大的記錄集時, union all 不會進行排序及消除相同的行(消除相同的行可能通過第二個join的條件進行實現),所以可以節省不少時間. 

二、差集 (not in)    

select * from Major m where m.dptId not in(select dptId from department ) 

差集中, mysql 與 mssql 語句可以直接採用 not in 來實現    

三.、並集 union

mssql:    

-- union  並, 默認取消相同 行 
select * from Major m 
union 
select * from Major tm 
-- union full 會有重複記錄 
select * from Major m 
union all 
select * from Major tm

mysql:

-- union 默認會取消重複選項 
select * from Major `major` 
union  select * from Major mj ; 
-- union all 不會取消重複選項 
select * from Major m 
union  all 
select * from Major tm 

四、 笛卡爾積    

 mssql:    

-- 笛卡爾積 
select * from Major cross  join   
dbo.DepNmOrSubjectNm 

mysql:    

-- 笛卡爾集 
select * from Major m cross join `department` d; 

帶條件的笛卡爾積與等值連接功能相同

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章