mysql中left join設定條件在on與where時的用法區別分析
本文例項講述了mysql中left join設定條件在on與where時的用法區別。分享給大家供大家參考,具體如下:
一、首先我們準備兩張表來進行測試。
CREATE TABLE `a` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`name` varchar(32) DEFAULT '' COMMENT '名稱',PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `b` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`a_id` int(11) DEFAULT '0' COMMENT 'a表ID',PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
兩個表的資料如圖所示:
執行下面左連線查詢:
select * from a left join b on a.id = b.a_id;
我們分別在on和where後面加上條件,看看執行結果是否相同。
select * from a left join b on a.id = b.a_id and b.id > 3;
select * from a left join b on a.id = b.a_id where b.id > 3;
上面的兩條語句,條件我們設定的是一樣的都是b.id > 3,為什麼顯示結果不同。
sql語句查詢的關鍵字順序一般為 from > where > group by > having > order by
left join 在 from範圍,on 條件會先對 left join 的右表進行篩選,篩選完後的結果 where 再進行篩選。
多個 left join 會生成一張臨時表,on 條件是對 left join 右表進行條件過濾,where 條件針對最後生成的臨時表進行過濾。
所以:
b.id > 3 的條件如果寫在 on 後面,則是先對右邊表(關聯表)進行篩選,得出符合條件的行,然後主表 left join ,返回主表所有的行,右邊表沒匹配上的用 null 表示。
b.id > 3 的條件如果寫在 where 後面,則是先主表 left join 右邊表(關聯表),返回所有的行,然後 where 條件再對結果進行篩選。
注意:on 後面的條件是針對右邊的表(關聯表),對主表沒什麼作用。
select * from a left join b on a.id = b.a_id and a.id > 3;
我們在on 後面添加了對主表的條件 a.id > 3,不過主表的資料仍然全部顯示出來了,但是影響了右邊表(關聯表)的顯示。
如果想要對主表進行篩選,應該把條件寫在where後。
select * from a left join b on a.id = b.a_id where a.id > 3;
更多關於MySQL相關內容感興趣的讀者可檢視本站專題:《MySQL查詢技巧大全》、《MySQL常用函式大彙總》、《MySQL日誌操作技巧大全》、《MySQL事務操作技巧彙總》、《MySQL儲存過程技巧大全》及《MySQL資料庫鎖相關技巧彙總》
希望本文所述對大家MySQL資料庫計有所幫助。