集合操作主要包括並操作UNION、交操作INTERSECT、差操作EXCEPT。
注意,參加集合操作的各查詢結果的列數必須相同;對應的數據類型也必須相同。
本示例中的數據表有student,sc,course三個,數據表的具體內容請看:Mysql數據庫中的EXISTS和NOT EXISTS
例子1.1
題目:查詢計算機科學系的學生及年齡不大於19歲的學生。
SQL語句:
[sql] view plaincopy
查詢結果:
本查詢實際上是求計算機系的所有學生與年齡不大於19歲的學生的並集。
與它等效的SQL語句是:
[sql] view plaincopy
注意:雖然這個兩個SQL語句是等效的,但是本質上是不一樣的,第一個SQL語句是分別進行兩次SELECT然後將結果取並集;第二個SQL語句是直接進行了一次SELECT語句查詢。
MySql語句並不支持INTERSECT,所以只能使用其替代語句
例子2.1
題目:查詢計算機科學系中年齡不大於19歲的學生。
對應的SQL語句應該是:
[sql] view plaincopy
替代的SQL語句:
[sql] view plaincopy
查詢結果:
例子2.2
題目:查詢即選修了課程1又選修了課程2的學生。(就是查詢選修課程1的學生集合與選修課程2的學生集合的交集)
對應的SQL語句應該是:
[sql] view plaincopy
替代的SQL語句為:
(使用IN)
[sql] view plaincopy
或者為:
(使用EXISTS)
[sql] view plaincopy
查詢結果為:
或者為:
(使用JOIN ON)
[sql] view plaincopy
很不幸,MySql也不支持EXCEPT操作,只能使用替代的語句。
例子3.1
查詢計算機科學系的學生與年齡不大於19歲的學生的差集。
對應的SQL語句為:
[sql] view plaincopy
也就是查詢計算機科學系中年齡大於19歲的學生。
替換語句為:
(直接使用WHERE,不得不說這麼做很簡單,但是意思上不是很好理解)
[sql] view plaincopy
查詢結果為:
或者替換語句為:
(使用NOT IN)
[sql] view plaincopy
查詢結果為:
或者使用替換語句為:
(使用NOT EXISTS)
[sql] view plaincopy
查詢結果為:
ORDER BY子句只能用於對最終查詢結果排序,不能對中間結果排序。
任何情況下,ORDER BY子句只能出現在最後;對集合操作結果排序時,ORDER BY子句中用數字指定排序屬性。
下面是一種錯誤的寫法:
[sql] view plaincopy
正確的應該是:
[sql] view plaincopy
輸出結果:
如果寫成:
[sql] view plaincopy
輸出結果為: