數據庫-left join,right join,inner join,full join
2019-04-18 22:36:26
sql中的連接查詢有inner join(內連接)、left join(左連接)、right join(右連接)、full join(全連接)四種方式,它們之間其實並沒有太大區別,僅僅是查詢出來的結果有所不同。
例如我們有兩張表:
Orders表通過外鍵Id_P和Persons表進行關聯。
-
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的寫法。
-
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表)中沒有匹配,但查詢結果仍然保留該行。
-
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,在左表中沒有記錄與之匹配,但依然保留。
-
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的並集。
這些連接查詢的區別也僅此而已。
數據庫-left join,right join,inner join,full join