SQL 基礎知識梳理(七)- 集合運算

目錄
- 表的加減法
- 聯結(以列為單位)
一、表的加減法
1.集合:記錄的集合(表、視圖和查詢的執行結果)。
2.UNION(並集):表的加法
-- DDL:創建表 CREATE TABLE Shohin2 (shohin_id CHAR(4) NOT NULL, shohin_mei VARCHAR(100) NOT NULL, shohin_bunrui VARCHAR(32) NOT NULL, hanbai_tanka INTEGER , shiire_tanka INTEGER , torokubi DATE , PRIMARY KEY (shohin_id)); -- DML:插入數據 INSERT INTO Shohin2 VALUES ('0001', 'T恤' ,'衣服', 1000, 500, '2009-09-20'); INSERT INTO Shohin2 VALUES ('0002', '打孔器', '辦公用品', 500, 320, '2009-09-11'); INSERT INTO Shohin2 VALUES ('0003', '運動T恤', '衣服', 4000, 2800, NULL); INSERT INTO Shohin2 VALUES ('0009', '手套', '衣服', 800, 500, NULL); INSERT INTO Shohin2 VALUES ('0010', '水壺', '廚房用具', 2000, 1700, '2009-09-20'); CREATE TABLE Shohin (shohin_id CHAR(4) NOT NULL, shohin_mei VARCHAR(100) NOT NULL, shohin_bunrui VARCHAR(32) NOT NULL, hanbai_tanka INTEGER , shiire_tanka INTEGER , torokubi DATE , PRIMARY KEY (shohin_id)); INSERT INTO Shohin VALUES ('0001', 'T恤' ,'衣服', 1000, 500, '2009-09-20'); INSERT INTO Shohin VALUES ('0002', '打孔器', '辦公用品', 500, 320, '2009-09-11'); INSERT INTO Shohin VALUES ('0003', '運動T恤', '衣服', 4000, 2800, NULL); INSERT INTO Shohin VALUES ('0004', '菜刀', '廚房用具', 3000, 2800, '2009-09-20'); INSERT INTO Shohin VALUES ('0005', '高壓鍋', '廚房用具', 6800, 5000, '2009-01-15'); INSERT INTO Shohin VALUES ('0006', '叉子', '廚房用具', 500, NULL, '2009-09-20'); INSERT INTO Shohin VALUES ('0007', '擦菜板', '廚房用具', 880, 790, '2008-04-28'); INSERT INTO Shohin VALUES ('0008', '圓珠筆', '辦公用品', 100, NULL, '2009-11-11');

圖
並集圖,會移除重復的記錄。

3.注意事項:
(1)作為運算對象的記錄的列數必須相同

圖:列數不匹配
(2)作為運算對象的記錄中列的類型必須一致

圖:類型不一致
【備注】可以使用類型轉換函數 CAST
4.ALL 選項 - 包含重復行的集合運算

圖:保留重復行
5.INTERSECT(交集) - 選取表中公共的部分

類似該並集圖:

6.EXCEPT(差集) - 記錄的減法

需要注意,被減數和減數的位置調換,結果是不同的:

二、聯結(以列為單位)
1.上一節集合運算的特征是以“行方向”為單位操作,在進行集合運算時會導致記錄行數的增減,不過隊列不會影響,因為它們的列數要一致。
2.聯結(JOIN)運算:“添加列”的運算,從其它表的列添加過來。
3.INNER JOIN - 內聯結
聯結運算:以 A 表中的列作為橋梁,將 B 表中滿足同樣條件的列匯集到同一結果中。

要點:
①FROM 子句:FROM dbo.TenpoShohin AS TS INNER JOIN dbo.Shohin AS S
這里使用 INNER JOIN 將兩張表關聯起來,TS 和 S 分別是兩張表的別名,可以增強表的可讀性。
②ON 子句:ON S.shohin_id = TS.shohin_id
ON 后面記載的是聯結條件,聯結兩張表所使用的的列,可以稱為聯結鍵。
這是一個比較直觀的例子,兩個小鎮,中間隔了一條河,通過 ON 子句作為他們兩者之間的橋梁。

③SELECT 子句:SELECT TS.tenpo_id ,TS.tenpo_mei ,S.shohin_mei ,S.hanbai_tanka
采用“<表的別名>.<列名>”格式來顯示,這樣就可以清楚的知道該列來自哪張表。
4.OUTER JOIN - 外聯結

(1)要點:
①選取出單張表中全部的信息
與之前的內聯表相比,15 行比之前 13行多了 2 行。因為多出的 2 條記錄在 TenpoShohin 表並不存在。內聯結只能選取出同時存在於兩張表中的數據,而外聯結,只要數據存在某一張表中,就能夠讀取出來。也就是說,希望生成固定行數的記錄,就需要使用外聯結。
②主表的選擇
最終的結果只會包含主表內所有的數據。指定主表的關鍵字是 LEFT 和 RIGHT,使用 LEFT 時左側的表為主表,使用 RIGHT 時右側的表為主表(如上圖的 Shohin 表)。
【備注】外聯結使用 LEFT 和 RIGHT 來指定主表。
5.多張表的聯結
-- DDL:創建表 CREATE TABLE ZaikoShohin ( souko_id CHAR(4) NOT NULL, shohin_id CHAR(4) NOT NULL, zaiko_suryo INTEGER NOT NULL, PRIMARY KEY (souko_id, shohin_id)); -- DML:插入數據 INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001', '0001', 0); INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001', '0002', 120); INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001', '0003', 200); INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001', '0004', 3); INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001', '0005', 0); INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001', '0006', 99); INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001', '0007', 999); INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S001', '0008', 200); INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002', '0001', 10); INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002', '0002', 25); INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002', '0003', 34); INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002', '0004', 19); INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002', '0005', 99); INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002', '0006', 0); INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002', '0007', 0); INSERT INTO ZaikoShohin (souko_id, shohin_id, zaiko_suryo) VALUES ('S002', '0008', 18);

3 表聯結就是多 1 行 JOIN 子句而已,多表聯結就多幾行 JOIN 字句唄。
6.CROSS JOIN(笛卡兒積)- 交叉聯結
這種聯結在實際業務中很少使用。

TenpoShohin 表 13 條記錄, Shohin 表 8 條記錄,13*8=104 條記錄。
備注
這里采用 MS SQL Server 進行驗證,不保證所有的 DBMS 執行結果正確。
《SQL 基礎知識梳理》系列
《SQL 基礎知識梳理(六)- 函數、謂詞、CASE 表達式》
【博主】反骨仔
【原文】http://www.cnblogs.com/liqingwen/p/6575668.html
【參考】《SQL ゼロからはじめるデータベース操作》
