left join,right join,inner join,full join之間的區別

sql中的連接查詢有inner join(內連接)、left join(左連接)、right join(右連接)、full join(全連接)四種方式,它們之間其實並沒有太大區別,僅僅是查詢出來的結果有所不同。
例如我們有兩張表:

這裏寫圖片描述

Orders表通過外鍵Id_P和Persons表進行關聯。

1.inner join(內連接),在兩張表進行連接查詢時,只保留兩張表中完全匹配的結果集。

我們使用inner join對兩張表進行連接查詢,sql如下:

SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p
INNER JOIN Orders o
ON p.Id_P=o.Id_P and 1=1  --用and連接多個條件
ORDER BY p.LastName

查詢結果集:
這裏寫圖片描述

where多表查詢和inner join區別

1.使用多表查詢會產生笛卡爾積。

例如:

SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p , Orders o
where p.Id_P=o.Id_P and 1=1  --用and連接多個條件
ORDER BY p.LastName

假如P和O表 各有1000條數據,那麼會產生1000000條記錄,然後根據where條件消除笛卡爾積,實際會造成更多的資源消耗,爲了避免笛卡爾積,應該使用inner join

2.left join,在兩張表進行連接查詢時,會返回左表所有的行,即使在右表中沒有匹配的記錄。

我們使用left join對兩張表進行連接查詢,sql如下:

SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p
LEFT JOIN Orders o
ON p.Id_P=o.Id_P
ORDER BY p.LastName

3.right join,在兩張表進行連接查詢時,會返回右表所有的行,即使在左表中沒有匹配的記錄。

我們使用right join對兩張表進行連接查詢,sql如下:

SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p
RIGHT JOIN Orders o
ON p.Id_P=o.Id_P
ORDER BY p.LastName

查詢結果如下:

這裏寫圖片描述
Orders表中最後一條記錄Id_P字段值爲65,在左表中沒有記錄與之匹配,但依然保留。

查詢結果如下:
這裏寫圖片描述
可以看到,左表(Persons表)中LastName爲Bush的行的Id_P字段在右表(Orders表)中沒有匹配,但查詢結果仍然保留該行。

4.full join,在兩張表進行連接查詢時,返回左表和右表中所有沒有匹配的行。

我們使用full join對兩張表進行連接查詢,sql如下:

SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p
FULL JOIN Orders o
ON p.Id_P=o.Id_P
ORDER BY p.LastName

查詢結果如下:相當於unio all
這裏寫圖片描述
查詢結果是left join和right join的並集。

這些連接查詢的區別也僅此而已。

發佈了63 篇原創文章 · 獲贊 12 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章