MySQL必知必會 —— 第十五章 聯結表

1. 聯結

SQL最強大的功能之一就是能在數據檢索查詢的執行中聯結(join)表。 聯結是利用SQL的SELECT能執行的最重要的操作,很好地理解聯結及其語法是學習SQL的一個極爲重要的組成部分。

1.1 關係表

關係表的設計要保證把信息分解成多個表,一類數據一個表。各表通過某些常用的值(即關係設計中的關係(relational))互相關聯。
外鍵(foreign key) 外鍵爲某個表中的一列,它包含另一個表的主鍵值,定義了兩個表之間的關係。
可伸縮性(scale) 能夠適應不斷增加的工作量而不失敗。設計良好的數據庫或應用程序稱之爲可伸縮性好(scale well)。

1.2 爲什麼使用聯結

分解數據爲多個表能更有效地存儲,更方便地處理,並且具有更大的可伸縮性。但這些好處是有代價的。
如果數據存儲在多個表中,怎樣用單條SELECT語句檢索出數據?
答案是使用聯結。簡單地說,聯結是一種機制,用來在一條SELECT語句中關聯表,因此稱之爲聯結。使用特殊的語法,可以聯結多個表返回一組輸出,聯結在運行時關聯表中正確的行。
在這裏插入圖片描述

2.創建聯結

聯結的創建非常簡單,規定要聯結的所有表以及它們如何關聯即可。請看下面的例子:

select vend_name,prod_name,prod_price
from vendors,products
where vendors.vend_id = products.vend_id
order by vend_name,prod_name;

在這裏插入圖片描述

2.1 where子句的重要性

利用WHERE子句建立聯結關係似乎有點奇怪,但實際上,有一個很充分的理由。請記住,在一條SELECT語句中聯結幾個表時,相應的關係是在運行中構造的。在數據庫表的定義中不存在能指示MySQL如何對錶進行聯結的東西。你必須自己做這件事情。在聯結兩個表時,你實際上做的是將第一個表中的每一行與第二個表中的每一行配對。WHERE子句作爲過濾條件,它只包含那些匹配給定條件(這裏是聯結條件)的行。 沒有WHERE子句,第一個表中的每個行將與第二個表中的每個行配對,而不管它們邏輯上是否可以配在一起。

2.2 內部聯結

目前爲止所用的聯結稱爲等值聯結(equijoin),它基於兩個表之間的相等測試。這種聯結也稱爲內部聯結。其實,對於這種聯結可以使用稍微不同的語法來明確指定聯結的類型。下面的SELECT語句返回與前面例子完全相同的數據:

select vend_name,prod_name,prod_price
from vendors inner join products
on vendors.vend_id = products.vend_id;

此語句中的SELECT與前面的SELECT語句相同,但FROM子句不同。這裏, 兩個表之間的關係是FROM子句的組成部分,以INNER JOIN指定。在使用這種語法時,聯結條件用特定的ON子句而不是WHERE子句給出。傳遞給ON的實際條件與傳遞給WHERE的相同。

2.3 聯結多個表

使用子查詢執行復雜的SELECT語句返回訂購產品TNT2的客戶列表:

select cust_name,cust_contact from customers
where cust_id in (select cust_id from orders
	where order_num in ( select order_num from orderitems
		where prod_id = 'TNT2'));

下面是使用聯結的相同查詢:

select cust_name,cust_contact
from customers,orders,orderitems
where customers.cust_id = orders.cust_id
and orderitems.order_num = orders.ordes.order_num
and prod_id = 'TNT2";

在這裏插入圖片描述
這個查詢中返回數據需要使用3個表。但這裏我們沒有在嵌套子查詢中使用它們,而是使用了兩個聯結。這裏有3個WHERE子句條件。前兩個關聯聯結中的表,後一個過濾產品TNT2的數據。

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