在oracle中,「not exists」用來判斷子句是否回傳結果集,若子句回傳結果集為false,若子句沒有傳回結果集則為true,語法為「select * from daul where not exists(子句查詢條件)」。
本教學操作環境:Windows10系統、Oracle 11g版、Dell G3電腦。
exists : 強調的是是否回傳結果集,不要求知道回傳什麼, 例如:
select name from student where sex = 'm' and mark exists(select 1 from grade where ...)
只要exists引導的子句有結果集返回,那麼exists這個條件就算成立了,大家注意返回的字段始終為1,如果改成“select 2 from grade where ...”,那麼返回的字段就是2,這個數字沒有意義。所以exists子句不在乎回傳什麼,而是在乎是不是有結果集回傳。
而 exists 與 in 最大的差異在於 in引導的子句只能傳回一個字段,例如:
select name from student where sex = 'm' and mark in (select 1,2,3 from grade where ...)
,in子句回傳了三個字段,這是不正確的,exists子句是允許的,但in只允許有一個字段返回,在1,2,3中隨便去了兩個字段即可。
而not exists 和not in 分別是exists 和 in 的 對立面。
exists (sql 回傳結果集為真)
not exists (sql 不回傳結果集為真)
#以下詳細描述not exists的過程:
#如下:
#表A
ID NAME
1 A1
#2 A2
#3 A3
#表B
ID AID NAME
##1 1 #3 2 B3表A與表B是1對多的關係 A.ID => B.AIDSELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID=B.AID)執行結果為##1
#2 A2
原因可以依照下列分析
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1) --->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据 SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2) --->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据 SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3) --->SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据
NOT EXISTS 就是反過來
SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)
執行結果為
#3 A3
#EXISTS = IN,意思相同不過語法上有點區別,好像使用IN效率要差點,應該是不會執行索引的原因
SELECT ID,NAME FROM A WHERE ID IN (SELECT AID FROM B)
NOT EXISTS = NOT IN ,意思相同不過語法上有點點差異
SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B)
有時候我們會遇到要選出某一列不重複,某一列作為選擇條件,其他列正常輸出的情況.
推薦教學:《
Oracle影片教學》
以上是oracle中not exists的用法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!