1. 程式人生 > >left join on 後增加條件分析

left join on 後增加條件分析

SQL用過一定時間的同學,對left join,right join應該非常熟悉了,可能有些同學包括我在內,

對left/right join on 後面增加左表或右表條件後,或者多個left/right join 表不同的位置查詢結果

感覺到很不解,因此我對以下左連線做了分析演示:

1.兩個表的左連線的查詢。

2.兩個表左連線,在on後面增加左表條件,以及增加右表條件的查詢。

3.三張表的左連線的查詢(不同的條件)。

備註:這篇文章沒有對where後增加條件進行分析,大家只要記住,where後面增加的條件是對臨時表生成後,進行過濾的。

而on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。

***tab1 left join tab2 on,其實on後面的條件就是對tab2資料的過濾。

》》》演示資料指令碼

– 表1

DROP TABLE IF EXISTS tab1;

CREATE TABLE tab1 (

id int(11) DEFAULT NULL,

size int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO tab1 VALUES (‘1’, ‘10’);

INSERT INTO tab1 VALUES (‘2’, ‘20’);

INSERT INTO tab1

VALUES (‘3’, ‘30’);

– 表2

DROP TABLE IF EXISTS tab2;

CREATE TABLE tab2 (

size int(11) DEFAULT NULL,

name varchar(255) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO tab2 VALUES (‘10’, ‘AAA’);

INSERT INTO tab2 VALUES (‘20’, ‘BBB’);

INSERT INTO tab2 VALUES (‘20’, ‘CCC’);

– 表3

DROP TABLE IF EXISTS tab3;

CREATE TABLE tab3 (

size int(11) DEFAULT NULL,

notes varchar(255) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO tab3 VALUES (‘10’, ‘F1’);

INSERT INTO tab3 VALUES (‘10’, ‘F2’);

INSERT INTO tab3 VALUES (‘30’, ‘F3’);

》》》演示表資料截圖

1.tab1與tab2的左連線

– 兩張表的左連線

– 查詢左表所有記錄【包含左表與右表匹配以及左表未匹配的記錄】

SELECT

*

FROM

tab1

LEFT JOIN tab2 ON tab1.size = tab2.size;

2.tab1與tab2的左連線(on後面增加條件)

– 很重要:【on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄】。

1)對tab1增加條件

SELECT

*

FROM

tab1

LEFT JOIN tab2 ON tab1.size = tab2.size and tab1.id=2;

– 始終記住left join,左表tab1資料都有,如果加入左表tab1條件tab1.id=2,則只有滿足tab1.id=2,對應的右表tab2.size為20的才有資料,其他為null。

– 重要(相當於只關聯符合tab1.id=2的size,其他為null,得到的結果)

2)對tab2增加條件與tab1對比

SELECT

*

FROM

tab1

LEFT JOIN tab2 ON tab1.size = tab2.size and tab2.name in (‘BBB’,‘CCC’);

– 該結果與1)結果一樣,左表tab1資料都有,右表tab2資料只有滿足tab2.name是BBB和CCC的才有資料,其他為null。

– 重要(相當於只關聯符合tab2.name in (‘BBB’,’CCC’)的size,其他為null,得到的結果)。

3)對tab2增加的條件

SELECT

*

FROM

tab1

LEFT JOIN tab2 ON tab1.size = tab2.size and tab2.name=‘AAA’;

– 左表tab1資料都有,右表tab2資料只有滿足tab2.name是AAA的才有資料,其他為null。

– 重要(相當於只關聯符合tab2.name=’AAA’的size,其他為null,得到的結果)。

3.三張表的左連線(下面兩種寫法結果一樣)

– tab3與tab1、tab2左連線【條件為tab1.size=tab3.size】,

– 這種寫法指,從tab1.size是否在tab3中有匹配資料,如果tab1.size為null,那tab3.size就為null

– 第二種寫法可以看作兩張表的左連線。

SELECT

*

FROM

tab1

LEFT JOIN tab2 ON tab1.size = tab2.size

LEFT JOIN tab3 ON tab1.size = tab3.size;

SELECT

*

FROM

(

SELECT

tab1.size

FROM

tab1

LEFT JOIN tab2 ON tab1.size = tab2.size

) a

LEFT JOIN tab3 ON a.size = tab3.size;

4.三張表的左連線(左連線條件不同)

– tab3與tab1、tab2左連線【條件為tab2.size=tab3.size】,

– 這種寫法指,從tab2.size是否在tab3中有匹配資料,如果tab2.size為null,那tab3.size就為null

– 這種統計在於tab2沒有資料,tab3就沒資料。

瀋陽性病醫院哪家好:http://yyk.39.net/sy/zhuanke/fc844.html
瀋陽治療溼疣正規醫院:http://yyk.familydoctor.com.cn/20631/