⑸ 集合運算連線
有時候,使用者希望在sql查詢中利用關係代數中的集合運算(並、交、差)來組合關係,sql為此提供了相應的運算子:union、intersect、except(oracle的minus?),分別對應於集合運算的∪、∩、-。它們用於兩個查詢之間,對每個查詢都要用圓括號括起來。對於不同的dbms,支援的集合運算有所不同,如access,sqlserver都不支援集合的交運算和差運算。
【例3-40】 查詢選修了180101號或180102號課程或二者都選修了的學生學號、課程號和成績。
(select 學號, 課程號, 成績
from 學習
where 課程號='180101')
union
(select 學號, 課程號, 成績
from 學習
where 課程號='180102')
輸出結果:
學號
課程號
成績59
567065…
與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中,必須使用其它方法實現,其中,巢狀查詢是十分有效的一種方法。
sql並 交 差的處理
並集 union eg 求學過002或者003課程同學的學號 select s from sc where c 002 union select s from sc where c 003 等同於select s from sc where c 002 or c 003 交集 intersect e...
用SQL表達並交差操作
注 所有的下劃線 斜體語句都是非必須語句 sql語句 select from where 並運算 union 交運算 intersect 差運算 except all select from where 文字描述 假設第乙個子查詢 s f w 得到的元組編號是 第二個子查詢 s f w 得到的元組編...
集合的並交差
include using namespace std include typedef struct lnode 定義結構體型別指標 linklist void in put linklist l 定義輸入集合函式 void out put linklist l 定義輸出集合函式 cout n vo...