sql中的並、交、差


⑸ 集合運算連接

有時候,用戶希望在SQL查詢中利用關系代數中的集合運算(並、交、差)來組合關系,SQL為此提供了相應的運算符:UNION、INTERSECT、EXCEPT(oracle的minus?),分別對應於集合運算的∪、∩、-。它們用於兩個查詢之間,對每個查詢都要用圓括號括起來。對於不同的DBMS,支持的集合運算有所不同,如ACCESS,SQLSERVER都不支持集合的交運算和差運算。

 

【例3-40】 查詢選修了180101號或180102號課程或二者都選修了的學生學號、課程號和成績。

(SELECT  學號, 課程號, 成績

FROM   學習

WHERE   課程號='180101')

  UNION

(SELECT 學號, 課程號, 成績

FROM 學習

WHERE    課程號='180102')

輸出結果:

學號

課程號

成績

090101

180101

59

090101

180102

56

090102

180101

70

090102

180102

65

 

 

與SELECT子句不同,UNION運算自動去除重復。因此,在本例中,若只輸出學生的學號,則相同的學號只出現一次。如果想保留所有的重復,則必須用UNION ALL代替UNION,且查詢結果中出現的重復元組數等於兩個集合中出現的重復元組數的和。

【例3-41】查詢同時選修了180101和180102號課程的學生學號、課程號和成績。

(SELECT  學號, 課程號, 成績

FROM   學習

WHERE 課程號='180101')

INTERSECT

(SELECT 學號, 課程號, 成績

FROM 學習

WHERE 課程號='180102')

INTERSECT運算自動去除重復,如果想保留所有的重復,必須用INTERSECT ALL代替INTERSECT,結果中出現的重復元組數等於兩集合出現的重復元組數里較少的那個。

或者多次的子查詢

補充:

1、intersect運算
返回查詢結果中相同的部分既他們的交集

SQL> select * from abc
  2  intersect
  3  select * from abc2 ;

2、minus運算
返回在第一個查詢結果中與第二個查詢結果不相同的那部分行記錄,
即兩個結果的差集

SQL> select * from abc2
  2  minus
  3  select * from abc ;

3-42】查詢選修了180101號課程的學生中沒有選修180102號課程的學生學號、課程號和成績。

(SELECT  學號, 課程號, 成績

FROM   學習

WHERE  課程號='180101')

EXCEPT

(SELECT 學號, 課程號, 成績

FROM 學習

WHERE   課程號='180102')

EXCEPT運算自動去除重復,如果想保留所有的重復,必須用EXCEPT ALL代替EXCEPT,結果中出現的重復元組數等於兩集合出現的重復元組數之差(前提是差是正值)。

在不支持INTERSECT和EXCEPT運算的DBMS中,必須使用其它方法實現,其中,嵌套查詢是十分有效的一種方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM