SQL語(yǔ)句中的三個(gè)關(guān)鍵字:MINUS(減去),INTERSECT(交集)和UNION ALL(并集);
關(guān)于集合的概念,中學(xué)都應(yīng)該學(xué)過(guò),就不多說(shuō)了.這三個(gè)關(guān)鍵字主要是對(duì)數(shù)據(jù)庫(kù)的查詢結(jié)果進(jìn)行操作,正如其中文含義一樣:兩個(gè)查詢,MINUS是從第一個(gè)查詢結(jié)果減去第二個(gè)查詢結(jié)果,如果有相交部分就減去相交部分;否則和第一個(gè)查詢結(jié)果沒(méi)有區(qū)別. INTERSECT是兩個(gè)查詢結(jié)果的交集,UNION ALL是兩個(gè)查詢的并集;
雖然同樣的功能可以用簡(jiǎn)單SQL語(yǔ)句來(lái)實(shí)現(xiàn),但是性能差別非常大,有人做過(guò)實(shí)驗(yàn):made_order共23萬(wàn)筆記錄,charge_detail共17萬(wàn)筆記錄:
SELECT order_id FROM made_order
MINUS
SELECT order_id FROM charge_detail
耗時(shí):1.14 sec
SELECT a.order_id FROM made_order a
WHERE a.order_id NOT exists (
SELECT order_id
FROM charge_detail
WHERE order_id = a.order_id
)
耗時(shí):18.19 sec
性能相差15.956倍!因此在遇到這種問(wèn)題的時(shí)候,還是用MINUS,INTERSECT和UNION ALL來(lái)解決問(wèn)題,否則面對(duì)業(yè)務(wù)中隨處可見(jiàn)的上百萬(wàn)數(shù)據(jù)量的查詢,數(shù)據(jù)庫(kù)服務(wù)器還不被咱玩的死翹翹?
PS:應(yīng)用兩個(gè)集合的相減,相交和相加時(shí),是有嚴(yán)格要求的:1.兩個(gè)集合的字段必須明確(用*就不行,報(bào)錯(cuò));2.字段類型和順序相同(名稱可以不同),如:集合1的字段1是NUMBER,字段2是VARCHAR,那么集合2的字段1必須也是NUMBER,字段2必須是VARCHAR;3.不能排序,如果要對(duì)結(jié)果排序,可以在集合運(yùn)算后,外面再套一個(gè)查詢,然后排序,如前面的例子可以改成:
SELECT * FROM
(SELECT order_id FROM made_order
MINUS
SELECT order_id FROM charge_detail)
ORDER BY ORDER_ID ASC
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/gan690416372/archive/2009/12/15/5012397.aspx