SQL語句Left join 中On和Where的用法區別
原文地址:點擊打開鏈接
SQL語句如下:
SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.id = 表2.id AND 表2.Name != 'ff' WHERE 表1.NAME != 'aa'
步驟1:返回笛卡爾積(SELECT * FROM 表1 CROSS JOIN 表2)
步驟2:應用ON篩選器(當前的條件為 表1.id = 表2.id AND 表2.Name != 'ff')
步驟3:添加外部行
這一步隻對OUTER JOIN起作用,如果是LEFT JOIN會以左邊的表為保留表,如果是RIGHT JOIN會以右邊的表為保留表。所謂外部行是指,保留表中的行。即使第二步的ON過濾掉了一些行,在這一步,會根據保留表添加第二步過濾掉的行。當前的例子,不存在這種情況。
步驟4:應用WHERE篩選器(當前是Name != ‘aa’)過濾前三步所生成虛擬表的數據。
總結:
如果SQL用的是Left Join ,On後麵的條件對Left的表沒有作用,隻對Right的表有過濾作用,Where語句可以對Left的表有過濾作用。
如果SQL用的是Right Join ,On後麵的條件對Right的表沒有作用,隻對Left的表有過濾作用,Where語句可以對Right的表有過濾作用。
最後更新:2017-04-03 16:49:19
上一篇:
C# 常用函數集錦
下一篇:
office 2007、2010提示錯誤“此錯誤通常是由宏安全性設置造成”
怡海軟件:ERP選型需要關注的幾點?
Adopt Open JDK官方文檔(五) Docker鏡像
6個大數據處理分析的最好工具
互聯網大型應用軟件架構設想與推薦
Eclipse中編譯Android項目工程失敗,提示: Error in an XML file: aborting build 解決辦法
Ubuntu Redmine安裝配置
Android開發7——android.database.CursorIndexOutOfBoundsException:Index -1 requested, with a size of 1
(cljs/run-at (JSVM. :browser) "命名空間就這麼簡單")
雙11數據大屏背後:大規模流式增量計算及應用(附資料)
我的技術之道