?Task04:集合運(yùn)算
https://github.com/datawhalechina/team-learning-sql
4.1 表的加減法
在標(biāo)準(zhǔn) SQL 中, 分別對(duì)檢索結(jié)果使用?UNION,?INTERSECT,?EXCEPT?來將檢索結(jié)果進(jìn)行并,交和差運(yùn)算, 像UNION,INTERSECT,?EXCEPT這種用來進(jìn)行集合運(yùn)算的運(yùn)算符稱為集合運(yùn)算符.在數(shù)據(jù)庫中, 所有的表--以及查詢結(jié)果--都可以視為集合, 因此也可以把表視為集合進(jìn)行上述集合運(yùn)算, 在很多時(shí)候, 這種抽象非常有助于對(duì)復(fù)雜查詢問題給出一個(gè)可行的思路.
SELECT product_id,product_name,product_type? ,sale_price,purchase_price
FROM PRODUCT
WHERE sale_price<800
UNION?
SELECTproduct_id,product_name,product_type? ,sale_price,purchase_price
FROM PRODUCT WHERE sale_price>1.5*purchase_price;
---以上為去重復(fù)的
包含重復(fù)行的集合運(yùn)算 UNION ALL
在1.1.1 中我們發(fā)現(xiàn), SQL 語句的 UNION 會(huì)對(duì)兩個(gè)查詢的結(jié)果集進(jìn)行合并和去重, 這種去重不僅會(huì)去掉兩個(gè)結(jié)果集相互重復(fù)的, 還會(huì)去掉一個(gè)結(jié)果集中的重復(fù)行. 但在實(shí)踐中有時(shí)候需要需要不去重的并集, 在 UNION 的結(jié)果中保留重復(fù)行的語法其實(shí)非常簡(jiǎn)單,只需要在 UNION 后面添加 ALL 關(guān)鍵字就可以了.
例如, 想要知道 Product 和 Product2 中所包含的商品種類及每種商品的數(shù)量, 第一步,就需要將兩個(gè)表的商品種類字段選出來, 然后使用 UNION ALL 進(jìn)行不去重地合并. 接下來再對(duì)兩個(gè)表的結(jié)果按 Product_type 字段分組計(jì)數(shù).
--保留重復(fù)行SELECTproduct_id, product_nameFROMProductUNION ALLSELECTproduct_id, product_nameFROMProduct2;
4.2 連結(jié)(JOIN)
前一節(jié)我們學(xué)習(xí)了 UNION和INTERSECT 等集合運(yùn)算, 這些集合運(yùn)算的特征就是以行方向?yàn)閱挝贿M(jìn)行操作. 通俗地說, 就是進(jìn)行這些集合運(yùn)算時(shí), 會(huì)導(dǎo)致記錄行數(shù)的增減. 使用 UNION 會(huì)增加記錄行數(shù),而使用 INTERSECT 或者 EXCEPT 會(huì)減少記錄行數(shù).
但這些運(yùn)算不能改變列的變化, 雖然使用函數(shù)或者 CASE表達(dá)式等列運(yùn)算, 可以增加列的數(shù)量, 但仍然只能從一張表中提供的基礎(chǔ)信息列中獲得一些"引申列", 本質(zhì)上并不能提供更多的信息. 如果想要從多個(gè)表獲取信息, 例如, 如果我們想要找出某個(gè)商店里的衣服類商品的名稱,數(shù)量及價(jià)格等信息, 則必須分別從 ShopProduct 表和 Product 表獲取信息蓖康。.
4.2.1 內(nèi)連結(jié)(INNER JOIN)
內(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é)的涵義, 目前暫時(shí)可以不必細(xì)究. 例如, 還是剛才那個(gè)問題:
要點(diǎn)一: 進(jìn)行連結(jié)時(shí)需要在 FROM 子句中使用多張表.
要點(diǎn)二:必須使用 ON 子句來指定連結(jié)條件.
要點(diǎn)三: SELECT 子句中的列最好按照 表名.列名 的格式來使用.
4.2.2 外連結(jié)(OUTER JOIN)
內(nèi)連結(jié)會(huì)丟棄兩張表中不滿足 ON 條件的行,和內(nèi)連結(jié)相對(duì)的就是外連結(jié). 外連結(jié)會(huì)根據(jù)外連結(jié)的種類有選擇地保留無法匹配到的行.
按照保留的行位于哪張表,外連結(jié)有三種形式: 左連結(jié), 右連結(jié)和全外連結(jié).
左連結(jié)會(huì)保存左表中無法按照 ON 子句匹配到的行, 此時(shí)對(duì)應(yīng)右表的行均為缺失值; 右連結(jié)則會(huì)保存右表中無法按照 ON 子句匹配到的行, 此時(shí)對(duì)應(yīng)左表的行均為缺失值; 而全外連結(jié)則會(huì)同時(shí)保存兩個(gè)表中無法按照 ON子句匹配到的行, 相應(yīng)的另一張表中的行用缺失值填充.