17.SQL之內/外聯結詳解

一、聯結概述

  • 聯結(JOIN)就是將其他表中的列添加過來,進行“添加列”的集合運算。UNION是以行(縱向)爲單位進行操作,而聯結則是以列(橫向)爲單位進行的

  • 聯結大體上分爲內聯結和外聯結兩種。

聯結圖示:
在這裏插入圖片描述
準備聯結示例所需的兩張表(product表和shop表),如下:
在這裏插入圖片描述
在這裏插入圖片描述
對這兩張表包含的列進行整理後的結果如下表所示:

Product(產品) Shop(商店)
product_id 存在 存在
product_name 存在
product_price 存在
shop_id 存在
shop_name 存在
product_nums 存在

如上表所示,兩張表中的列可以分爲如下兩類:

  • A.兩張表中都包含的列  → 商品編號
  • B.只存在於一張表內的列 → 商品編號之外的列

所謂聯結運算,一言以蔽之,就是“以A中的列作爲橋樑,將 B中滿足同樣條件的列彙集到同一結果之中”。

二、內聯結

  1. 內聯結也稱爲等值聯結,返回兩張表都滿足條件的部分
-- 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

  1. 內聯結和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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章