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) 那里 ...
随机推荐
- iframe标签在PC端的使用
随着前端框架的崛起 各种组件化 模块化开发 然而我发现在PC端要考虑兼容 ~~~~ 自己琢磨着 在PC端怎么吧一个页面做成一个公共的部分 发现有个iframe标签可以在页面中嵌套 虽然iframe可 ...
- 洛谷 P1855 榨取kkksc03 题解
P1855 榨取kkksc03 题目描述 洛谷2的团队功能是其他任何oj和工具难以达到的.借助洛谷强大的服务器资源,任何学校都可以在洛谷上零成本的搭建oj并高效率的完成训练计划. 为什么说是搭建oj呢 ...
- codevs 1729 单词查找树
二次联通门 : codevs 1729 单词查找树 /* codevs 1729 单词查找树 Trie树 统计节点个数 建一棵Trie树 插入单词时每新开一个节点就计数器加1 */ #include ...
- 《挑战30天C++入门极限》C++中利用构造函数与无名对象简化运算符重载函数
C++中利用构造函数与无名对象简化运算符重载函数 在完整描述思想之前,我们先看一下如下的例子,这个例子中的加运算符重载是以非成员函数的方式出现的: //程序作者:管宁 //站点:www.cn ...
- idea使用/***/单行注释格式化后会显示多行,如何能保持单行显示
- CF891C Envy(离线/在线+可撤销并查集/并查集/LCT)
前置知识 最小生成树及证明 做法 每个不同权值没影响,仅需判断该次询问每种权值是否在"小于该权值的所有边加完"之后,可以全部加进来 离线:询问的所有边全堆到一起,按权值排序,然后同 ...
- MySQL事务(脏读、不可重复读、幻读)
1. 什么是事务? 是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作:这些操作作为一个整体一起向系统提交,要么都执行.要么都不执行:事务是一组不可再分割的操作集合(工作逻辑单元): ...
- nginx压力测试和并发预估
一.Nginx并发预估 预估算法:{(?G)*1024-system}/请求大小 (?G):表示内存大小1024:表示内存容量标准进制system:表示系统和服务占用的额外内存和需要预留的内存请求大小 ...
- Prometheus基础(二)
1.什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB).Prometheus使用Go语言开发,是Google BorgMon监控 ...
- CentOs7设置主机名称,以及主机名称和ip的对应关系
一.修改主机名称 在CentOS7中有三种定义的主机名:静态的(static).瞬态的(transient).和灵活的(pretty).静态主机名也称为内核主机名,是系统在启动时从/etc/hostn ...