在SQL的子查詢中,如果子查詢返回多個行時,我們知道可以使用IN關鍵字來查找字段值屬某一組值的行,同樣,可以在查詢中使用EXISTS、 ALL、 ANY (或some)等運算符。
其中,in()後面的子查詢是返回結果集的,換句話說執行次序和exists()不一樣,子查詢先產生結果集,然後主查詢再去結果集裏去找符合要求的字段列表去。符合要求的輸出,反之則不輸出。如:有一張bbc表,需要找出各個地區人口最大的國家:
select name,region,population from bbc
where population in (select max(population) from bbc group by region ) order by population
exists()後面總是個跟一個子查詢(相關的或非相關的都行),EXISTS的左邊不用接列名,用來測試子查詢是否返回任何結果, 他只要子查詢返回了行,EXISTS的值就爲真,其運行方式是先運行主查詢一次 再去子查詢裏查詢與其對應的結果 如果是ture則輸出,反之則不輸出。如:有兩張表爲studentexam表和student表,需要查詢返回任何一次考試中分數低於40分的學生的studentid和姓名:
select studentid ,name from student s
where exists (select studentid from studentexam e where mark <40 and e.studentid=s.studentid)
但是,通常情況下采用exists要比in效率高。
而 ALL、 ANY (或some)需要配合關係運算符來使用,他們的左邊要聯接列名,右邊是子查詢。All對所有數據都滿足條件,整個條件才成立 ;.Any只要有任一條數據滿足條件,整個條件就成立;Some和Any一樣表示的限制相同。
一般情況下:
(1)=ANY 運算符與 IN 等效。如:在BBC表中,要查找出和india(印度)、iran(伊朗)所在地區的所有國家的所有信息:
select * from bbc
where region = any (select region from bbc where name='india'or name='iran')
select * from bbc
where regionin (select region from bbc where name='india'or name='iran')
(2)>any運算符與>min等效。
(3)<any運算符與<max等效。如在兩張表enrollment表和studentexam表中,要找出總分小於任何一次考試的分數的一半的學生的studentid和總分:
select studentid,grade from enrollment e
where grade< any(select mark/2 from studentexam s where s.studentid=e.studentid)
select studentid,grade from enrollment e
where grade< (select max(mark/2 )from studentexam s where s.studentid=e.studentid)
(4)>all運算符和>max等效。如BBC表中,要查找出gdp比任何歐洲國家都多的國家:
select name from bbc
where gdp>(selectmax(gdp) from bbc where region='Europe')
select name from bbc
where gdp>all (select
gdp from bbc where region='Europe')
(5)<all運算符和<min等效。