一、聯結概述
-
聯結(JOIN)就是將其他表中的列添加過來,進行“添加列”的集合運算。UNION是以行(縱向)爲單位進行操作,而聯結則是以列(橫向)爲單位進行的
-
聯結大體上分爲內聯結和外聯結兩種。
聯結圖示:
準備聯結示例所需的兩張表(product表和shop表),如下:
對這兩張表包含的列進行整理後的結果如下表所示:
Product(產品) | Shop(商店) | |
---|---|---|
product_id | 存在 | 存在 |
product_name | 存在 | |
product_price | 存在 | |
shop_id | 存在 | |
shop_name | 存在 | |
product_nums | 存在 |
如上表所示,兩張表中的列可以分爲如下兩類:
- A.兩張表中都包含的列 → 商品編號
- B.只存在於一張表內的列 → 商品編號之外的列
所謂聯結運算,一言以蔽之,就是“以A中的列作爲橋樑,將 B中滿足同樣條件的列彙集到同一結果之中”。
二、內聯結
- 內聯結也稱爲等值聯結,返回兩張表都滿足條件的部分
-- inner join可以簡化,直接寫成join
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name,P.sale_price
FROM Shop AS SP INNER JOIN Product AS P
ON SP.product_id = P.product_id;
注意:
-
爲表取別名不是必須的,但是爲了可讀性更好,建議這麼做
-
ON 之後指定兩張表聯結所使用的列(聯結鍵),需要指定多個鍵時,同樣可以使用 AND、OR
- 內聯結和WHERE等子句結合使用
使用聯結運算除了表與表之間的橋樑條件需要放在on後,其他的條件可以使用WHERE、GROUP BY、HAVING、ORDER BY 等字句來添加
-- 查詢內聯結結果中shop_id爲00A的信息
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name,P.sale_price
FROM Shop AS SP INNER JOIN Product AS P
ON SP.product_id = P.product_id
WHERE SP.shop_id = "00A";
3. 內聯結的另一種寫法(過時語法)
-- 內聯結另一種寫法
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name,P.sale_price
FROM Shop AS SP , Product AS P
WHERE SP.product_id = P.product_id;
這種寫法與使用inner join… on…寫法得到的結果一模一樣,但是這是一種未來會被淘汰的寫法,即過時的語法,其除了未來可能被淘汰,還有以下幾個缺點:
- 由於聯結條件都寫在 WHERE 子句之中,因此無法在短時間內分辨出哪部分是聯結條件,哪部分是用來選取記錄的限制條件
- 我們不知道這樣的語法到底還能使用多久。每個 DBMS 的開發者都會考慮放棄過時的語法,轉而支持新的語法。雖然並不是馬上就不能使用了,但那一天總會到來的
三、外聯結
外聯結也是通過 ON 子句的聯結鍵將兩張表進行聯結,但是不同的是,外聯結分主表和從表,在內聯結裏,是將兩表可以聯結的數據列出來,但是外聯結會把主表中的數據全部列出來,如果從表中沒有對應的數據,就設置爲null。
簡而言之,就是外聯結可以查出null的數據,而內聯結不行
/*
將內聯結的inner join
改爲right join就是右聯結,
改爲left join就是左聯結
*/
SELECT SP.shop_id, SP.shop_name, SP.product_id, P.product_name,P.sale_price
FROM Shop AS SP RIGHT JOIN Product AS P
ON SP.product_id = P.product_id
這裏使用right join即右聯結,所以Product爲主表,由查詢結果可知,它不僅將兩表通過on條件聯結的部分查詢出來(和二表做內聯結一模一樣),它還將主表(Product)中未與從表(Shop)關聯的部分單獨列了兩行出來,從表中數據賦NULL