限制條件
- (1)所有查詢中的列數和列的順序必須相同。
- (2)比較的兩個查詢結果集中的列數據類型可以不同但必須兼容。
- (3)比較的兩個查詢結果集中不能包含不可比較的數據類型(xml、text、ntext、image 或非二進制 CLR 用戶定義類型)的列。
- (4)返回的結果集的列名與操作數左側的查詢返回的列名相同。ORDER BY 子句中的列名或別名必須引用左側查詢返回的列名。
- (5)不能與 COMPUTE 和 COMPUTE BY 子句一起使用。
- (6)通過比較行來確定非重複值時,兩個 NULL 值被視爲相等。(EXCEPT 或 INTERSECT 返回的結果集中的任何列的爲空性與操作數左側的查詢返回的對應列的爲空性相同。)
UNION 並集
查詢選修了180101號或180102號課程或二者都選修了的學生學號、課程號和成績。
(SELECT 學號, 課程號, 成績
FROM 學習
WHERE 課程號='180101')
UNION
(SELECT 學號, 課程號, 成績
FROM 學習
WHERE 課程號='180102')
與SELECT子句不同,UNION運算自動去除重複。因此,在本例中,若只輸出學生的學號,則相同的學號只出現一次。如果想保留所有的重複,則必須用UNION ALL代替UNION,且查詢結果中出現的重複元組數等於兩個集合中出現的重複元組數的和。
INTERSECT 交集
intersect運算 返回查詢結果中相同的部分既他們的交集
查詢同時選修了180101和180102號課程的學生學號、課程號和成績。
(SELECT 學號, 課程號, 成績
FROM 學習
WHERE 課程號='180101')
INTERSECT
(SELECT 學號, 課程號, 成績
FROM 學習
WHERE 課程號='180102')
INTERSECT運算自動去除重複,如果想保留所有的重複,必須用INTERSECT ALL代替INTERSECT,結果中出現的重複元組數等於兩集合出現的重複元組數裏較少的那個。
minus-(oracle) 差集
返回在第一個查詢結果中與第二個查詢結果不相同的那部分行記錄,
即兩個結果的差集,請注意,在 MINUS 指令下,不同的值只會被列出一次。
語法
[SQL 語句 1]
MINUS
[SQL 語句 2];
select * from abc2
minus
select * from abc ;
Store_Information 表格
Store_Name | Sales | Txn_Date |
Los Angeles | 1500 | 05-Jan-1999 |
San Diego | 250 | 07-Jan-1999 |
Los Angeles | 300 | 08-Jan-1999 |
Boston | 700 | 08-Jan-1999 |
Internet Sales 表格
Txn_Date | Sales |
07-Jan-1999 | 250 |
10-Jan-1999 | 535 |
11-Jan-1999 | 320 |
12-Jan-1999 | 750 |
而我們要知道有哪幾天是有店面營業額而沒有網絡營業額的。要達到這個目的,我們用以下的 SQL 語句:
MINUS
SELECT Txn_Date FROM Internet_Sales;
結果:
Txn_Date |
Jan-05-1999 |
Jan-08-1999 |
'Jan-05-1999', 'Jan-07-1999', 和 'Jan-08-1999' 是 "SELECT Txn_Date FROM Store_Information" 所產生的結果。在這裏面,'Jan-07-1999' 是存在於 "SELECT Txn_Date FROM Internet_Sales" 所產生的結果中。因此 'Jan-07-1999' 並不在最後的結果中。
EXCEPT (mysql不支持)
EXCEPT 返回兩個結果集的差(即從左查詢中返回右查詢沒有找到的所有非重複值)。
查詢選修了180101號課程的學生中沒有選修180102號課程的學生學號、課程號和成績。
(SELECT 學號, 課程號, 成績
FROM 學習
WHERE 課程號='180101')
EXCEPT
(SELECT 學號, 課程號, 成績
FROM 學習
WHERE 課程號='180102')
EXCEPT運算自動去除重複,如果想保留所有的重複,必須用EXCEPT ALL代替EXCEPT,結果中出現的重複元組數等於兩集合出現的重複元組數之差(前提是差是正值)。
在不支持INTERSECT和EXCEPT運算的DBMS中,必須使用其它方法實現,其中,嵌套查詢是十分有效的一種方法。