sql 的join on 和 where 區別

2021-07-07 08:09:45 字數 1552 閱讀 4410

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

id size

1 10

2 20

3 30

表2:tab2

size name

10 aaa

20 bbb

20 ccc

兩條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』)

1、中間表

on條件:

tab1.size = tab2.size

tab1.id tab1.size tab2.size tab2.name

1 10 10 aaa

2 20 20 bbb

2 20 20 ccc

3 30 (null) (null)

2、再對中間表過濾

where 條件:

tab2.name=』aaa』

tab1.id tab1.size tab2.size tab2.name

1 10 10 aaa

1、中間表

on條件:

tab1.size = tab2.size and tab2.name=』aaa』

(條件不為真也會返回左表中的記錄)

tab1.id tab1.size tab2.size tab2.name

1 10 10 aaa

2 20 (null) (null)

3 30 (null) (null)

其實以上結果的關鍵原因就是left join,right join,full join的特殊性,不管on上的條件是否為真都會返回left或right表中的記錄,full則具有left和right的特性的並集。 而inner jion沒這個特殊性,則條件放在on中和where中,返回的結果集是相同的。

join on 和where的執行順序

left join 左連線,返回左表中所有的記錄以及右表中連線字段相等的記錄。right join 右連線,返回右表中所有的記錄以及左表中連線字段相等的記錄。inner join 內連線,又叫等值連線,只返回兩個表中連線字段相等的行。full join 外連線,返回兩個表中的行 left join ...

sql語句聯表查詢之(join on)

表1 表的結構 bumen create table if not exists bumen bid int 10 not null auto increment,mingcheng varchar 30 default null,jingli varchar 30 default null,tel...

Sql語句查詢當天本週本月記錄的where條件

查詢當天 select from info where datediff dd,datetime,getdate 0 查詢24小時內的 select from info where datediff hh,datetime,getdate 24 info為表名,datetime為資料庫中的字段值 查...