mysql中left join设置条件在on与where时的区别
一、首先我们准备两张表来进行测试。
CREATE TABLE `a` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(32) DEFAULT '' COMMENT '名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `b` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`a_id` int(11) DEFAULT '0' COMMENT 'a表ID',
`name` varchar(32) DEFAULT '' COMMENT '名称',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
两个表的数据如图所示:
运行下面左连接查询:
select * from a left join b on a.id = b.a_id;
我们分别在on和where后面加上条件,看看执行结果是否相同。
select * from a left join b on a.id = b.a_id and b.id > 3;
select * from a left join b on a.id = b.a_id where b.id > 3;
上面的两条语句,条件我们设置的是一样的都是b.id > 3,为什么显示结果不同。
sql语句查询的关键字顺序一般为 from > where > group by > having > order by
left join 在 from范围,on 条件会先对 left join 的右表进行筛选,筛选完后的结果 where 再进行筛选。
多个 left join 会生成一张临时表,on 条件是对 left join 右表进行条件过滤,where 条件针对最后生成的临时表进行过滤。
所以:
b.id > 3 的条件如果写在 on 后面,则是先对右边表(关联表)进行筛选,得出符合条件的行,然后主表 left join ,返回主表所有的行,右边表没匹配上的用 null 表示。
b.id > 3 的条件如果写在 where 后面,则是先主表 left join 右边表(关联表),返回所有的行,然后 where 条件再对结果进行筛选。
注意:on 后面的条件是针对右边的表(关联表),对主表没什么作用。
select * from a left join b on a.id = b.a_id and a.id > 3;
我们在on 后面添加了对主表的条件 a.id > 3,不过主表的数据仍然全部显示出来了,但是影响了右边表(关联表)的显示。
如果想要对主表进行筛选,应该把条件写在where后。
select * from a left join b on a.id = b.a_id where a.id > 3;
mysql中left join设置条件在on与where时的区别的更多相关文章
- MySQL中KEY、PRIMARY KEY、UNIQUE KEY、INDEX 的区别
参考:MySQL中KEY.PRIMARY KEY.UNIQUE KEY.INDEX 的区别 对于题目中提出的问题,可以拆分来一步步解决.在 MySQL 中 KEY 和 INDEX 是同义.那这个问题就 ...
- mysql中tinyint、smallint、int和bigint类型的用法区别
mysql中tinyint.smallint.int和bigint类型的用法区别: 在MySQL的数据类型中,Tinyint的取值范围是:带符号的范围是-128到127.无符号的范围是0到255(见官 ...
- mysql中的JOIN用法总结
join是mysql中一个基础的关键词,一般在多表连接查询中使用,这里做一下总结 1.JOIN的语法格式 table_references: table_reference [, table_refe ...
- Mysql中的Join详解
一.Simple Nested-Loop Join(简单的嵌套循环连接) 简单来说嵌套循环连接算法就是一个双层for 循环 ,通过循环外层表的行数据,逐个与内层表的所有行数据进行比较来获取结果,当执行 ...
- mysql中各种join连表查询总结
通常我们需要连接多个表查询数据,以获取想要的结果. 一.连接可以分为三类: (1) 内连接:join,inner join (2) 外连接:left join,left outer join,righ ...
- mysql中为int设置长度究竟是什么意思
根据个人的实验并结合资料:1.长度跟可以使用的值的范围无关,值的范围仅跟类型对应的存储字节数和是否unsigned有关:2.长度指的是显示宽度,比如,指定3位int,那么id为3和id为300的值,在 ...
- mysql中的concat函数,concat_ws函数,concat_group函数之间的区别
一.CONCAT()函数CONCAT()函数用于将多个字符串连接成一个字符串.使用数据表Info作为示例,其中SELECT id,name FROM info LIMIT 1;的返回结果为+----+ ...
- 3个问题:MySQL 中 character set 与 collation 的理解;utf8_general_ci 与 utf8_unicode_ci 区别;uft8mb4 默认collation:utf8mb4_0900_ai_ci 的含义
MySQL 中 character set 与 collation 的理解 出处:https://www.cnblogs.com/EasonJim/p/8128196.html 推荐: 编码使用 uf ...
- Mysql中Left Join Right Join Inner Join where条件的比较
建立一对多的表 company 和 employee company表 id name address 1baidu北京 2huawei深圳 3jingdong北京 4tengxu ...
随机推荐
- c# vs2013部署项目
http://demo.netfoucs.com/shinepan/article/details/24865931
- shiro 会话管理
- 利用等概率Rand5产生等概率Rand3(转)
问题本身很明确,但不知道起个什么题目好,姑且先这么说吧. 问题描述:现在有一个叫做Rand5的函数,可以生成等概率的[0, 5)范围内的随机整数,要求利用此函数写一个Rand3函数(除此之外,不能再使 ...
- rename批量修改文件并在后缀前加字段
rename 's/\.jpg$/generate_badu\.jpg/' * 其中,'.'需要加转义斜杠'\', '*'代表文件夹下所有文件
- 开始jQuery学习之旅
jQuery写法 //实例写法$('div').css({width:200,backgroundColor:'red'}); 参数规则 // css selector$('.wrapper ul l ...
- ubuntu16.04 64bit 升级到 python3.6
https://blog.csdn.net/zhao__zhen/article/details/81584933 https://www.codetd.com/article/1967538 htt ...
- svn 更新lib库时,报错
svn: E195012: Unable to find repository location for svn:// in revision 9718 Can't revert without re ...
- SSM的例子-参考
ssm的例子:http://blog.csdn.net/double030/article/details/63683613
- Struts2学习资料
Struts2入门示例教程 http://blog.csdn.net/wwwgeyang777/article/details/19078545 Struts2工作原理 http://blog ...
- ORM之查询
一.对象查询 1.正向查询 ret1=models.Book.objects.first() print(ret1.title) print(ret1.price) print(ret1.publis ...