SQL:七 集合運算
阿新 • • 發佈:2020-10-10
表的加減法
什麼是集合運算
- 集合在數學領域表示“(各種各樣的)事物的總和”,在資料庫領域表示記錄的集合
- 表、檢視和查詢的執行結果都是記錄的集合
- 集合運算,就是對滿足同一規則的記錄進行的加減等四則運算
- 進行集合運算的運算子稱為集合運算子
表的加法
- UNION(並集)
- 集合運算子會除去重複的記錄
-
-- 使用UNION對錶進行加法運算 SELECT product_id, product_name FROM Product UNION SELECT product_id, product_name FROM Product2;
集合運算的注意事項
- ①作為運算物件的記錄的列數必須相同
- ②作為運算物件的記錄中列的型別必須一致
- ③可以使用任何SELECT語句,但ORDER BY子句只能在最後使用一次
-
-- 列數不一致時會發生錯誤 SELECT product_id, product_name FROM Product UNION SELECT product_id, product_name, sale_price FROM Product2; -- 資料型別不一致時會發生錯誤 SELECT product_id, sale_price FROM Product UNION SELECT product_id, regist_date FROM
包含重複行的集合運算
- ALL選項
- 在集合運算子中使用ALL選項,可以保留重複行
-
-- 保留重複行 SELECT product_id, product_name
選取表中公共部分
- INTERSECT(交集)
- INTERSECT 應用於兩張表,選取出它們當中的公共記錄
-
-- 使用INTERSECT選取出表中公共部分 SELECT product_id, product_name FROM Product INTERSECT SELECT product_id, product_name FROM Product2 ORDER BY product_id;
記錄的減法
- EXCEPT(差 集)
- 減法運算中減數和被減數的位置不同,所得到的結果也不相同
-
-- 使用EXCEPT對記錄進行減法運算 SELECT product_id, product_name FROM Product EXCEPT SELECT product_id, product_name FROM Product2 ORDER BY product_id;
聯結(以列為單位對錶進行聯結)
什麼是聯結
- 聯結(JOIN)運算
- 將其他表中的 列新增過來,進行“新增列”的運算
- 實際上,期望得到的資料往往會分散在不同的表之中。使用聯結就可以從多張表(3 張以上的表也沒關係) 中選取資料了
內聯結
-
INNER JOIN
-
所謂聯結運算,以A中的列作為橋樑,將 B中滿 足同樣條件的列彙集到同一結果之中
-
內聯結要點
-
①FROM子句
- FROM ShopProduct AS SP INNER JOIN Product AS P
- 進行聯結時需要在FROM子句中使用多張表
-
②ON子句
- ON SP.product_id = P.product_id
- 在 ON 之後指定兩張表聯結所使用的列(聯結鍵)
- 進行內聯結時必須使用ON子句,並且要書寫在FROM和WHERE之間
-
③SELECT子句
- SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price
- 使用聯結時SELECT子句中的列需要按照“<表的別名>.<列名>”的格式進行書寫
-
-
內聯結和WHERE子句結合使用
- 聯結運算將滿足相同規則的表聯結起來時,WHERE、 GROUP BY、HAVING、ORDER BY 等工具都可以正常使用
- 將聯結之後的結果想象為新創建出來的一張表,對這張表使用 WHERE 子句等工具
- 這張“表”只在 SELECT 語句執行期間存在,SELECT 語 句執行之後就會消失。如果希望繼續使用這張“表”,將它建立成檢視
-- 將兩張表進行內聯結 SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price FROM ShopProduct AS SP INNER JOIN Product AS P ON SP.product_id = P.product_id; -- 內聯結和WHERE子句結合使用 SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price FROM ShopProduct AS SP INNER JOIN Product AS P ON SP.product_id = P.product_id WHERE SP.shop_id = '000A';
外聯結
-
OUTER JOIN
-
外聯結要點
-
①選取出單張表中全部的資訊
-
②每張表都是主表嗎
-
把哪張表作為主表,最終的結果中會包含主表內所有的資料
-
指定主表的關鍵字是 LEFT 和 RIGHT
- 使用LEFT 時FROM 子句中寫在左側的表是主表,使用RIGHT 時右側的表是主表
-
-
-
3張以上的表的聯結
-
交叉聯結
-
CROSS JOIN(笛卡 兒積)
- 對滿足相同規則的表進行交叉聯結的集合運算子
-
進行交叉聯結時無法使用內聯結和外聯結中所使用的ON 子句, 這是因為交叉聯結是對兩張表中的全部記錄進行交叉組合,因此結果中 的記錄數通常是兩張表中行數的乘積
-
-
聯結的特定語法和過時語法
- 對於聯結的過時語法和特定語法,雖然不建議使用,但還是希望能夠讀懂。
-- 將兩張表進行外聯結 SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price FROM ShopProduct AS SP RIGHT OUTER JOIN Product AS P ON SP.product_id = P.product_id; -- 對3張表進行內聯結 SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price, IP.inventory_quantity FROM ShopProduct AS SP INNER JOIN Product AS P ON SP.product_id = P.product_id INNER JOIN InventoryProduct AS IP ON SP.product_id = IP.product_id WHERE IP.inventory_id = 'P001'; -- 將兩張表進行交叉聯結 SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name FROM ShopProduct AS SP CROSS JOIN Product AS P; -- 使用過時語法的內聯結 SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price FROM ShopProduct SP, Product P WHERE SP.product_id = P.product_id AND SP.shop_id = '000A';