1. 程式人生 > >關聯查詢時用on篩選和用where篩選的區別

關聯查詢時用on篩選和用where篩選的區別

剛開始用left join是總是傻傻分不清楚篩選條件到底該放在on之後還是where之後,這裡我們先說原理再通過例子方便大家理解

使用left join時,原理簡單的可以描述為先將左邊的主表結果集查詢出來,然後遍歷主表結果集,對於每一條主表資料都會根據on後的條件去查詢從表,查到了就拿出從表中需要的資料,查不到就為空。也就是說on後的條件僅僅是針對從表資料進行篩選的。這樣即使篩選不到也不影響最終的結果集數量。

而篩選條件放在where之後,這個大家清楚,就是對總得結果集進行篩選了。

舉個簡單例子:現在有兩張表,TA是使用者表,TB是企業表,其中TA表中使用者有歸屬企業欄位(欄位為enterprise_id)。TB表中企業又分國企和私企兩種型別(企業型別欄位為type,1-國企  2-私企)。

現在有兩個需求:

1.管理人員需要檢視所有使用者,如果該使用者屬於國企單位,還要檢視其企業名稱,注意私企使用者也要顯示,只不過私企太多,管理人員並不關心其歸屬的私企名稱

2.管理人員需要檢視所有屬於國企單位的使用者以及其企業名稱

我們先上sql:

對於需求1,sql如下:

select TA.*,TB.name as '企業名稱' from TA left join TB on ta.enterprise_id=TB.id and TB.type=1;

對於需求2,sql如下:

select TA.*,TB.name as '企業名稱' from TA left join TB on ta.enterprise_id=TB.id where TB.type=1;

可以看到需求1的sql,篩選條件是放在On後的,而需求2的sql,篩選條件在where後,那麼區別是什麼呢?

需求1:結合上面的原理,對於本例來說意味著TA表的使用者資料管理員都可以看到,如果使用者歸屬企業型別是國企,管理員還可以看到其企業名稱,但如果不是國企則也僅僅是看不到企業名稱而已,使用者資料還是在的。

需求2:結合上面的原理,對於本例來說非國企的使用者都會被過濾掉,管理員看到的只有國企使用者

----------------------------------------------------------------------------------------------------------------------------------------------------------

上面說的是left join,如果換成right join,顯然沒什麼區別,因為同是外連線,原理沒什麼不同

但如果換成inner join,情況就有所不同了,inner join屬於內連線,也叫等值連線,on後的條件對連線的兩張表都做篩選,沒有主次之分,不滿足的資料項一概都不返回,所以在inner join中,on之後的條件和where之後的條件在功能上是沒有區別的