oracle 對謂詞and t1.job=』clerk』(on 後面的),where t1.job=』clerk』的解析是不一樣的。
一、使用where t1.job=』clerk』:
1 - access(「t1」.」deptno」=」t2」.」deptno」(+))
2 - filter(「t1」.」job」=』clerk』)
oracle 先根據」t1」.」job」=』clerk』對t1表進行過濾,然後與t2表進行左外連線
二、oracle解析的謂詞and t1.job=』clerk』(on 後面的)為:
1 - access(「t1」.」deptno」=」t2」.」deptno」(+) and 「t1」.」job」=case when
(「t2」.」deptno」(+) is not null) then 『clerk』 else 『clerk』 end )
代表什麼意思呢?
oracle 對t1,t2進行全表掃瞄,之後進行左外連線(也可能是在掃瞄過程中進行連線),而and t1.job=』clerk』對連線之後的記錄總數沒有影響,只是對不符合and t1.job=』clerk』的記錄中t2表每列置空,即:
select tab1.,tab2. from tab1 left join tab2 on (tab1.size1= tab2.size1 and tab1.id=2);
相當於
select tab1.,tab2. from tab1 left join tab2 on (tab1.size1= tab2.size1);然後不符合tab1.id=2的記錄,tab2表的列置空,如下:
sql> select tab1.,tab2. from tab1 left join tab2 on (tab1.size1= tab2.size1 and tab1.id=2);
id size1 size1 name
———- ———- ———- ——————–
1 10
2 20 20 bbb
2 20 20 ccc
3 30
三、當on中對左表的非連線字段限制時 與 對右表的非連線字段限制時 是兩種不同的情況,請注意。
當on中對右表的非連線字段限制時(on (tab1.size1= tab2.size1 and tab2.name=』aaa』)) 相當於右表根據非連線字段限制獲取結果,然後左表再與它關聯。
select tab1.,tab2. from tab1 left join tab2 on (tab1.size1= tab2.size1 and tab2.name=』aaa』);
相當於
select tab1.,t. from tab1 left join (select * from tab2 where tab2.name=』aaa』) t on (tab1.size1= t.size1);
Oracle條件查詢
條件查詢 關係運算子 邏輯運算子 and or not 其他運算子 like 模糊查詢 in set 在某個區間內 between and.在某個區間內 is not 判斷為空 is not null 判斷不為空 查詢每月能得到獎金的員工資訊 select from emp select from ...
Oracle 條件查詢 模糊查詢
示例 1 查詢出工資高於3000的員工資訊 select froms emp e where e.salary 3000 2 查詢出名為carmen的員工所有資訊 select from s emp e wheree.first name carmen oracle sql 關鍵字,表名,列名等不區...
Oracle基礎條件查詢
當我們要組合三個或者三個以上條件的時候,就需要用到小括號 來表示應該如何進行條件運算。例如,編寫乙個複雜的條件 工資在5000以下或者10000以上,並且是job id為sa man 按多個條件查詢employees 如果不加括號,條件運算按照not and or的優先順序進行 not優先順序最高,...