1. 程式人生 > 其它 >MySQL多表聯合查詢,合併union,內連線,左連線,右連線

MySQL多表聯合查詢,合併union,內連線,左連線,右連線

MySQL

3. 表

3.4 查詢

3.4.1 多表查詢

第1種方式
select 表1.欄位名 [別名],……表n.欄位名n [別名] from 表1 [別名],……表n [別名] where 條件
#條件裡需要有各表的關聯欄位,比如表1.欄位名=表2.欄位名
  • 也可以有and,or(條件1,條件2) in(引數1,引數2)

  • 表1,2……也可以是虛擬表,括號括起虛擬表即可,別忘了給虛擬表取別名

第2種方式:表合併

​ 可以將兩個查詢語句的結果進行合併拼接,合併拼接的前提是:兩個表的表結構一樣

  • union:合併拼接時,可以自動去重,剔除重複項(重複項:該項每個欄位值完全一樣)
  • union all:合併拼接時,不能夠自動去重,不剔除重複項
    (重複項:該項每個欄位值完全一樣)
第3種方式:通過連線關鍵字
  • 內連線(inner join)
    組合兩個表中的記錄,返回關聯欄位相符的記錄,也就是返回兩個表的交集部分
select  欄位名 from 表1 inner join 表2 on 條件(兩表的關聯欄位) where 條件

比如:

select d.deptName,e.empMame,e.salary from dept inner join emp on dept.id=e.deptId where d.deptName='開發部'
  • 外連線( outer join )
    • 左(外)連線 (left [outer] join)

    ​ 以左邊表為主:表1 left join 表2 on 條件 [where 條件]

    左表的記錄將會全部表示出來,而右表只會顯示符合搜尋條件的記錄。右表記錄不足的地方均為NULL。

    • 右(外)連線 right [outer] join

      以右邊表為主:表1 right join 表2 on 條件 [where 條件]

      左表只會顯示符合搜尋條件的記錄,而右表的記錄將會全部表示出來。左表記錄不足的地方均為NULL。

    • 舉例

表結構在這裡插入圖片描述
在這裡插入圖片描述

表內容:
在這裡插入圖片描述
在這裡插入圖片描述

問題:請查出 2006-6-1 到2006-7-1之間舉行的所有比賽,並且用以下形式列出: 拜仁 2:0 不來梅 2006-6-21

  • 錯誤的是:
select T.teamName 球隊名稱,M.matchResult 比賽結果,T.teamName 球隊名稱,M.matchTime 比賽開始時間 
from `Match` M left join Team T 
on M.hostTeamID=T.teamID AND M.guestTeamID=T.teamID 
WHERE M.matchTime BETWEEN 20060601 AND 20060701

因為:on後面的關聯欄位必須是一一對應,而不能1對N。

正確的是:

select t1.球隊名稱,t1.比賽結果,t2.球隊名稱,t2.比賽開始時間 
from 
(select M.matchID 比賽ID,T.teamName 球隊名稱,M.matchResult 比賽結果,M.matchTime 比賽開始時間 from `Match` M left join Team T on M.hostTeamID=T.teamID ) t1
left join 
 (select M.matchID 比賽ID,M.matchResult 比賽結果,T.teamName 球隊名稱,M.matchTime 比賽開始時間 from `Match` M left join Team T on M.guestTeamID=T.teamID) t2
on t1.比賽ID=t2.比賽ID WHERE t1.比賽開始時間 BETWEEN 20060601 AND 20060701

思路:

  1. 先以表Match左連線表Team,查出表Match中hostTeamID這列對應的比賽資訊,記為表t1:
select M.matchID 比賽ID,T.teamName 球隊名稱,M.matchResult 比賽結果,M.matchTime 比賽開始時間 from `Match` M left join Team T on M.hostTeamID=T.teamID

在這裡插入圖片描述

  1. 再以表Match左連線表Team,查出表Match中guestTeamID這列對應的比賽資訊,記為表t2:
select M.matchID 比賽ID,M.matchResult 比賽結果,T.teamName 球隊名稱,M.matchTime 比賽開始時間 from `Match` M left join Team T on M.guestTeamID=T.teamID

在這裡插入圖片描述

  1. 最後把表t1關聯t2,得出結果:
    在這裡插入圖片描述