In和exists使用及效能分析(二):exists的使用
本節主要討論exists的使用。
二、exists的使用
2.1 exists的使用
2.1.1內、外兩表關聯欄位都非空
SQL> select * from tb1;
T1 NAME1
---------- ----------
1 1
2 2
SQL> select * from tb2;
T2 NAME2
---------- ----------
2 2
3 3
SQL> select count(1) from tb1 where exists (select 1 from tb2 where tb1.t1=tb2.t2);
COUNT(1)
----------
1
SQL> select count(1) from tb1 where not exists (select 1 from tb2 where tb1.t1=tb2.t2);
COUNT(1)
----------
1
結果與一般思維相符,沒什麼好說的。
2.1.2 當外表關聯欄位無空值、內表關聯列表有空值時
SQL> select * from tb1;
T1 NAME1
---------- ----------
1 1
2 2
SQL> select * from tb2;
T2 NAME2
---------- ----------
2
2
3 3
SQL> select count(1) from tb1 where exists (select 1 from tb2 where tb1.t1=tb2.t2);
--T1=2符合條件,返回結果與預期相符
COUNT(1)
----------
1
SQL> select count(1) from tb1 where not exists (select 1 from tb2 where tb1.t1=tb2.t2);
--T1=1符合條件,返回結果與預期相符
COUNT(1)
----------
1
2.1.3當外表關聯欄位有空值、內表關聯列表無空值時
SQL> select * from tb1;
T1 NAME1
---------- ----------
1 1
2 2
3
SQL> select * from tb2;
T2 NAME2
---------- ----------
2 2
SQL> select count(1) from tb1 where exists (select 1 from tb2 where tb1.t1=tb2.t2);
--符合常規邏輯
COUNT(1)
----------
1
SQL> select count(1) from tb1 where not exists (select 1 from tb2 where tb1.t1=tb2.t2);
--符合常規邏輯,注意與in的區別
COUNT(1)
----------
2
2.1.4當內、外表的關聯欄位都有空值時
SQL> select * from tb1;
T1 NAME1
---------- ----------
1 1
2 2
3
SQL> select * from tb2;
T2 NAME2
---------- ----------
2 2
3
SQL> select count(1) from tb1 where exists (select 1 from tb2 where tb1.t1=tb2.t2);
--只有T1=2的記錄符合條件,與常規思維相悖
COUNT(1)
----------
1
SQL> select count(1) from tb1 where not exists (select 1 from tb2 where tb1.t1=tb2.t2);
--T1=1和T1 為NULL的記錄都返回了,與常規思維相悖
COUNT(1)
----------
2
SQL> select count(1) from tb1 where exists (select 1 from tb2 where tb1.t1=tb2.t2 and t2 is not null);
--只返回T1=2的記錄符合常規邏輯
COUNT(1)
----------
1
SQL> select count(1) from tb1 where not exists (select 1 from tb2 where tb1.t1=tb2.t2 and t2 is not null);
-- T1=1和T1 為NULL的記錄都返回了,符合常規邏輯
COUNT(1)
----------
2
2.1.5外表無符合條件記錄
SQL> select * from tb1;
T1 NAME1
---------- ----------
SQL> select * from tb2;
T2 NAME2
---------- ----------
2
2
3 3
SQL> select count(1) from tb1 where exists (select 1 from tb2 where tb1.t1=tb2.t2);
COUNT(1)
----------
0
SQL> select count(1) from tb1 where not exists (select 1 from tb2 where tb1.t1=tb2.t2);
COUNT(1)
----------
0
這個很好理解,源表無記錄,無論條件真假,都不會有記錄返回的。
2.1.6內表無符合條件記錄
SQL> select * from tb1;
T1 NAME1
---------- ----------
1 1
2 2
3
SQL> select * from tb2;
T2 NAME2
---------- ----------
SQL> select count(1) from tb1 where exists (select 1 from tb2 where tb1.t1=tb2.t2);
--符合常規邏輯
COUNT(1)
----------
0
SQL> select count(1) from tb1 where not exists (select 1 from tb2 where tb1.t1=tb2.t2);
--符合常規邏輯
COUNT(1)
----------
3
2.2 exists使用總結
1. exists的原理
select * from tb1 where exists ( select null from tb2 where col1 = col2 )
相當於:
for t1 in ( select * from tb1 )
loop
if ( exists ( select 1 from tb2 where t2 = tb1.col1 )
then
OUTPUT THE RECORD
end if
end loop
其中:exists ( select null from tb2 where t2 = tb1.col1 )返回是一個布林值,not exists只是對exists子句返回對布林值取非,這與in和not in是有本質區別的(not in是對in表示式取非,轉換成另一種等價表示式)
2. exists運算中,當t2列表中有空值時,得到結果與把空值從列表中去掉是一樣當,也就是說,可以把col2列表的空值忽略。
3. 只需記住null=null和null<>null在oracle都不成立,即可理解exists/not exists運算不符合常規思維的地方。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63764/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- In和exists使用及效能分析(三):in和exists的效能分析
- In和exists使用及效能分析(一):in的使用
- [精選] SQL中的IN與NOT IN、EXISTS與NOT EXISTS的區別及效能分析SQL
- exists和not exists及in和not in的用法與區別
- Oralce 使用SQL中的exists 和not exists 用法詳解SQL
- 對線面試官:SQL中的IN與NOT IN、EXISTS與NOT EXISTS的區別及效能分析面試SQL
- sql中in和exists的原理及使用場景。SQL
- [Oracle] exists 和 not existsOracle
- SQL中EXISTS的使用SQL
- in/exists和not in/not exists執行效率
- Oracle中exists和in的效能差異Oracle
- oracle中關於in和exists,not in 和 not existsOracle
- oracle中的exists和not exists和in用法詳解Oracle
- mysql 關於exists 和in分析MySql
- oracle中的exists 和not exists 用法詳解Oracle
- SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差別SQL
- 對IN & EXISTS NOT IN & NOT EXISTS的優化優化
- EXISTS、IN、NOT EXISTS、NOT IN的區別(ZT)
- 使用表連線替代exists
- Oracle 中不使用NOT IN 和 NOT EXISTS的另一種方法Oracle
- EXISTS、IN、NOT EXISTS、NOT IN用法區別
- in 和 exists區別
- in,exists和not exists ,not in與null的一些關係記載Null
- Exists和IN的原理解析
- mybatis exists 中使用代替in關鍵字MyBatis
- Oracle學習系列—資料庫優化—In和Exists的使用Oracle資料庫優化
- sql:delete if exists還是drop if exists?SQLdelete
- exists和連線方式
- oracle中in和exists的區別Oracle
- 【SQL】existsSQL
- 【原始碼】Redis exists命令bug分析原始碼Redis
- [Oracle] minus 和 not exists比較Oracle
- ORACLE 中IN和EXISTS比較Oracle
- 蘊含式(包含EXISTS語句的分析)
- IN&EXISTS與NOT IN&NOT EXISTS 的優化原則的討論優化
- 使用exists(Semi-Join)優化distinct語句優化
- SQL語句中exists和in的區別SQL
- (轉)ORACLE 中IN和EXISTS的區別Oracle