MySQL多表聯合查詢,合併union,內連線,左連線,右連線
阿新 • • 發佈:2021-05-22
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種方式:通過連線關鍵字
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。
表結構
表內容:
問題:請查出 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
思路:
- 先以表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
- 再以表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
- 最後把表t1關聯t2,得出結果: