資源描述:
《集合運算SQL語句詳解》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、集合運算SQL語句詳解 我們一起總認為新的就是好的,而其實久了我們會發(fā)現(xiàn),基礎(chǔ)比什么都重要。而你做到了精通SQL查詢以及SQL性能優(yōu)化了么?沒有的話還是老老實實的先來學(xué)習(xí)基礎(chǔ)吧。而下面小編就為大家分享下SQL語句的集合運算詳解。 概述 本篇主要是對集合運算中并集、交集、差集運算基礎(chǔ)的總結(jié)?! 〖线\算包含四種: 1.并集運算(兩種) 2.交集運算 3.差集運算 下面是集合運算的思維導(dǎo)圖: 為什么使用集合運算 1.在集合運算中比聯(lián)接查詢和EXISTS/NOTEXISTS更方便?! ≡陂喿x下面的章節(jié)時
2、,我們可以先把環(huán)境準備好,以下的SQL腳本可以幫助大家創(chuàng)建數(shù)據(jù)庫,創(chuàng)建表,插入數(shù)據(jù)。 一、集合運算 1.集合運算 (1)對輸入的兩個集合或多集進行的運算?! ?2)多集:由兩個輸入的查詢生成的可能包含重復(fù)記錄的中間結(jié)果集?! ?3)T-SQL支持三種集合運算:并集(UNION)、交集(INTERSECT)、差集(EXCEPT) 2.語法 集合運算的基本格式: 輸入的查詢1 集合運算符> 輸入的查詢2 3.要求 (1)輸入的查詢不能包含ORDERBY字句; (2)可以為整個集合運算結(jié)果選擇性
3、地增加一個ORDERBY字句; (3)每個單獨的查詢可以包含所有邏輯查詢處理階段(處理控制排列順序的ORDERBY字句); (4)兩個查詢必須包含相同的列數(shù); (5)相應(yīng)列必須具有兼容的數(shù)據(jù)類型。兼容個的數(shù)據(jù)類型:優(yōu)先級較低的數(shù)據(jù)類型必須能隱式地轉(zhuǎn)換為較高級的數(shù)據(jù)類型。比如輸入的查詢1的第一列為int類型,輸入的查詢2的第一列為float類型,則較低的數(shù)據(jù)類型int類型可以隱式地轉(zhuǎn)換為較高級float類型。如果輸入的查詢1的第一列為char類型,輸入的查詢2的第一列為datetime類型,則會提示轉(zhuǎn)換失?。簭?/p>
4、字符串轉(zhuǎn)換日期和/或時間時,轉(zhuǎn)換失敗; (6)集合運算結(jié)果中列名由輸入的查詢1決定,如果要為結(jié)果分配結(jié)果列,應(yīng)該在輸入的查詢1中分配相應(yīng)的別名; (7)集合運算時,對行進行進行比較時,集合運算認為兩個NULL相等; (8)UNION支持DISTINCT和ALL。不能顯示指定DISTINCT字句,如果不指定ALL,則默認使用DISTINCT; (9)INTERSET和EXCEPT默認使用DISTINCT,不支持ALL。 二、UNION(并集)集合運算 1.并集的文氏圖 并集:兩個集合的并集是一個包含集合
5、A和B中所有元素的集合。 圖中陰影區(qū)域代表集合A與集合B的并集 ALL集合運算 (1)假設(shè)Query1返回m行,Query2返回n行,則Query1UNIONALLQuery2返回(m+n)行; (2)UNIONALL不會刪除重復(fù)行,所以它的結(jié)果就是多集,而不是真正的集合; (3)相同的行在結(jié)果中可能出現(xiàn)多次?! ISTINCT集合運算 (1)假設(shè)Query1返回m行,Query2返回n行,Query1和Query2有相同的h行,則Query1UNIONQuery2返回(m+n-h)行; (2)UN
6、ION會刪除重復(fù)行,所以它的結(jié)果就是集合; (3)相同的行在結(jié)果中只出現(xiàn)一次?! ?4)不能顯示指定DISTINCT字句,如果不指定ALL,則默認使用DISTINCT?! ?5)當(dāng)Query1與Query2比較某行記錄是否相等時,會認為取值為NULL的列是相等的列。 三、INTERSECT(交集)集合運算 1.交集的文氏圖 交集:兩個集合(記為集合A和集合B)的交集是由既屬于A,也屬于B的所有元素組成的集合?! D中陰影區(qū)域代表集合A與集合B的交集 DISTINCT集合運算 (1)假設(shè)Query1返回m
7、行,Query2返回n行,Query1和Query2有相同的h行,則Query1INTERSECTQuery2返回h行; (2)INTERSECT集合運算在邏輯上首先刪除兩個輸入多集中的重復(fù)行(把多集變?yōu)榧?,然后返回只在兩個集合中都出現(xiàn)的行; (3)INTERSECT會刪除重復(fù)行,所以它的結(jié)果就是集合; (4)相同的行在結(jié)果中只出現(xiàn)一次?! ?5)不能顯示指定DISTINCT字句,如果不指定ALL,則默認使用DISTINCT?! ?6)當(dāng)Query1與Query2比較某行記錄是否相等時,會認為取值為NUL
8、L的列是相等的列?! ?7)用內(nèi)聯(lián)接或EXISTS謂詞可以代替INTERSECT集合運算,但是必須對NULL進行處理,否則這兩種方法對NULL值進行比較時,比較結(jié)果都是UNKNOWN,這樣的行會被過濾掉?! LL集合運算 (1)ANSISQL支持帶有ALL選項的INTERSECT集合運算,但SQLServerXX現(xiàn)在還沒有實現(xiàn)這種運算。后面會提供一種用于