sql join 用於根據兩個或多個表中的列之間的關係,從這些表中查詢資料。注意,join後的資料記錄數不一定就是左或右表的簡單連線,圖表只代表集合關係,在數量上並不準確,如這個條件後結果,數量大於左表總數。
我喜歡這個概念,不過讓我們先來看看這是否會在實際中發揮作用。假設我們有以下的兩個**,表a在左邊,表b在右邊,我們將它們填充每個四條記錄。
id name id name
-- ---- -- ----
1 pirate 1 rutabaga
2 monkey 2 pirate
3 ninja 3 darth vader
4 spaghetti 4 ninja
讓我們通過name欄位以幾個不同的方式連線這些表,看看是否會得到乙個概念上匹配那些漂亮的維恩圖。
select * from tablea
inner join tableb
on tablea.name = tableb.name
id name id name
-- ---- -- ----
1 pirate 2 pirate
3 ninja 4 ninja
inner join
產生的結果集中,是a和b的交集。
select * from tablea
full outer join tableb
on tablea.name = tableb.name
id name id name
-- ---- -- ----
1 pirate 2 pirate
2 monkey null null
3 ninja 4 ninja
4 spaghetti null null
null null 1 rutabaga
null null 3 darth vader
full outer join
產生a和b的並集。但是需要注意的是,對於沒有匹配的記錄,則會以null做為值。
select * from tablea
left outer join tableb
on tablea.name = tableb.name
id name id name
-- ---- -- ----
1 pirate 2 pirate
2 monkey null null
3 ninja 4 ninja
4 spaghetti null null
left outer join
產生表a的完全集,而b表中匹配的則有值,沒有匹配的則以null值取代。
select * from tablea
left outer join tableb
on tablea.name = tableb.name
where tableb.id is null
id name id name
-- ---- -- ----
2 monkey null null
4 spaghetti null null
為了產生一套只在表a記錄,而不是在表b中,我們執行相同的left outer join
,然後通過乙個where子句排除我們不想要的右側記錄。
select * from tablea
full outer join tableb
on tablea.name = tableb.name
where tablea.id is null
or tableb.id is null
id name id name
-- ---- -- ----
2 monkey null null
4 spaghetti null null
null null 1 rutabaga
null null 3 darth vader
要生成的記錄集獨特的表a和表b,我們執行相同的full outer join
,然後通過乙個where子句排除我們不從雙方想要的記錄。
還需要註冊的是我們還有乙個是「交差集」cross join
, 這種join沒有辦法用文式圖表示,因為其就是把錶a和表b的資料進行乙個n*m的組合,即笛卡爾積。表示式如下:
select * from tablea
cross join tableb
這個笛卡爾乘積會產生 4 x 4 = 16 條記錄,一般來說,我們很少用到這個語法。但是我們得小心,如果不是使用巢狀的select語句,一般系統都會產生笛卡爾乘積然再做過濾。這是對於效能來說是非常危險的,尤其是表很大的時候。
原文 a visual explanation of sql joins
翻譯 segmentfault
參考 酷殼
by 張瑩 · 2012 年 8 月 3 日
left join :左連線,返回左表中所有的記錄以及右表中連線字段相等的記錄。
right join :右連線,返回右表中所有的記錄以及左表中連線字段相等的記錄。
inner join: 內連線,又叫等值連線,只返回兩個表中連線字段相等的行。
full join:外連線,返回兩個表中的行:left join + right join。
cross join:結果是笛卡爾積,就是第乙個表的行數乘以第二個表的行數。
關鍵字: on
資料庫在通過連線兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然後再將這張臨時表返回給使用者。
在使用left jion時,on和where條件的區別如下:
1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。
2、where條件是在臨時表生成好後,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。
假設有兩張表:
表1:tab2
idsize110
220330
表2:tab2
size
name
10aaa
20bbb
20ccc
兩條sql:
1、select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=』aaa』
2、select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=』aaa』)
第一條sql的過程:
1、中間表
on條件:
tab1.size = tab2.size
(注意:有4條記錄,大於tab1的總記錄數)
tab1.id
tab1.size
tab2.size
tab2.name110
10aaa220
20bbb220
20ccc330
(null)
(null)
2、再對中間表過濾
where 條件:
tab2.name=』aaa』
tab1.id
tab1.size
tab2.size
tab2.name110
10aaa
第二條sql的過程:
1、中間表
on條件:
tab1.size = tab2.size and tab2.name=』aaa』
(條件不為真也會返回左表中的記錄)
tab1.id
tab1.size
tab2.size
tab2.name110
10aaa220
(null)
(null)330
(null)
(null)
其實以上結果的關鍵原因就是left join,right join,full join的特殊性,不管on上的條件是否為真都會返回left或right表中的記錄,full則具有left和right的特性的並集。 而inner jion沒這個特殊性,則條件放在on中和where中,返回的結果集是相同的。
Sql 資料庫 join 連線
sql裡面有兩個連線乙個是union,另乙個就是join 他們兩個的區別 union 連線的是行 是一行一行的連 而 join 連線的是列 字段 他們倆的區別暫時就就知道這點 join連線的使用的前提 1.必須要有至少乙個表 乙個表可以用自連線 2.必須要有相關聯的列 字段 主鍵外來鍵啥的。join...
資料庫多表查詢SQL語句
最近在做 進銷存業務系統 作為專案組成員的一部分,我負責統計查詢,簡單說就是多表查詢,網上有很多,但是很明確的卻沒有,所以讓我這個初學者了費,最終還是搞出來了,在這裡也和大家共享一下成果和其中出現的問題,高手可繞道,不求點讚,只為方便大家。下面開始 我一共建了4個表,分別是supplier purc...
SQL資料庫使用JOIN的優化方法
很早以前,也是一提到sql server,就覺得它的效能沒法跟oracle相比,一提到大資料處理就想到oracle。自己一路走來,在本地blog上記錄了很多優化方面的 post,對的錯的都有,沒有時間系列的整理出來,這篇文章將join方法的概念稍微整理在一起,給大家個參考。通過查資料了解裡面提到的各...