数据库左右连接on后的限制条件问题
测试环境:
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后面接列值有限制条件,所以仔细分析一下这个限制条件到底是有何效果
一、建立测试表格
1、t_basicInfo

表t_basicInfo有3列信息值,第一列标记某唯一的id,后两列是基本信息
2、t_detailInfo

表t_detailInfo有4列信息值,前三列与表t_basicInfo表示相同信息。但此表并没有表t_basicInfo所有的人的信息,只有部分人的详细信息(address)。
先来看下我们平时常写的左右连接语句,以左连接为例
#测试易于理解情况下,直接用*把所有列信息输出,在非测试条件下不要用*。
Select * from t_basicInfo t1 left outer join t_detailInfo t2 on t1.id = t2.id
输出结果如下:

以上就是我们最常用的左连接语法,但是在on后加上限制条件会如何?
二、在on后添加除了连接条件外的其他限制条件
测试一下对不同的条件进行限制筛选结果如何:
①对id列(连接列)进行限制
②对t1中name进行限制
③对t2中name进行限制
1、对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中的数据行数并没有减少
还不能下结论,接着测试
2、对t1中的列(非关联列)进行限制
Select * from t_basicInfo t1 left outer join t_detailInfo t2 on t1.id = t2.id and t1.age > 19
查询结果如下:

结果分析:在t1中的列进行限制后,只把满足条件的t1行进行左连接,t1中的数据行数并没有减少。
3、对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后加上限制条件,会在连接时考虑限制条件,如果不符合条件,则本行数据不进行连接动作。作为主表所有数据必出现在结果集中,而副表不进行连接的行数据一定不出现在结果集中。
上个图来说明一下

三、回到我们最初的问题
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,结果集是什么?
第一条语句是二、(1)中的测试语句,我把结果重现拿下来以便对比

然后第二句的结果运行结果如下:

仔细考虑一下原因,然后看结论:
如果on后的and换成了where。where后的限制条件已经不是在t1和t2表进行连接的时候进行限制,而是对 在t1和t2表进行t1.id=t2.id条件下进行关联的结果集再进行select * from(连接结果集) where t1.id>2.
如有错误,还望指正!
数据库左右连接on后的限制条件问题的更多相关文章
- EF 连接MySQL 数据库 保存中文数据后乱码问题
EF 连接MySQL 数据库 保存中文数据后乱码问题 采用Code First 生成的数据库,MySQL数据库中,生成的表的编码格式为***** 发现这个问题后,全部手动改成UTF8(图是另一个表的 ...
- 涂抹Oracle笔记2:数据库的连接-启动-关闭
一.数据库的连接sqlplus <username>[/<password>][@<connect_idertifier>]|/[as sysdba| as sys ...
- java中与数据库的连接
package unitl01; import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet; ...
- jsp与数据库的连接
经过一段时间的学习与上网查资料,我已经成功的用java语言连接上了数据库, 本以为同理jsp跟数据库的连接肯定水到渠成的,但是在经过尝试很多次后我发现现实永远是骨感的,最终结果是花了一个下午的时间去建 ...
- 数据库最大连接池max pool size
本文导读:Max Pool Size如果未设置则默认为100,理论最大值为32767.最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影 ...
- jsp_数据库的连接
一.添加数据库以及表 在这里我们使用的是mysql数据库 二.配置数据库的驱动程序 将mysql的驱动程序复制到Tomcat目录下的lib目录中 注:在Tomcat中如果配置了新的jar包,则配置完成 ...
- php对mysql数据库简单连接操作
前些阵子忙完了公司前端静态页面的事情了之后,简单学习了下php的基础知识,今天想了想回顾一下php连接数据库的方式,写一下随笔存一下看看 php连接数据库端口和新建数据库 <?php $serv ...
- [转]Hibernate不能自动建表解决办法及Hibernate不同数据库的连接及SQL方言
最近开始学Hibernate,看的是李刚的那本<轻量级java ee企业应用实战>.头一个hibernate程序,我原原本本的按照书上例子写下来,同时只是改动了些mysql的连接参数,并且 ...
- MVC模式(Model View Controller)下实现数据库的连接,对数据的删,查操作
MVC模式(Model View Controller): Model:DAO模型 View:JSP 在页面上填写java代码实现显示 Controller:Servlet 重定向和请求的转发: 若 ...
随机推荐
- 大牛blog
分布式: 分布式基础学习[一] —— 分布式文件系统 分布式基础学习[二] —— 分布式计算系统(Map/Reduce) Java分布式应用技术架构介绍
- SQL Server中比较末尾带有空格的字符串遇到的坑 (转载)
最近发现SQLServer中比较字符串的时候 如果字符串末尾是空格 那么SQLServer会无视那些空格直接进行比较 这和程序中平时的字符串判断逻辑不统一 );set @a=N'happycat198 ...
- HNOI2017做题笔记
HNOI2017 单旋(线段树.set) 手玩旋转操作(忽略手玩过程)可以发现:一次单旋对原树的变化实际上很小. 对于父子关系,单旋最小值会将\(Spaly\)上最小值变成原来根的父亲,将最小值的点右 ...
- flask-sqlalchemy组件
一.简介 flask本身没有内置orm框架,需要依赖第三方模块,这里介绍flask-sqlalchemy,而flask-sqlalchemy是一个flask的扩展,本质上是对sqlalchemy的进一 ...
- IntelliJ IDEA下自动生成Hibernate映射文件以及实体类
来自:https://blog.csdn.net/chenyunqiang/article/details/81026823 1.构建项目并添加项目结构配置以及配置初始参数 1.1.如图将基本的架子搭 ...
- 【JVM.11】Java内存模型与线程
鲁迅曾经说过“并发处理的广泛应用是使得Amdahl定律代替摩尔定律成为计算机性能发展源动力的根本原因,也是人类‘压榨‘ 计算机运行能力的最有力武器.” 一.概述 多任务处理在现代计算机操作系统中几乎已 ...
- 以英雄联盟的方式建模,谈对依赖注入(DI)的理解以及Autofac的用法(一)
一.前言 近期在探索分层架构和架构设计,选择了领域驱动作为5年.Net开发后的新的方向,不可避免的接触了IoC/DI方面的技术.目前通过反射或其他方法都已实现,但只知其一,并没有考虑为什么要这么做,同 ...
- 用JS制作一个信息管理平台(1)
首先,介绍一些需要用到的基本知识. [JSON] JSON是数据交互中,最常用的一种数据格式. 由于各种语言的语法都不相同,在传递数据时,可以将自己语言中的数组.对象等转换为JSON字符串. 传递之后 ...
- mysql 通过慢查询日志查写得慢的sql语句
MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含所有执行时间超过long_query_t ...
- mysql操作命令梳理(5)-执行sql语句查询即mysql状态说明
在日常mysql运维中,经常要查询当前mysql下正在执行的sql语句及其他在跑的mysql相关线程,这就用到mysql processlist这个命令了.mysql> show process ...