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
– 表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/