資源描述:
《SQL語句的集合運算用法.doc》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、SQL語句的MINUS,INTERSECT和UNIONALL?SQL語句中的三個關(guān)鍵字:MINUS(減去),INTERSECT(交集)和UNIONALL(并集);?關(guān)于集合的概念,中學(xué)都應(yīng)該學(xué)過,就不多說了.這三個關(guān)鍵字主要是對數(shù)據(jù)庫的查詢結(jié)果進(jìn)行操作,正如其中文含義一樣:兩個查詢,MINUS是從第一個查詢結(jié)果減去第二個查詢結(jié)果,如果有相交部分就減去相交部分;否則和第一個查詢結(jié)果沒有區(qū)別.?INTERSECT是兩個查詢結(jié)果的交集,UNIONALL是兩個查詢的并集;??雖然同樣的功能可以用簡單SQL語句來實現(xiàn),但是性能
2、差別非常大,有人做過實驗:made_order共23萬筆記錄,charge_detail共17萬筆記錄:???SELECTorder_idFROMmade_order MINUS SELECTorder_idFROMcharge_detail耗時:1.14sec SELECTa.order_idFROMmade_ordera WHEREa.order_id?NOTexists( ??SELECTorder_id ??FROMcharge_detail ??WHEREorder_id=a.order_
3、id )耗時:18.19sec性能相差15.956倍!因此在遇到這種問題的時候,還是用MINUS,INTERSECT和UNIONALL來解決問題,否則面對業(yè)務(wù)中隨處可見的上百萬數(shù)據(jù)量的查詢,數(shù)據(jù)庫服務(wù)器還不被咱玩的死翹翹?PS:應(yīng)用兩個集合的相減,相交和相加時,是有嚴(yán)格要求的:1.兩個集合的字段必須明確(用*就不行,報錯);2.字段類型和順序相同(名稱可以不同),如:集合1的字段1是NUMBER,字段2是VARCHAR,那么集合2的字段1必須也是NUMBER,字段2必須是VARCHAR;3.不能排序,如果要對結(jié)果排
4、序,可以在集合運算后,外面再套一個查詢,然后排序,如前面的例子可以改成:SELECT*FROM???(SELECTorder_idFROMmade_order MINUS SELECTorder_idFROMcharge_detail)ORDERBYORDER_IDASC