1. 程式人生 > 其它 >【轉】sql基礎left join, inner join, full join , right join 的理解

【轉】sql基礎left join, inner join, full join , right join 的理解

原文:https://www.cnblogs.com/lijingran/p/9001302.html

-------------------------

https://www.cnblogs.com/assasion/p/7768931.html

https://blog.csdn.net/rongbo_j/article/details/46352337

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

查詢結果集:

此種連線方式Orders表中Id_P欄位在Persons表中找不到匹配的,則不會列出來。

注意:單純的select * from a,b是笛卡爾乘積。比如a表有5條資料,b表有3條資料,那麼最後的結果有5*3=15條資料。

但是如果對兩個表進行關聯:select * from a,b where a.id = b.id 意思就變了,此時就等價於:

select * from a inner join b on a.id = b.id。即就是內連線。

但是這種寫法並不符合規範,可能只對某些資料庫管用,如sqlserver。推薦最好不要這樣寫。最好寫成inner join的寫法。

內連線查詢 (select * from a join b on a.id = b.id) 與 關聯查詢 (select * from a , b where a.id = b.id)的區別

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

查詢結果如下:

可以看到,左表(Persons表)中LastName為Bush的行的Id_P欄位在右表(Orders表)中沒有匹配,但查詢結果仍然保留該行。

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,在左表中沒有記錄與之匹配,但依然保留。

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

查詢結果如下:

查詢結果是left join和right join的並集。

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