天池筆記tast4
本筆記為阿里云天池龍珠計劃SQL訓(xùn)練營的學習內(nèi)容,鏈接為:https://tianchi.aliyun.com/specials/promotion/aicampsql1.集合運算在標
本筆記為阿里云天池龍珠計劃SQL訓(xùn)練營的學習內(nèi)容,鏈接為:https://tianchi.aliyun.com/specials/promotion/aicampsql
1.集合運算
在標準 SQL 中, 分別對檢索結(jié)果使用 UNION, INTERSECT, EXCEPT 來將檢索結(jié)果進行并,交和差運算, 像UNION,INTERSECT, EXCEPT這種用來進行集合運算的運算符稱為集合運算符。
2.表的加法–UNION
UNION 等集合運算符通常都會除去重復(fù)的記錄. 對于同一張表, 實際上也是可以進行求并集的.
使用 UNION 對兩個結(jié)果集取并集, 和把兩個子查詢的篩選條件用 OR 謂詞連接, 會得到相同的結(jié)果, 但倘若要將兩個不同的表中的結(jié)果合并在一起, 就不得不使用 UNION 了.而且, 即便是對于同一張表, 有時也會出于查詢效率方面的因素來使用 UNION.
在 UNION 的結(jié)果中保留重復(fù)行的語法其實非常簡單,只需要在 UNION 后面添加 ALL 關(guān)鍵字就可以了.
隱式類型轉(zhuǎn)換
2.1通常來說, 我們會把類型完全一致, 并且代表相同屬性的列使用 UNION 合并到一起顯示, 但有時候, 即使數(shù)據(jù)類型不完全相同, 也會通過隱式類型轉(zhuǎn)換來將兩個類型不同的列放在一列里顯示,
3.差集,補集與表的減法
求集合差集的減法運算和實數(shù)的減法運算有些不同, 當使用一個集合A減去另一個集合B的時候,對于只存在于集合B而不存在于集合A的元素, 采取直接忽略的策略,因此集合A和B做減法只是將集合A中也同時屬于集合B的元素減掉。
4.對稱差
兩個集合A,B的對稱差是指那些僅屬于A或僅屬于B的元素構(gòu)成的集合. 對稱差也是個非常基礎(chǔ)的運算, 例如, 兩個集合的交就可以看作是兩個集合的并去掉兩個集合的對稱差
5.內(nèi)連結(jié)
內(nèi)連結(jié)的語法格式是:
FROM <tb_1> INNER JOIN <tb_2> ON <condition(s)>
其中 INNER 關(guān)鍵詞表示使用了內(nèi)連結(jié), 至于內(nèi)連結(jié)的涵義, 目前暫時可以不必細究.
關(guān)于內(nèi)連結(jié),需要注意以下三點:
要點一: 進行連結(jié)時需要在 FROM 子句中使用多張表.
要點二:必須使用 ON 子句來指定連結(jié)條件.
要點三: SELECT 子句中的列最好按照 表名.列名 的格式來使用.
6.結(jié)合 WHERE 子句使用內(nèi)連結(jié)
如果需要在使用內(nèi)連結(jié)的時候同時使用 WHERE 子句對檢索結(jié)果進行篩選, 則需要把 WHERE 子句寫在 ON 子句的后邊.
7.結(jié)合 GROUP BY 子句使用內(nèi)連結(jié)
結(jié)合 GROUP BY 子句使用內(nèi)連結(jié), 需要根據(jù)分組列位于哪個表區(qū)別對待.
但是如果分組列和被聚合的列不在同一張表, 且二者都未被用于連結(jié)兩張表, 則只能先連結(jié), 再聚合.
8.自連結(jié)
之前的內(nèi)連結(jié), 連結(jié)的都是不一樣的兩個表. 但實際上一張表也可以與自身作連結(jié), 這種連接稱之為自連結(jié).
自然連結(jié)
自然連結(jié)并不是區(qū)別于內(nèi)連結(jié)和外連結(jié)的第三種連結(jié), 它其實是內(nèi)連結(jié)的一種特例–當兩個表進行自然連結(jié)時, 會按照兩個表中都包含的列名來進行等值內(nèi)連結(jié), 此時無需使用 ON 來指定連接條件.
9.外連結(jié)
內(nèi)連結(jié)會丟棄兩張表中不滿足 ON 條件的行,和內(nèi)連結(jié)相對的就是外連結(jié). 外連結(jié)會根據(jù)外連結(jié)的種類有選擇地保留無法匹配到的行.
按照保留的行位于哪張表,外連結(jié)有三種形式: 左連結(jié), 右連結(jié)和全外連結(jié).
三種外連結(jié)的對應(yīng)語法分別為:
-- 左連結(jié)
FROM <tb_1> LEFT OUTER JOIN <tb_2> ON <condition(s)>
-- 右連結(jié)
FROM <tb_1> RIGHT OUTER JOIN <tb_2> ON <condition(s)>
-- 全外連結(jié)
FROM <tb_1> FULL OUTER JOIN <tb_2> ON <condition(s)>
10.多表連結(jié)
通常連結(jié)只涉及 2 張表,但有時也會出現(xiàn)必須同時連結(jié) 3 張以上的表的情況, 原則上連結(jié)表的數(shù)量并沒有限制。
11.ON 子句進階–非等值連結(jié)
在剛開始介紹連結(jié)的時候, 書上提到過, 除了使用相等判斷的等值連結(jié), 也可以使用比較運算符來進行連接. 實際上, 包括比較運算符(<,<=,>,>=, BETWEEN)和謂詞運算(LIKE, IN, NOT 等等)在內(nèi)的所有的邏輯運算都可以放在 ON 子句內(nèi)作為連結(jié)條件.
12.交叉連結(jié)—— 笛卡爾積
之前的無論是外連結(jié)內(nèi)連結(jié), 一個共同的必備條件就是連結(jié)條件–ON 子句, 用來指定連結(jié)的條件. 如果你試過不使用這個連結(jié)條件的連結(jié)查詢, 你可能已經(jīng)發(fā)現(xiàn), 結(jié)果會有很多行. 在連結(jié)去掉 ON 子句, 就是所謂的笛卡爾積, 數(shù)據(jù)庫表(或者子查詢)的并,交和差都是在縱向上對表進行擴張或篩選限制等運算的, 這要求表的列數(shù)及對應(yīng)位置的列的數(shù)據(jù)類型"相容", 因此這些運算并不會增加新的列, 而交叉連接(笛卡爾積)則是在橫向上對表進行擴張, 即增加新的列, 這一點和連結(jié)的功能是一致的. 但因為沒有了ON子句的限制, 會對左表和右表的每一行進行組合, 這經(jīng)常會導(dǎo)致很多無意義的行出現(xiàn)在檢索結(jié)果中.









