資料庫sql的join多表

2022-02-21 18:01:50 字數 4557 閱讀 4635

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方法的概念稍微整理在一起,給大家個參考。通過查資料了解裡面提到的各...