MySQL-4 連接查詢


定義: 將多張表(可以大於2張)進行記錄的連接(按照某個指定的條件進行數據拼接)。
結果: 記錄數有可能變化, 字段數一定會增加(至少兩張表的合併)
意義: 在用戶查看數據的時候,需要顯示的數據來自多張表.

連接查詢: join,
使用方式: 左表 join 右表

SQL中將連接查詢分成四類: 內連接,外連接,自然連接和交叉連接
舉例

表tb_a: 					  表tb_b:

在這裏插入圖片描述在這裏插入圖片描述

1. 交叉連接

交叉連接: cross join, 從一張表中循環取出每一條記錄, 每條記錄都去另外一張表進行匹配: 匹配一定保留(沒有條件匹配), 而連接本身字段就會增加(保留),最終形成的結果叫做: 笛卡爾積.

基本語法:

左表 cross join 右表; 
(或者 from 左表,右表;)

笛卡爾積沒有意義: 應該儘量避免(交叉連接沒用)
交叉連接存在的價值: 保證連接這種結構的完整性

使用:

select * from tb_a cross join tb_b;
select * from tb_a , tb_b;
-- 結果共5*6=30條記錄--

部分結果:
在這裏插入圖片描述

2. 內連接

內連接: [inner] join, 從左表中取出每一條記錄,去右表中與所有的記錄進行匹配: 匹配必須是某個條件在左表中與右表中相同最終纔會保留結果,否則不保留.

基本語法

左表 [inner] join 右表 on 左表.字段 = 右表.字段; 
-- 基於條件的內連接:只保留笛卡爾積中符合條件的數據-- 

在查詢數據的時候,不同表有同名字段,這個時候需要加上表名才能區分, 而表名太長, 通常可以使用別名.內連接還可以使用where代替on關鍵字(where沒有on效率高)
使用:
簡單內連接:等價於交叉連接

select * from tb_a a inner join tb_b b;
-- 結果共5*6=30條記錄,不使用條件則和交叉連接結果一樣--

基於條件的內連接:只保留笛卡爾積中符合條件的數據

select * from tb_a a inner join tb_b b on a.name = b.name;

在這裏插入圖片描述

3. 外連接

外連接: outer join, 以某張表爲主,取出裏面的所有記錄, 然後每條與另外一張表進行連接: 不管能不能匹配上條件,最終都會保留: 能比配,正確保留; 不能匹配,其他表的字段都置空NULL.

外連接分爲兩種:

  • Left join: 左外連接(左連接), 以左表爲主表
  • Right join: 右外連接(右連接), 以右表爲主表

基本語法:

左表 left/right join 右表 on 左表.字段 = 右表.字段;
-- 左外連接:左表不變,增加右表符合條件的數據 -- 
-- 右外連接:右表不變,增加左表符合條件的數據 --

雖然左連接和右連接有主表差異, 但是顯示的結果: 左表的數據在左邊,右表數據在右邊.
左連接和右連接可以互轉.

-- 左外連接:左表不變,增加右表符合條件的數據 --
select * from tb_a a left join tb_b b on a.name = b.name;

在這裏插入圖片描述

 -- 右外連接:右表不變,增加左表符合條件的數據 --
select * from tb_a a right join tb_b b on a.name = b.name;

在這裏插入圖片描述

4. 自然連接

自然連接: natural join, 自然連接, 就是自動匹配連接條件: 系統以字段名字作爲匹配模式(同名字段就作爲條件, 多個同名字段都作爲條件).

自然連接: 可以分爲自然內連接和自然外連接.

  • 自然內連接: 左表 natural join 右表;
  • 自然外連接: 左表 natural left/right join 右表;

其實, 內連接和外連接都可以模擬自然連接: 使用同名字段,合併字段
左表 left/right/inner join 右表 using(字段名); – 使用同名字段作爲連接條件: 自動合併條件

多表連接: A表 inner join B表 on 條件 left join C表 on條件 ...
執行順序: A表內連接B表,得到一個二維表, 左連接C表形成二維表…

使用

-- 自然連接 保留相同屬性的值都相同的列,其他列補充--
select * from tb_a natural join tb_b;

stu1,2,3,4的name,number,age對應的值都相同,那麼保留兩個表的這四條記錄,再合併相同內容。
在這裏插入圖片描述

-- 左自然連接 左表爲基準,留右表與左表相同屬性的值都相同的記錄,相同的覆蓋-- 
select * from tb_a natural left join tb_b;

以左表爲基準,右表的stu1,2,3,4記錄與左表的name,number,age對應的值都相同。合併並保留。
在這裏插入圖片描述

-- 右自然連接 右表爲基準,留左表與右表相同屬性的值都相同的記錄,相同的覆蓋-- 
select * from tb_a natural right join tb_b;

以右表爲基準,左表的stu1,2,3,4記錄與右表的name,number,age對應的值都相同。合併並保留,但是左表不存在sex屬性,那麼這個值爲NULL。
在這裏插入圖片描述

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