集合運算注意事項
- 需要保留重復項目的集合,用ALL
- 集合運算有優(yōu)先級,intersect 比 union 和 except 優(yōu)先級更高
- 不同DBS對集合運算支持程度不同
-
除法運算沒有標準定義
- 和union/差intersect/積cross join被加入集合標準,但沒有除法運算
用法1:檢查集合相等性初級篇
適用情況:遷移數(shù)據(jù)庫或者需要備份數(shù)據(jù)和最新數(shù)據(jù)時,需要檢查兩表是否行數(shù)/列數(shù)一致且內容相同
案例:名字不同但內容相同的兩張表行數(shù)
知識點:S UNION S = S,兩表相等,union的結果為本身,兩表不相同,union結果取兩者并集

表tbl_a

表tbl_b

使用union求并集
用法2:檢查集合相等性進階篇
適用情況:需要比較兩表是否相等,同時包含行數(shù)/列數(shù)/內容的比較
案例:名字不同的兩張表是否完全相同
知識點:A UNION B = A INTERSECT B = A=B ,兩表相等,union的結果和intersect結果完全相同,否則兩結果不相同
缺陷:不同DBS支持情況不同,如mysql不支持intersect和except
數(shù)據(jù)源同用法1

使用并集-交集=空集判斷兩者相等
用法3:用差集實現(xiàn)關系除法
適用情況:從表2中找出包含表1所有情況的
案例:找出具備所有特定技能的員工
知識點:A except B = A中包含而B不包含/B中包含A不包含的項
缺陷:mysql不支持intersect和except

表skills

表empskils

except排除相同項
用法4:尋找相等的子集
適用情況:從總體中找出相同的子集
案例:找出所有相同的子集
知識點:不等條件關聯(lián)組合

表supparts

多條件+自連接得到相同子集
用法5:刪除重復行
適用情況:delete刪除重復數(shù)據(jù)
案例:刪除重復出現(xiàn)的行
知識點:子查詢/except/not in子句

方法1:刪除各項最大id以外的重復項

方法2:not in 刪除各項最大id以外的項

方法3:id減去各項最大id,得到重復項id