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) 那里 ...
随机推荐
- cube.js 学习(二)cube.js与 graphql2chartjs的比较
cube.js 是目前看到从设计以及理念上很不错的数据分析事件,graphql2chartjs 是hasura graphql-engine 团队开发 的一个类库基于graphql,以下做一些比较 c ...
- docker使用(一)
windows家庭版 安装docker 查看原文地址(侵删,这里只是保存一用 doceker和vmware发生冲突时 运行下面命令并重启电脑: bcdedit /set hypervisorlaunc ...
- 课标2-2-1-3 :MMU配置与使用
void create_page_table(void){ unsigned long *ttb = (unsigned long *)0x20000000; unsigned long vaddr, ...
- 《挑战30天C++入门极限》C++的iostream标准库介绍(3)
C++的iostream标准库介绍(3) C语言提供了格式化输入输出的方法,C++也同样,但是C++的控制符使用起来更为简单方便,在c++下有两中方法控制格式化输入输出. 1.有流对象的成员函 ...
- UML图规范
1.子类与父类的继承关系用空心三角形+实线表示. 2.类实现接口用空心三角形+虚线表示.(实现关系) 3.类与类之间的关系用实线箭头表示.(关联关系) 关联关系还可细分为三类:单项关联(下图).双 ...
- Bootstrap select多选下拉框实现代码
前言 项目中要实现多选,就想到用插件,选择了bootstrap-select. 附上官网api链接,http://silviomoreto.github.io/bootstrap-select/. 没 ...
- 常用spaceclaim脚本(二)
#创建一个草图 #第一个参数传入一个Frame对象 #通过一个点和两个向量创建Frame #Frame的类成员函数Create被重载 #重载函数1:Frame.Create(Point, Direct ...
- PLSQL命令行创建用户 以及 JDBC简单操作
目录 PLSQL Developer命令行创建用户以及表 课堂要点 JDBC 主外键约束 踩坑之路 设置ORACLE_HOME环境变量 PLSQL Developer命令行创建用户以及表 打开Co ...
- win10 eclipse连接虚拟机ubuntu中的hdfs
1.eclipse安装连接hadoop的插件hadoop-eclipse-plugin-2.6.0(注意自己hadoop的版本) 将该插件放在eclipse安装路径的plugins文件夹中. ps:我 ...
- Android 开发常用工具合集
在 Android 开发中经常使用到的小功能,用于记录开发的那些事^_^ 1. 获取 release 和 debug 版本的 SHA1 public static String getSHA1(Con ...