sql中的並 交 差

2021-09-08 09:10:29 字數 2150 閱讀 6499

⑸ 集合運算連線

有時候,使用者希望在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...