SQL中LEFT JOIN ON AND 与 LEFT JOIN ON WHERE的区别
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
ON...WHERE
select * from tb_students ts left join tb_class tc on ts.cid = tc.id where tc.classcode = '' order by ts.id
SQL执行过程:
- 生成临时表: ON条件: ts.cid = tc.id
2. 对临时表进行过滤: WHERE条件: tc.classcode = '1801'
ON...AND
select * from tb_students ts left join tb_class tc on ts.cid = tc.id and tc.classcode = '1801' order by ts.id
SQL执行过程:
- 生成临时表: ON条件: ts.cid = tc.id and tc.classcode = '1801' (条件不为真也会返回左表中的记录)
总结
使用LEFT JOIN时,ON...AND和ON...WHERE条件的区别如下:
- ON...WHERE:在临时表生成后,再对临时表的数据进行过滤,再返回左表。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
ON...AND:在临时表生成的过程时,ON中的条件不管是否为真,都将返回左表。
以上结果的关键原因就是LEFT JOIN,RIGHT JOIN,FULL JOIN的特殊性,不管ON上的条件是否为真都会返回LEFT或RIGHT表中的记录,FULL则具有LEFT和RIGHT的特性的并集。而INNER JOIN没这个特殊性,则条件放在ON中和WHERE中,返回的结果集是相同的。
SQL中LEFT JOIN ON AND 与 LEFT JOIN ON WHERE的区别的更多相关文章
- 转【】浅谈sql中的in与not in,exists与not exists的区别_
浅谈sql中的in与not in,exists与not exists的区别 1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...
- 浅谈sql中的in与not in,exists与not exists的区别
转 浅谈sql中的in与not in,exists与not exists的区别 12月12日北京OSC源创会 —— 开源技术的年终盛典 » sql exists in 1.in和exists ...
- SQL中的多表查询,以及JOIN的顺序重要么?
说法是,一般来说,JOIN的顺序不重要,除非你要自己定制driving table. 示例: SELECT a.account_id, c.fed_id, e.fname, e.lname -> ...
- SQL中的Update、delete与inner join 联合使用
Update XXX set XXX where 这种写法大家肯定都知道,才发现update和delete居然支持inner join的update方式,太神奇了. update的格式是 update ...
- 浅谈sql中的in与not in,exists与not exists的区别以及性能分析
1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的.如果查询的两个表 ...
- SQL中exists、not exists以及in、not in的区别和使用
exists : 强调的是是否返回结果集,不要求知道返回什么, 比如: select name from student where sex = 'm' and mark exists(selec ...
- sql中的in与not in,exists与not exists的区别
1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询,一直以来认为exists比in效率高的说法是不准确的.如果查询的两个表 ...
- sql中update,alter,modify,delete,drop的区别和使用(整理)(转)
关于update和alter: 百度知道上关于update和alter有一个很形象的总结: 一个表有很多字段,一个字段里有很多数据. 一个家有很多房间,一个房间里有很多家具. update是用来将衣柜 ...
- sql中update,alter,modify,delete,drop的区别和使用(整理)
关于update和alter: 百度知道上关于update和alter有一个很形象的总结: 一个表有很多字段,一个字段里有很多数据. 一个家有很多房间,一个房间里有很多家具. update是用来将衣柜 ...
- Spark SQL中Not in Subquery为何低效以及如何规避
首先看个Not in Subquery的SQL: // test_partition1 和 test_partition2为Hive外部分区表 select * from test_partition ...
随机推荐
- php nl2br()函数 语法
php nl2br()函数 语法 作用:在字符串中的新行(\n)之前插入换行符dd马达 语法:nl2br(string,xhtml) 参数: 参数 描述 string 必须.规定要检查的字符串. xh ...
- Linux0.11内核源码——内核态进程切换的改进
本来想自己写的,但是发现了一篇十分优秀的博客 https://www.cnblogs.com/tradoff/p/5734582.html system_call的源码解析:https://blog. ...
- js中forEach,for in,for of循环的用法
from:https://www.cnblogs.com/amujoe/p/8875053.html 一.一般的遍历数组的方法: var array = [1,2,3,4,5,6,7]; for (v ...
- DB-概念-数据库:数据库/Database
ylbtech-DB-概念-数据库:数据库/Database 数据库是以一定方式储存在一起.能与多个用户共享.具有尽可能小的冗余度.与应用程序彼此独立的数据集合,可视为电子化的文件柜——存储电子文件的 ...
- iview+vue 使用中遇到的问题(表格、select、radio)
1.iview+vue中,对表头的动态设置: iview表头若是需要动态设置,可以有两个方法,第一种: children: [ { title: '2017年', align: 'center', k ...
- mootools使用Request.send()数据时刷新整个页面
今天使用mootools做ajax登录时使用Request().send()数据时老是刷新整个页面,换成Requesr.JSON()也不行,弄了好长时间,很郁闷啊,最后终于发现onSuccess:fu ...
- appium常见问题05_修改Android手机运行环境(adb指令修改hosts)
自动化测试过程中,手机有时会跳网,怎样保持手机测试的环境稳定性,可以通过adb指令修改android手机hosts,保持手机运行在hosts中配置的环境中: 修改方法如下: 前提条件:已安装andro ...
- sysenter内核入口点代码分析
参考:http://www.mouseos.com/windows/kernel/KiFastCallEntry.html http://www.mouseos.com/windows/kernel/ ...
- Learning OSG programing---osgClip
OSG Clip例程剖析 首先是创建剪切节点的函数代码: osg::ref_ptr<osg::Node> decorate_with_clip_node(const osg::ref_pt ...
- exsi 回收虚拟机磁盘
用客户端登陆服务端,用下面命令停止虚拟机机器 esxcli vm process list 用如下命令关闭一台虚拟机: esxcli vm process kill --type=[soft,h ...