數據庫中的左連接和右連接的區別


這幾天在進行面試的時候,面試官出了一道題:

SELECT * from A LEFT JOIN B ON A.id= B.id and A.`name` = B.`name`  

問我會查詢出什么結果?

我說會查詢出 A 表中所有的數據消息和滿足 B 表中的 數據消息 

然后 他說: 如果將 SELECT * from A LEFT JOIN B ON A.id= B.id and A.`name` = B.`name`  更改為

SELECT * from A LEFT JOIN B ON A.id= B.id  where A.`name` = B.`name`  又會查詢出什么樣的結果?

我想想了很不確定的說 ,總之就是沒回答對!

好了,不多說了! 我們以實際的案例去學習,希望能有一個深刻的認識!

數據庫設計如下:

SQL 語句分析:

1. SELECT * from A LEFT JOIN B ON A.id= B.id and A.`name` = B.`name` 

2. SELECT * from A LEFT JOIN B ON A.id= B.id WHERE A.`name` = B.`name` 

3. SELECT * from A LEFT JOIN B ON A.id= B.id

4. SELECT * from A LEFT JOIN B  on A.`name` = B.`name` 

5. SELECT * from A LEFT JOIN B  on A.`name` = B.`name` WHERE B.age =10

由以上 3條 SQL 的分析 可知 

1. sql 中的 on 和 where 的 區別?

數據庫在通過連接兩張或多張表來返回記錄時,都會生成一張中間的臨時表,然后再將這張臨時表返回給用戶!

在使用left jion時,on和where條件的區別如下:

     1、 on條件是在生成臨時表時使用的條件,它不管on中的條件是否為真,都會返回左邊表中的記錄。
     2、where條件是在臨時表生成好后,再對臨時表進行過濾的條件。這時已經沒有left join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過濾掉。

2. Left Join
select * from tbl1 Left Join tbl2 where tbl1.ID = tbl2.ID
左連接后的檢索結果是顯示tbl1的所有數據和tbl2中滿足where 條件的數據。
簡言之 Left Join影響到的是右邊的表

Right join

1 .SELECT * from A RIGHT  JOIN B on A.id = B.id

2. SELECT * from A RIGHT  JOIN B on A.id = B.id AND A.`name` = B.`name` 

3. SELECT * from A RIGHT  JOIN B on A.id = B.id AND A.`name` = B.`name` WHERE B.age =10

分析可知:

   當進行 右連接的時候 會顯示 的 顯示 右邊表的數據 和 滿足 左邊表的消息

   select * from tbl1 Right Join tbl2 where tbl1.ID = tbl2.ID 檢索結果是tbl2的所有數據和tbl1中滿足where 條件的數據。
   簡言之 Right Join影響到的是左邊的表。

關於左連接和右連接總結性的一句話:
左連接where只影向右表,右連接where只影響左表。

其他知識點:

inner join 【有效連接】


select * FROM tbl1 INNER JOIN tbl2 ON tbl1.ID = tbl2.ID

功能和 select * from tbl1,tbl2 where tbl1.id=tbl2.id相同。

其他相關資料

1 .WHERE子句中使用的連接語句,在數據庫語言中,被稱為隱性連接。INNER JOIN……ON子句產生的連接稱為顯性連接。(其他JOIN參數也是顯性連接)WHERE 和INNER JOIN產生的連接關系,沒有本質區別,結果也一樣。但是!隱性連接隨着數據庫語言的規范和發展,已經逐漸被淘汰,比較新的數據庫語言基本上已經拋棄了隱性連接,全部采用顯性連接了。

2 .無論怎么連接,都可以用join子句,但是連接同一個表的時候,注意要定義別名,否則產生錯誤!

a> inner join:理解為“有效連接”,兩張表中都有的數據才會顯示left join:理解為“有左顯示”,比如on a.field=b.field,則顯示a表中存在的全部數據及a\\b中都有的數據,A中有、B沒有的數據以null顯示

b> right join:理解為“有右顯示”,比如on a.field=b.field,則顯示B表中存在的全部數據及a\\b中都有的數據,B中有、A沒有的數據以null顯示

c> full join:理解為“全連接”,兩張表中所有數據都顯示,實際就是inner +(left-inner)+(right-inner)

3 .join可以分主次表 外聯接有三種類型:完全外聯,左聯,右聯.
完全外聯包含兩張表的所有記錄.
左聯是以左邊的表為主,右邊的為輔,右聯則相反

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM