⑸ 集合運算連接
有時候,用戶希望在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中,必須使用其它方法實現,其中,嵌套查詢是十分有效的一種方法。