集合操作主要包括並操作UNION、交操作INTERSECT、差操作EXCEPT。
注意,參加集合操作的各查詢結果的列數必須相同;對應的數據類型也必須相同。
本示例中的數據表有student,sc,course三個,數據表的具體內容請看:Mysql數據庫中的EXISTS和NOT EXISTS
UNION示例:
例子1.1
題目:查詢計算機科學系的學生及年齡不大於19歲的學生。
SQL語句:
[sql] view plaincopy
- SELECT * FROM Student WHERE Sdept='CS' UNION
- SELECT * FROM Student WHERE Sage<=19
查詢結果:

本查詢實際上是求計算機系的所有學生與年齡不大於19歲的學生的並集。
與它等效的SQL語句是:
[sql] view plaincopy
- SELECT * FROM Student WHERE Sdept='CS' OR Sage<=19
注意:雖然這個兩個SQL語句是等效的,但是本質上是不一樣的,第一個SQL語句是分別進行兩次SELECT然後將結果取並集;第二個SQL語句是直接進行了一次SELECT語句查詢。
INTERSECT示例:
MySql語句並不支持INTERSECT,所以只能使用其替代語句
例子2.1
題目:查詢計算機科學系中年齡不大於19歲的學生。
對應的SQL語句應該是:
[sql] view plaincopy
- SELECT * FROM Student
- WHERE Sdept='CS'
- INTERSECT
- SELECT * FROM Student
- WHERE Sage<=19;
替代的SQL語句:
[sql] view plaincopy
- SELECT *
- FROM student
- WHERE Sdept = 'CS'
- AND Sage <=19
查詢結果:

例子2.2
題目:查詢即選修了課程1又選修了課程2的學生。(就是查詢選修課程1的學生集合與選修課程2的學生集合的交集)
對應的SQL語句應該是:
[sql] view plaincopy
- SELECT Sno FROM SC
- WHERE Cno='1'
- INTERSECT
- SELECT Sno FROM SC
- WHERE Cno='2';
替代的SQL語句為:
(使用IN)
[sql] view plaincopy
- SELECT Sno
- FROM SC
- WHERE Cno = '1'
- AND Sno
- IN (
- SELECT Sno
- FROM SC
- WHERE Cno = '2'
- )
或者為:
(使用EXISTS)
[sql] view plaincopy
- SELECT Sno
- FROM SC SCX
- WHERE Cno = '1'
- AND EXISTS (
- SELECT Sno
- FROM SC SCY
- WHERE Cno = '2'
- AND SCX.Sno = SCY.Sno
- )
查詢結果為:

或者為:
(使用JOIN ON)
[sql] view plaincopy
- SELECT *
- FROM SC SCX
- JOIN SC SCY ON ( SCX.Cno = '1'
- AND SCY.Cno = '2'
- AND SCX.Sno = SCY.Sno )

EXCEPT操作:
很不幸,MySql也不支持EXCEPT操作,只能使用替代的語句。
例子3.1
查詢計算機科學系的學生與年齡不大於19歲的學生的差集。
對應的SQL語句為:
[sql] view plaincopy
- SELECT * FROM Student WHERE Sdept='CS'
- EXCEPT
- SELECT * FROM Student WHERE Sage<=19;
也就是查詢計算機科學系中年齡大於19歲的學生。
替換語句為:
(直接使用WHERE,不得不說這麼做很簡單,但是意思上不是很好理解)
[sql] view plaincopy
- SELECT *
- FROM Student
- WHERE Sdept = 'CS'
- AND Sage >19
查詢結果為:

或者替換語句為:
(使用NOT IN)
[sql] view plaincopy
- SELECT *
- FROM Student
- WHERE Sdept = 'CS'
- AND Sno NOT
- IN (
- SELECT Sno
- FROM Student
- WHERE Sage <=19
- )
查詢結果為:

或者使用替換語句為:
(使用NOT EXISTS)
[sql] view plaincopy
- SELECT *
- FROM Student SX
- WHERE Sdept = 'CS'
- AND NOT
- EXISTS (
- SELECT *
- FROM Student SY
- WHERE SY.Sage <=19
- AND SX.Sno = SY.Sno
- )
查詢結果為:

對集合操作結果的排序
ORDER BY子句只能用於對最終查詢結果排序,不能對中間結果排序。
任何情況下,ORDER BY子句只能出現在最後;對集合操作結果排序時,ORDER BY子句中用數字指定排序屬性。
下面是一種錯誤的寫法:
[sql] view plaincopy
- SELECT * FROM Student
- WHERE Sdept='CS'
- ORDER BY Sno
- UNION
- SELECT * FROM Student
- WHERE Sage<=19
- ORDER BY Sno;
正確的應該是:
[sql] view plaincopy
- SELECT * FROM Student
- WHERE Sdept='CS'
- UNION
- SELECT * FROM Student
- WHERE Sage<=19
- ORDER BY 2;
輸出結果:

如果寫成:
[sql] view plaincopy
- SELECT * FROM Student
- WHERE Sdept='CS'
- UNION
- SELECT * FROM Student
- WHERE Sage<=19
- ORDER BY 1;
輸出結果為:
