>[success] # 表的聯結
>SQL 最強大的功能之一就是能在數據檢索查詢的執行中聯結表。
數據是存儲在關系表中的,關系表的設計原則是保證把信息分解為多個表, 一類數據一個表,各表通過某些常用的值互相關聯。
兩個表之間的關聯關系通過外鍵來關聯。
外鍵是某個表中的一列,它包含另外一個表的主鍵值,定義了兩個表之間的 關系。
<br>
* * * * *
>[danger] ##### 創建聯結
>解釋說明,兩個表相互聯結時,要用where指定他們的關系列,利用select * from 后可以跟多個表,通過查詢多個表找到關系
**有一個user表用來存放用戶名字**

**有一個uu表 用來存放qq號**

**兩表唯一關聯時nid字段,我們用聯合查詢,將表聯結**
`SELECT user.nid,user.`userrname`,uu.`qq` FROM USER,uu WHERE user.`nid`=uu.`nid`;`
**結果如圖**:

>[danger] 聯結常犯錯誤-笛卡爾積
>笛卡爾積是由沒有聯結條件的表關系返回的結果,檢索出的行的數目將是第 一個表中的行數乘以第二個表中的行數,通俗的說關聯的表,無論兩個還多個,他們之間無對應的where條件關系導致,差生數據查詢混亂
`SELECT user.nid,user.`userrname`,uu.`qq` FROM USER,uu ;`
因為沒有限制where 條件導致聯結是,出現重復錯誤數據,實際兩條數據通過,笛卡爾積導致四條

* * * * *
<br>
>[danger] ##### 內部聯結-inner join.........on
>此語句中的 select 與前面的 select 語句相同,但 from 子句不同,這里 兩個表之間的關系是 from 子句的組成部分,以 INNER JOIN 指定。在使用這 種語法時,聯結條件用特定的 ON 子句而不是 where 子句。傳遞給 ON 的實 際條件與傳遞給 where 的相同
**語法:**
` select 列 from 表一 inner join 表二 on 聯結相關連字段 `
**案列:**
`SELECT user.nid,user.`userrname`,uu.`qq` FROM USER INNER JOIN uu ON user.nid=uu.`nid` ;`

**注意:**
MySQL 在運行時關聯指定的每個表以處理聯結,這種處理可能非常消 耗資源,因此不要聯結不必要的表。聯結的表越多,性能下降越厲害。
* * * * *
<br>
>[danger] ##### 自連接
**傳統的子查詢:**
有種情況,一個表中有一個商品vend_id 的列,我們想查找DINTR這個商品在哪個標號,查出的編號下,又有那些物品,整合的sql
`SELECT * FROM products WHERE vend_id = (SELECT vend_id FROM products WHERE prod_id='DTNTR')`
**使用自聯結 :**
`SELECT p1.`prod_id`,p1.`prod_name` FROM products AS p1, products AS p2 WHERE p1.vend_id = p2.`vend_id` AND p2.`prod_id`='DTNTR';`
**注:**
個人理解,因為自連接兩個表時一樣的 ,我們在where查詢的時候,條件是p2,所以展示應給用p1列來做,因為p2查出來的數據是針對的
* * * * *
<br>
>[danger] ##### 左連接:
>以左邊表為基準,按照過濾條件查找右邊表的記錄,如果匹配到, 那么就組合成一行,并顯示結果,如果沒有匹配到,那么只顯示左邊表的字 段,右邊表中不存在的字段用空值來表示。
>A表所有顯示,如果B中無對應關系,則值為null
select A.num, A.name, B.name
from A left join B
on A.nid = B.nid
* * * * *
<br>
>[danger] ##### 右連接:
>作用和左聯結剛好相反,以右邊表為基準,去匹配左邊的表,如果 左邊表字段為空,那么就用空值來表示。
>B表所有顯示,如果B中無對應關系,則值為null
select A.num, A.name, B.name
from A right join B
on A.nid = B.nid