join連線表時是先join還是先where

2021-08-02 20:49:04 字數 1625 閱讀 9805

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

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連線多個表

select from table1 inner join table2 on table1.id table2.id 其實 inner join on的語法格式可以概括為 from 表1 inner join 表2 on 表1.欄位號 表2.欄位號 inner join 表3 on 表1.欄位號 ...

MySql 學習筆記 連線表(JOIN)

inner join內連線 將乙個表中的行與其他表中的行進行匹配 select column list from t1inner join t2 on join condition1 inner join t3 on join condition2 where where conditions 由於...

Sql語法之join表連線說明

sql語法之join表連線說明 左連線 右連線 內連線我們可以看成是在全連線的基礎上過濾條件,這樣比較容易理解 語法 select from a join b 查詢結果 a表資料條數 b表資料條數 查詢總條數 語法 select from a inner join b on a.id b.id 簡化...