數據庫中的集合操作主要包括3個方面:
union的作用是為了合並兩個查詢結果,而且在合並的同時把相同的行去重。
例如:
如果我們需要顯示全部的並集,即不去重,可以使用union all,如下:
我們只需要使用union來連接兩個select-from-where語句塊即可。
union有如下幾個注意點:
1)union是可交換的操作,A union B的結果和B union A的結果相同;
2)理論上,select語句塊在union中出現的順序對於運行速度沒有影響,但是在實際應用中可能有影響。我們盡量把小表的查詢放在union的前面,因為優化器合並中間結果和除去重復行的方式不同。當然,不同的DBMS的影響可能不同;
3)intersect的優先級比union、except要高。其中,intersect是查找相同行,except是查找不同行。這也是和不同DBMS有關的;
4)在可以使用組合的select-from-where語句塊的情況下,盡量不要使用union;
5)當union和union all混合使用的時候,要使用括號來明確合並的順序,因為這涉及到到底哪些查詢結果需要合並;
6)即使沒有使用order by語句,union的結果也可能是排序的,而union all由於不去重,所以不需要排序。排序需要很多的額外時間,所以我們能使用union all就盡量不使用union;
intersect操作是取兩個查詢結果的相同行。
mySQL不支持intersect,我們可以使用exists謂詞來實現相同的功能。
A except B就是查找屬於A但是不屬於B的查找結果。
mySQL不支持except,我們可以使用not exists、not in等謂詞來實現相同的功能。