測試環境: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.
若有錯誤,還望指正!