mysql必知必會--聯 結 表

聯結

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

外鍵(foreign key) 外鍵爲某個表中的一列,它包含另外一個表
的主鍵值,定義了兩個表之間的關係數據庫設計

關係數據庫的可伸縮性遠比非關係數據庫要好性能

可伸縮性(scale) 可以適應不斷增長的工做量而不失敗。設
計良好的數據庫或應用程序稱之爲可伸縮性好(scale well)學習

爲何要使用聯結

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

維護引用完整性 重要的是,要理解聯結不是物理實體。換句
話說,它在實際的數據庫表中不存在。聯結由MySQL根據需
要創建,它存在於查詢的執行當中ui

建立聯結

聯結的建立很是簡單,規定要聯結的全部表以及它們如何關聯便可
設計

如今來看 FROM 子句。與之前的 SELECT 語句不同,這條語句的 FROM
子句列出了兩個表,分別是 vendors 和 products 。它們就是這條 SELECT
語句聯結的兩個表的名字。這兩個表用 WHERE 子句正確聯結, WHERE 子句
指示MySQL匹配 vendors 表中的 vend_id 和 products 表中的 vend_id
可 以 看 到 要 匹 配 的 兩 個 列 以 vendors.vend_id 和 products.
vend_id 指定。這裏須要這種徹底限定列名,由於若是隻給出 vend_id ,
則MySQL不知道指的是哪個(它們有兩個,每一個表中一個)3d

徹底限定列名 在引用的列可能出現二義性時,必須使用完
全限定列名(用一個點分隔的表名和列名)。若是引用一個
沒有用表名限制的具備二義性的列名,MySQL將返回錯誤blog

WHERE子句的重要性

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

笛卡兒積(cartesian product) 由沒有聯結條件的表關係返回
的結果爲笛卡兒積。檢索出的行的數目將是第一個表中的行數乘
以第二個表中的行數

笛卡兒積不是咱們所想要的

不要忘了 WHERE 子句 應該保證全部聯結都有 WHERE 子句,否
則MySQL將返回比想要的數據多得多的數據。同理,應該保
證 WHERE 子句的正確性。不正確的過濾條件將致使MySQL返回
不正確的數據

叉聯結 有時咱們會聽到返回稱爲叉聯結(cross join)的笛卡
兒積的聯結類型

內部聯結

目前爲止所用的聯結稱爲等值聯結(equijoin),它基於兩個表之間的
相等測試。這種聯結也稱爲內部聯結。其實,對於這種聯結可使用稍
微不一樣的語法來明確指定聯結的類型

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

使用哪一種語法 ANSI SQL規範首選 INNER JOIN 語法。此外,
儘管使用 WHERE 子句定義聯結的確比較簡單,可是使用明確的
聯結語法可以確保不會忘記聯結條件,有時候這樣作也能影響
性能。

聯結多個表

SQL對一條 SELECT 語句中能夠聯結的表的數目沒有限制。建立聯結
的基本規則也相同。首先列出全部表,而後定義表之間的關係


此例子顯示編號爲 20005 的訂單中的物品。訂單物品存儲在
orderitems 表中。每一個產品按其產品ID存儲,它引用 products
表中的產品。這些產品經過供應商ID聯結到 vendors 表中相應的供應商,
供應商ID存儲在每一個產品的記錄中。這裏的 FROM 子句列出了3個表,而
WHERE 子句定義了這兩個聯結條件,而第三個聯結條件用來過濾出訂單
20005 中的物品

性能考慮 MySQL在運行時關聯指定的每一個表以處理聯結。
這種處理多是很是耗費資源的,所以應該仔細,不要聯結
沒必要要的表。聯結的表越多,性能降低越厲害

子查詢並不老是執行復雜 SELECT 操做的最有效的
方法,下面是使用聯結的相同查詢

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

多作實驗 正如所見,爲執行任一給定的SQL操做,通常存在
不止一種方法。不多有絕對正確或絕對錯誤的方法。性能可能
會受操做類型、表中數據量、是否存在索引或鍵以及其餘一些
條件的影響。所以,有必要對不一樣的選擇機制進行實驗,以找
出最適合具體狀況的方法

聯結是SQL中最重要最強大的特性,有效地使用聯結須要對關係數據 庫設計有基本的瞭解。本章隨着對聯結的介紹講述了關係數據庫設計的 一些基本知識,包括等值聯結(也稱爲內部聯結)這種最常用的聯 結形式。

相關文章
相關標籤/搜索