數據庫左右鏈接on後的限制條件問題

測試環境:sql

MySQL 5.7.19數據庫

HeidiSQL 9.3 數據庫界面鏈接工具(挺好用的)工具

碰到的問題是:測試

Select * from t1 left outer join t2 on t1.id=t2.id and t2.age>18 和
Select * from t1 left outer join t2 on t1.id=t2.id where t2.age>18 兩條語句返回結果集是否相同

以前在on後邊只寫過兩張表的鏈接條件,沒有考慮過左右鏈接on後面接列值有限制條件,因此仔細分析一下這個限制條件究竟是有何效果spa

 

1、創建測試表格

一、t_basicInfo

表t_basicInfo有3列信息值,第一列標記某惟一的id,後兩列是基本信息code

二、t_detailInfo

表t_detailInfo有4列信息值,前三列與表t_basicInfo表示相同信息。但此表並無表t_basicInfo全部的人的信息,只有部分人的詳細信息(address)。blog

 

先來看下咱們平時常寫的左右鏈接語句,以左鏈接爲例class

#測試易於理解狀況下,直接用*把全部列信息輸出,在非測試條件下不要用*。select

Select * from t_basicInfo t1 left outer join t_detailInfo t2 on t1.id = t2.id

  輸出結果以下:語法

以上就是咱們最經常使用的左鏈接語法,可是在on後加上限制條件會如何?

 

2、在on後添加除了鏈接條件外的其餘限制條件

測試一下對不一樣的條件進行限制篩選結果如何:

①對id列(鏈接列)進行限制

②對t1中name進行限制

③對t2中name進行限制

 

一、對id進行限制

(1)對t1.id限制

Select * from t_basicInfo t1 left outer join t_detailInfo t2 on t1.id = t2.id and t1.id > 2 

  查詢結果以下:

(2)對t2.id限制

Select * from t_basicInfo t1 left outer join t_detailInfo t2 on t1.id = t2.id and t2.id > 2 

  查詢結果以下:

 

結果分析:查詢結果相同。在on後對鏈接條件中的列(id)進行限制只會對副表(t2)中的信息進行限制,t1中的數據行數並無減小

還不能下結論,接着測試

 

二、對t1中的列(非關聯列)進行限制

Select * from t_basicInfo t1 left outer join t_detailInfo t2 on t1.id = t2.id and t1.age > 19 

  查詢結果以下:

 

結果分析:在t1中的列進行限制後,只把知足條件的t1行進行左鏈接,t1中的數據行數並無減小。

 

三、對t2中的列(非關聯列)進行限制

 

Select * from t_basicInfo t1 left outer join t_detailInfo t2 on t1.id = t2.id and t2.address != 'Shanghai' 

  查詢結果以下:

 

 

 結果分析:在t2中的列進行限制後,只把t2知足條件的列進行左鏈接,t1中的數據行數並無減小。

 

 結論:

  結合1/2/3中的測試結果:若是在on後加上限制條件,會在鏈接時考慮限制條件,若是不符合條件,則本行數據不進行鏈接動做。做爲主表全部數據必出如今結果集中,而副表不進行鏈接的行數據必定不出如今結果集中。

上個圖來講明一下

  

 

3、回到咱們最初的問題

 

Select * from t_basicInfo t1 left outer join t_detailInfo t2 on t1.id = t2.id and t1.id > 2

  和

Select * from t_basicInfo t1 left outer join t_detailInfo t2 on t1.id = t2.id where t1.id > 2

  

若是將and換成where,結果集是什麼?

 

第一條語句是2、(1)中的測試語句,我把結果重現拿下來以便對比

而後第二句的結果運行結果以下:

 

仔細考慮一下緣由,而後看結論:

  若是on後的and換成了where。where後的限制條件已經不是在t1和t2表進行鏈接的時候進行限制,而是對 在t1和t2表進行t1.id=t2.id條件下進行關聯的結果集再進行select * from(鏈接結果集) where t1.id>2.

 

 

若有錯誤,還望指正!

相關文章
相關標籤/搜索