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