SQL中 子查詢中運算符之間的關係、


       在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等效。



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