MySQL的join on和 where 的执行顺序和区别,以及各种连接说明
目录
1、各种连接的解读说明:
1.1、各种连接的含义和说明
| 连接 | 语法 | 作用 |
|---|---|---|
| 左外连接 | left join | 返回左表中所有的记录以及右表中连接字段相等的记录 |
| 右外连接 | right join | 返回右表中所有的记录以及左表中连接字段相等的记录。 |
| 全外连接 | full join | 返回两个表中的行:left join + right join(重合部分的相等数据只保留一份) |
| 自连接 | ||
| 笛卡尔积 | cross join(不带 WHERE 子句) | 结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。 |
| 内连接 | inner join | 又叫等值连接,只返回两个表中连接字段相等的行。 |
| 自然连接 | natrual join | 和内连接很类似,区别在于结果的重复列上: 自然连接重复列只保存一列(列去重),内连接重复列都保存(列不去重) |
1.1.1 所有连接分类
说明:
- 等值连接和不等连接的区别:都是内连接,等值连接有on条件,不等连接没有on条件

1.1.2 left join 和 left outer join 区别
简单来说就是没有区别,只是写法不同。( sql-92 标准中应为 LEFT Outer Join,而 SQLServer 中两种都支持的。 )
参考: 请说明 left join 和 left outer join 的区别 - CSDN 论坛
1.2、神图参考

1.4、一些参考说明
- 基本概念理解参考: 数据库的连接(内连接,外连接,笛卡尔积) - goasleep 的博客 - CSDN 博客
- 关于自然连接的去重可以参考: 笛卡尔积,自然连接,外连接 - 白小羊的博客 - CSDN 博客
- 概念区分参考: 【概念区分】笛卡尔积,自然连接,内连接,外连接 (左,右,全) - lawrence.li - 博客园
很好的一篇文章,解决列很多问题。- 笛卡尔积存在的意义是什么?
- ”cross join 笛卡尔积 “和” full join 全连接 “和 "inner join 内连接" 的区别在哪里?
- 既然” 连接条件 “可以写在 where 字句里面,为什么还要用 on 关键字?
- 自然连接和内连接有什么关系吗?
2、on 和 where 条件的区别
2.1 on 和 where 条件的区别 (只对外连接有区别)
前提说明:数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
- on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
- where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
即
- 如果条件中同时有on和where 条件:
- SQL的执行实际是两步
- 第一步:根据on条件得到一个临时表
- 第二步:根据where 条件对上一步的临时表进行过滤,得到最终返回结果。
- SQL的执行实际是两步
- 如果条件中只有on:
- 那么得到的临时表就是最终返回结果
主要内容来自: sql (join on 和 where 的执行顺序) - higirle - 博客园 ,具体demo也可以看原文。
2.2 具体连接的区别
2.2.1 对于内连接没区别
因为内连接生成的临时表中只会保留符合on条件的数据,所以数据在 on 和 where 条件中过滤没区别。
2.2.2 对于外连接(左连接,右连接,全连接)有区别
而外连接生成的临时表中会保留不符合on条件的数据,对于这些数据,在 on 和 where 条件中过滤就区别了。
2.3 多张(>=3)表连接更显 on 和 where 条件的区别
sql 语句中 join on 和 where 用法的区别和联系 - 一个破名想半年的个人空间 - OSCHINA
注:文中的一个观点和说明很神奇。
总结下:如果是多张表连接,那么在生成临时表的过程中过滤数据和对生成后的临时表过滤数据就有明显区别了。
这种情况下: inner join on 比直接 where 的查询效率要高
3、结束
MySQL的join on和 where 的执行顺序和区别,以及各种连接说明的更多相关文章
- 【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)
[分析]浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang) 今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间 ...
- 拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别
一.引言 本来想记录一下关于用户登陆和登陆之后的权限管理.菜单管理的问题,想到解决这个问题用到Interceptor,但想到了Interceptor,就想到了Filter,于是就想说一下它们的执行顺序 ...
- MySQL逻辑架构、SQL加载执行顺序、七种JOIN模式图解
逻辑架构 存储引擎 查看当前安装的mysql提供的存储引擎 查看当前mysql默认的存储引擎 MyISAM和InnoDB SQL加载执行顺序 sql书写顺序 mysql解析器执行的顺序 考点:m ...
- 转载《mysql 一》:mysql的select查询语句内在逻辑执行顺序
原文:http://www.jellythink.com/archives/924 我的抱怨 我一个搞应用开发的,非要会数据库,这不是专门的数据库开发人员干的事么?话说,小公司也没有数 据库开发人员这 ...
- MySQL中 ORDER BY 与 LIMIT 的执行顺序
如下: ORDER BY 与 LIMIT 的执行顺序:ORDER BY > LIMIT ORDER BY 与 LIMIT 的编写顺序:ORDER BY > LIMIT 正确写法: sele ...
- Mysql补充部分:SQL逻辑查询语句执行顺序
一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOI ...
- 带Left Join的SQL语句的执行顺序
基础的SQL执行顺序 SQL语句执行的时候是有一定顺序的.理解这个顺序对SQL的使用和学习有很大的帮助. 1.from 先选择一个表,或者说源头,构成一个结果集. 2.where 然后用where对结 ...
- MySQL中 order by 与 limit 的执行顺序以及使用实例
在 MySQL 执行查询的时候,我们可能既要对结果集进行排序又要限制行数,那么此时 order by 与 limit 的执行顺序是怎么样的呢? order by与limit的执行顺序是:先执行orde ...
- MySQL left join操作中 on与where放置条件的区别
优先级 两者放置相同条件,之所以可能会导致结果集不同,就是因为优先级.on的优先级是高于where的. 1 1 首先明确两个概念: LEFT JOIN 关键字会从左表 (table_name1) 那里 ...
随机推荐
- codevs 4014EZ系列
4014 EZ系列之丁畅大大打小怪兽 题目描述 Description 丁畅大大除了喜欢吃鸡腿和番茄炒鸡蛋,还喜欢变成奥特曼去打小怪兽. 有一天,他遇到了迪迦!!!!!!!!!!!!!!!!!!! ...
- luogu P1160 队列安排
二次联通门 :luogu P1160 队列安排 /* luogu P1160 队列安排 链表 手动模拟一下就好了... */ #include <cstdio> #define Max 5 ...
- 数组思维 -- join的一些用法感悟
组合字符串的时候, 组合 sql 的时候, 使用join 会非常有用, join and 记得前端时间去看面试题的时候, 总会出一个小的性能题目, 就是 如果有大量的字符串处理的时候, 怎么 ...
- STP生成树算法
生成树算法第一:决定谁是“根网桥”对比各个网桥ID,先对比ID中的优先级,优先级相同的时候对比网桥MAC地址,对比依据是谁的值最小,谁是“根网桥” 第二:决定哪些是“根端口”窍门——每个非根网桥上都有 ...
- (大型网站之Nginx)图解正向代理、反向代理、透明代理
一.正向代理(Forward Proxy) 一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术.关于正向代理的概念如下: 正向代理(forward)是一个位于客户端[用户A]和原始服务器(o ...
- Java设计模式之二工厂模式
在上一篇中我们学习了单例模式,介绍了单例模式创建的几种方法以及最优的方法.本篇则介绍设计模式中的工厂模式,主要分为简单工厂模式.工厂方法和抽象工厂模式. 简单工厂模式 简单工厂模式是属于创建型模式,又 ...
- 去掉iframe周围的空白
今天,在处理一个网页样式时,遇到了一小问题,就是调用的iframe四周出现了空白. iframe调用的代码如下: 示例: <iframe src="http://www.xxx.c ...
- 关于解决'\u'开头的字符串转中文的方法
如果字符串是”\u70ed\u95e8\u94ed\u6587\u63a8\u8350”这种形式的字符串: python3的解决办法:字符串.encode(‘utf-8’).decode(‘unico ...
- Java RMI实践
Java远程方法调用,即Java RMI(Java Remote Method Invocation).一种用于实现远程过程调用的应用程序编程接口.客户机上运行的程序可以调用服务器上的对象. 缺点:只 ...
- keepalived vip removed with dhcp renewal【原创】
最近发现公司云平台服务器的vip有丢失的现象,查看keepalived日志 Jun :: lb1 dhclient: DHCPREQUEST of (xid=0x6deab016) Jun :: lb ...