join的不同用法的總結

笛卡爾積:cross join
笛卡爾積是將兩個表的任一記錄相互組合,如果A有m條記錄,B有n條記錄,那麼通過笛卡爾積產生的結果就會有m*n條記錄。
產生迪卡爾積有三種情況:

select * from A cross join B;
select * form A inner join B; #如果有on的話,就是內連接,即求交集
select * from A,B;#注意,此時不能用on或者using,可以用where
select * from A nature join B;
select * from A natura join B;

#特意搜索了一下,這個和natura和nature的有啥區別,結果都是一樣的。要與自然連接區分清楚,自然連接是

select * from A natural join B;

所謂自然連接是有隱式的on條件的,無需顯式的寫出來,mysql會自動找相同的字段連接(劃重點,相同的字段名稱,不相同是不行的)

內連接:inner join,從笛卡爾的角度看就是從那麼多任意相連接的記錄中找到符合on條件的記錄。共有下面幾種寫法:

select * from A inner join B on A.id = B.id; #省略inner也是可以的
select * from A , B where A.id = B.id;
select * from A straight_join B on A.id = B.id;

左連接
即是除了A、B兩個表的交集外,還要加上A表中剩下的記錄。

select * from A left join B on A.id = B.id

右連接:即是除了A、B兩個表的交集外,還要加上B表中剩下的記錄。

select * from A right join B on A.id = B.id

外連接
即A、B的並集,即從笛卡爾積中挑選出on子句成立的記錄+左邊剩下的記錄+右表剩下的記錄。因爲mysql暫時不支持outer join,故可以對左連接的結果union右連接的結果
select * from A left join B on A.id = B.id union select * from A right join B on A.id = B.id

using
這個厲害了,目的就是爲了替代on那一大串連接條件的,前提是A,B表中要連接的字段名稱是相同的,否則把using累壞也找不到哪個是要連接的。
比如A,B中都有id,並且就是要讓id相連的,那可以呀,直接上using

`select * from A left join B on A.id = B.id`

改爲:

 select * from A left join B using(id);

是不是很完美~

自然連接
那就更厲害了,using也不用了,不過前提都是一樣的,兩表相連接的字段名稱是一樣的,直接

select * from A left join B on A.id = B.id 

改爲:

 select * from A natural join B;

可見爲了簡便無所不用其極,這就是進步的動力吧,咋樣方便咋樣來。
當然啦,要對稱,咋個能缺少左自然連接、右自然連接呢

select * from A left natural join B;
select * from A right natural join B;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章