7集合運算
7-1表的加減法
表的加法--UNION
首先我們新建一個表Product2:
使用UNION函數(shù)進行“product表+product2表”的運算:
商品編號為“0001”~“0003”的 3 條記錄在兩個表中都存在,因此大家可能會認為結(jié)果中會出現(xiàn)重復的記錄,但是 UNION 等集合運算符通常都會除去重復的記錄。
集合運算的注意事項
注意事項1 ——作為運算對象的記錄的列數(shù)必須相同
-- 列數(shù)不一致時會發(fā)生錯誤
SELECT product_id, product_name
FROM Product
UNION
SELECT product_id, product_name, sale_price
FROM Product2;
注意事項2 ——作為運算對象的記錄中列的類型必須一致
SELECT product_id, sale_price
FROM Product
UNION
SELECT product_id, regist_date
FROM Produt2;
注意事項3 —— 可以使用任何SELECT語句菜枷,但ORDER BY子句只能在最后使用一次
包含重復行的集合運算--ALL選項
在 UNION 的結(jié)果中保留重復行饿肺,只需要在 UNION 后面添加 ALL 關(guān)鍵字就可以了:
選取表中的公共部分--INTERSECT
INTERSECT只選取兩表的重合部分
記錄的減法--EXCEPT
減法運算EXCEPT把表二與表一重合部分刪去
被減數(shù)和減數(shù)位置不同占键,得到的結(jié)果也不同
7-3聯(lián)結(jié)(以列為單位對表進行聯(lián)結(jié))
什么是聯(lián)結(jié)
UNION 和 INTERSECT 等集合運算,這些集合運算的特征就是以行方向為單位進行操作尉辑。而JOIN(聯(lián)結(jié))函數(shù)則是對列進行運算情萤,即將其他表中的列添加進來鸭蛙。
內(nèi)聯(lián)結(jié)--INNER JOIN
我們還是對兩張表Product,ShopProduct進行操作筋岛,表結(jié)構(gòu)分別是:
兩張表中的列可以分成以下兩類:
1.兩張表中都包含的列 → 商品編號
2.只存在于一張表內(nèi)的列 → 商品編號之外的列
東京店銷售商品編號為0001娶视、0002和0003的商品的名稱 (product_name)和銷售單價(sale_price)在 ShopProduct 表中并不存在,這些信息都保存在 Product 表中睁宰。
使用INNER JOIN函數(shù)來得到這些商品的對應信息:
內(nèi)聯(lián)結(jié)需要注意的三點:
1.FROM子句后有兩張表
2.ON子句是用來指定聯(lián)結(jié)條件的肪获,一般跟“=”,當兩個表中有相同記錄時進行聯(lián)結(jié)
3.SELECT子句
內(nèi)聯(lián)結(jié)和WHERE子句結(jié)合使用
不想查詢所有店柒傻,只查東京的孝赫,可以在ON子句之后加WHERE子句:
外聯(lián)結(jié)--OUTER JOIN
外聯(lián)結(jié)也是使用ON進行聯(lián)結(jié),但是結(jié)果稍有不同:
外聯(lián)結(jié)的要點1--選取出單張表中的所有信息
內(nèi)聯(lián)結(jié)只能選取出同時存在于兩張表中的數(shù)據(jù)诅愚。相反寒锚,對于外聯(lián)結(jié)來說,只要數(shù)據(jù)存在于某一張表當中违孝,就能夠讀取出來刹前。
外聯(lián)結(jié)的要點2--主表的設定
SELECT SP.product_id, SP.shop_name, SP.product_id, P.product_name, P.sale_price
FROM Product AS P LEFT OUTER JOIN ShopProduct AS SP
ON SP.product_id = P.product_id;
上面兩個結(jié)果是一樣的,指定主表的關(guān)鍵字是 LEFT 和 RIGHT雌桑。顧 名思義喇喉,使用 LEFT 時 FROM 子句中寫在左側(cè)的表是主表,使用 RIGHT 時右側(cè)的表是主表校坑。
外聯(lián)結(jié)的要點3--3張以上的表聯(lián)結(jié)
首先創(chuàng)建下面這個新表:
聯(lián)結(jié)三個表的方法:
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 = P.product_id
WHERE IP.inventory_id = 'P001';