oracle 外連線易錯的地方

2021-09-01 20:08:07 字數 2900 閱讀 3628

兩條sql:

1、select * from tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=』aaa』

2、select * from tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=』aaa』)

第一條sql的過程:

1、中間表

on條件:

tab1.size = tab2.size

tab1.id tab1.size tab2.size tab2.name

1 10 10 aaa

2 20 20 bbb

2 20 20 ccc

3 30 (null) (null)

2、再對中間表過濾

where 條件:

tab2.name=』aaa』

tab1.id tab1.size tab2.size tab2.name

1 10 10 aaa

第二條sql的過程:

1、中間表

on條件:

tab1.size = tab2.size and tab2.name=』aaa』

(條件不為真也會返回左表中的記錄)

tab1.id tab1.size tab2.size tab2.name

1 10 10 aaa

2 20 (null) (null)

3 30 (null) (null)

其實以上結果的關鍵原因就是left join,right join,full join的特殊性,不管on上的條件是否為真都會返回left或right表中的記錄,full則具有left和right的特性的並集。 而inner jion沒這個特殊性,則條件放在on中和where中,返回的結果集是相同的。

join聯表中on,where後面跟條件的區別

對於join的連表操作,這裡就不細述了,當我們在對錶進行join關聯操作時,對於on和where後面的條件,不清楚大家有沒有注意過,有什麼區別,可能有的朋友會認為跟在它們後面的條件是一樣的,你可以跟在on後面,如果願意,也可以跟在where後面。它們在on和where後面究竟有乙個什麼樣的區別呢?

在join操作裡,有幾種情況。left join,right join,inner join等。

為了清楚的表達主題所描述的問題,我簡要的對left,right,inner這幾種連線方式作乙個說明。

下面就拿乙個普通的部落格系統的日誌表(post)和分類表(category)來描述吧。

這裡我們規定有的日誌可能沒有分類,有的分類可能目前沒有屬於它的文章。

1. left join:

(保證找出左聯表中的所有行)

select p.title,c.category_name from post p left join category c on p.cid = c.cid

2. right join:

(保證找出右聯表中的所有行)

查詢所有的分類,並顯示出該分類所含有的文章數。

select count(p.id),c.category_name from post p rightjoin category c on p.pid = c.cid

3. inner join

(找出兩表中關聯相等的行)

查詢有所屬分類的日誌。(即那些沒有所性分類的日誌文章將不要我們的查詢範圍之內)。

select p.title,c.category_name from post p inner join category c on p.cid = c.cid.這種情況和直接兩表硬關聯等價。

現在我們回過頭來看上面的問題。

對於第一種情況,如果我們所on 的條件寫在where 後面,將會出現什麼情況呢?

即:select p.title,c.category_name from post p left join category c where p.cid = c.cid對於第二種情況,我們同樣按照上面的書寫方式。

select count(p.id),c.category_name from post p rightjoin category c where p.pid = c.cid

如果執行上面的sql語句,就會發現,它們已經過濾掉了一些不滿足條件的記錄,可能在這裡,大家會產生疑問了,不是用了left和right嗎?它們可以保證左邊或者右邊的所有行被全部查詢出來,為什麼現在不管用了呢?對於出現這種的問題,呵呵!是不是覺得有些不可思議。

出現這種的問題,原因就在where和on這兩個關鍵字後面跟條件。

好了,現在我也不調大家味口了,給大家提示答案吧。

對於join參與的表的關聯操作,如果需要不滿足連線條件的行也在我們的查詢範圍內的話,我們就必需把連線條件放在on後面,而不能放在where後面,如果我們把連線條件放在了where後面,那麼所有的left,right,等這些操作將不起任何作用,對於這種情況,它的效果就完全等同於inner連線。對於那些不影響選擇行的條件,放在on或者where後面就可以。

記住:所有的連線條件都必需要放在on後面,不然前面的所有left,和right關聯將作為擺設,而不起任何作用。

#########################

wiki上關於各種型別join的乙個解釋

#########################

說白了就是當使用inner join的時候,過濾條件放在on和where後面沒什麼區別。

但是如果使用了left join,right join,full join的時候,表的連線條件需要放在on後面,因為這樣才能發揮出left,right,full的作用(把不符合條件的結果集也選中),一些無關緊要的過濾條件可以放在where後面。如果把連線條件也放到where後面,那麼你可能會發現left,right,full沒起什麼作用,那些你想刻意留下來的不符合連線條件的記錄依然被過濾掉了。

java中易錯的地方

1 instanceof 實現了某介面的類的物件也是該介面的例項 某類的物件也是該類超類的例項。2 native 修飾的方法沒有方法體,用乙個分號 代替大括號。3 main不是關鍵字。4 system.exit int value 也就是說,只要是int的,就能夠使jvm退出system.exit ...

Oracle外連線,左外連線,右外連線,內連線簡析

內連線即普通等值連線 select e.ename,e.job,e.sal,d.dname from emp e inner join dept d on e.deptno d.deptno where e.sal 2000 select e.ename e.job,e.sal d.dname fr...

oracle內連線 外連線

表testa,testb,testc,各有a,b兩列 a b001 10a002 20a a b 001 10b 003 30b a b001 10c004 40c 連線分為兩種 內連線與外連線。a 內連線 內連線,即最常見的等值連線,例 select fromtesta,testb wherete...