《用實例學習SQL》專題篇:帶有(not)exists 謂詞的子查詢(1)

相關表

作爲一個存在謂詞,exists在條件篩選結果中返回的結果只有True和False。

exists的用法

select * 
from table1
where exists
		(select * 
		from table2);
#當子查詢的結果不是空時,exists返回True,否則返回False

not exists的用法

select *
from table1
where exists
		(select *
		from table
		where table.colunm > 10);  (注:table2表中屬性列column的值都小於10)
# 從註釋可以看出,子查詢的結果肯定是空的
# not exists的返回結果與exists正好相反,也就是說,當子查詢的結果是空的時候not exists返回的結果是True,不是空的時候返回的是False

好,那麼,exists怎麼在執行它的篩選作用呢?
先用文字表述,然後再用例子說明:

從父查詢中取出一個元組,該元組的某個屬性值,作爲參考值放在子查詢中,如果子查詢表中有一個元組的對應屬性值與該參考值相等,且該元組符合子查詢的條件,那麼,該父查詢的元組就是結果元組之一,否則就不是

例子:

select *
from table1
where exists
		(select * 
		from table2
		where table2.Sno = table1.Sno and table2.Cno = '1');
# 下面結合例子來說明

上例中:先從table1表中取出一個元組①,然後將該元組①的Sno屬性值(parameter)傳進子查詢中,在子查詢table2表中找到Sno值與parameter值相同的元組②(可能不止一個),如果這些元組②中有屬性值Cno等於‘1’的,那麼子查詢的結果就不是空,返回True,那麼元組①就作爲一個結果元組。
重複進行上述過程,直到比較了父查詢中的所有元組。

下篇我會講到當SQL中沒有全稱量詞時怎麼通過存在量詞轉化從而解決全稱量詞的問題:
如:查詢選修了全部課程的學生姓名
轉化爲:不存在(沒有)一門課程是它不選修的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章