数据库左右链接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.

 

 

若有错误,还望指正!

相关文章
相关标签/搜索