MySQL必知必會——第15章 聯結表 讀書筆記

1 what is 聯結?
SQL最強大的功能之一就是能在數據檢索查詢的執行中聯結(join)表。
先行知識:關係表:保證把信息分解成多個表,一類數據一個表,各表通過某些常用的值互相關聯。
舉例:使用兩個表分別存儲供應商信息和產品信息。
why:爲什麼要使用兩個表而不是一個表來存儲供應商信息和產品信息?
①因爲同一個供應商生產的每個產品的供應商信息都是相同的, 對每個產品重複此信息既浪費時間又浪費存儲空間。
②如果供應商信息改變,只需要改動一次即可。
③如果有重複數據(即每種產品都存儲供應商信息),很難保證每次輸入該數據的方式相同,不一致的數據在報表中很難利用。
關鍵:相同數據出現多次絕不是一件好事。
因此,使用vendors供應商表存儲供應商信息,所有供應商佔一行,每個供應商具有唯一的標識(即主鍵)。使用products表存儲產品信息,除了存儲供應商ID外不存儲其他供應商信息,vendors的主鍵也是products表的外鍵,它將vendors表和products表關聯,利用供應商ID能從vendors表中找出相應供應商的詳細信息。
總結:關係數據可以有效地存儲和方便地處理。因此,關係數據庫的可伸縮性(能夠適應不斷增加的工作量而不失敗)比非關係數據庫要好。
2 why use 聯結?
分解數據爲多個表能更有效地存儲,更方便地處理,並且具有更大的可伸縮性,但這些好處是有代價的,如果數據存儲在多個表中,怎樣用單條select語句檢索出數據?答案是使用聯結。使用特殊的語法,可以聯結多個表返回一組輸出,聯結在運行時聯結表中正確的行。
聯結不是物理實體,聯結在實際的數據庫表中不存在。
聯結根據需要建立,存在於查詢的執行當中。
維護引用完整性:使用關係表時,僅在關係列中插入合法的數據非常重要。(例如上述例子中,如果products表中插入了擁有非法供應商ID(沒有在vendors表中出現))的供應商生產的產品,則這些產品是不可訪問的,因爲它們沒有關聯到某個供應商。爲了防止這種情況發生,可指示MySQL只允許在products表的供應商ID列中出現合法值,這就是維護引用完整性,通過在表的定義中指定主鍵和外鍵來實現的。
3 how to create and use聯結?
舉例:前提是一個供應商表,一個產品表
①vendors表:
在這裏插入圖片描述
②products表:
在這裏插入圖片描述
目的:列舉供應商名和其對應的產品名

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

利用where子句建立聯結關係。
在一條select語句中聯結幾個表,相應的關係是在運行中構造的。在數據庫表的定義中不存在能指示MySQL如何對錶進行聯結的東西。
在聯結表時,你實際上做的是將第一個表的每一行和第二個表的每一行配對。where子句作爲過濾條件,它只包含那些匹配給定條件(這裏是聯結條件)的行。沒有where子句,第一個表中的每個行將與第二個表中的每個行配對,而不管它們邏輯上是否可以配在一起。如果沒有聯結條件的表關係返回的結果爲笛卡爾積。檢索出的行的數目將是第一個表中的行數乘以第二表中的行數。因此,應該保證所有聯結都有where子句,否則MySQL將返回比想要的數據多得多的數據

4 內部聯結
內部聯結的兩種等價形式:
形式一:
from 表1,表2 where 聯結條件
形式二:
from 表1 inner join 表2 on 聯結條件
首選形式二,明確使用聯結語法能夠確保不會忘記聯結條件, 有時候這樣做也能影響性能。
5 聯結多個表
SQL對一條select語句可以聯結的表的數目沒有限制。創建聯結的基本規則也相同。首先列出所有表,然後定義表之間的關係。

select prod_name,vend_name,prod_price,quantity 
from products,vendors,orderitems
where products.vend_id = vendors.vend_id
AND orderitems.prod_id=products.prod_id
AND order_num=20005;

上述例子顯示編號爲20005的訂單中的物品。訂單物品存儲在orderitems表中。每個產品按照其產品ID存儲,它引用products表中的產品。這些產品通過供應商ID聯結到vendors表中相應的供應商,供應商ID存儲在每個產品的記錄中。
不要聯結不必要的表。聯結的表越多,性能下降越厲害。

發佈了95 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章