多表关联是ON和WHERE的区别

很多时候,开发在书写SQL的时候不能正确的理解和运用ON和WHERE的区别。今天就简单演示介绍下(有图有真相)。

原理:数据库在通过连接多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。

实验:

表test1 记录                                                表test2记录

结论:

在使用 LEFT JOIN 时,ON和 WHERE 的使用是有区别的。

ON 条件是在生成临时表时使用的条件,它不管ON 中的条件是否为真,都会返回左边表的记录;WHERE条件是在临时表生成好后,在对临时表记录进行二次过滤的条件。这时已经没有LFET JOIN的含义(必须返回左边表的记录),他的这个WHERE条件是应用到生成的中间临时表的。条件不为真的就全部过滤掉。

备注 :为了更好的区别ON和WHERE, 我们可以使用括号更好的理解SQL执行的步骤。如截图上面右边展示。

引申 : ON和WHERE 区别使用的范围

为什么会产生上面不同记录的原因。关键原因是 LEFT JOIN ,RIGHT JOIN ,FULL JOIN 的特殊性。不管ON 上的条件是否为真都会返回LEFT 或 RIGHT 表中的记录。FULL则具有LFET 和RIGHT特性的并集 。但是 INNER JOIN 就没有这个特殊性。条件放在ON和where中,返回的结果集是相同的

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java成神之路

Oracle学习笔记_01_SQL初步

   DML: Data Manipulation Language        数据操纵语言 DDL: Data Definition Languag...

793
来自专栏PingCAP的专栏

TiDB 源码阅读系列文章(十六)INSERT 语句详解

在之前的一篇文章 《TiDB 源码阅读系列文章(四)INSERT 语句概览》 中,我们已经介绍了 INSERT 语句的大体流程。为什么需要为 INSERT 单独...

1303
来自专栏JAVA后端开发

通用数据级别权限的框架设计与实现(2)-数据权限的准备工作

查看上篇文章通用数据级别权限的框架设计(1)-相关业务场景的分析",我们要继续做一些准备工作。

1264
来自专栏高性能服务器开发

数据库进阶3 Mysql 性能优化20个原则(1)

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事...

991
来自专栏java一日一条

一次非常有意思的SQL优化经历

发现没有用到索引,type全是ALL,那么首先想到的就是建立一个索引,建立索引的字段当然是在where条件的字段。

771
来自专栏程序猿

MySQL优化方案(一)优化SQL脚本与索引

MySQL的优化方案有哪一些? 本文记录MySQL优化方案 ,梗概如下: 优化SQL 优化索引 (一)优化SQL 1、通过MySQL自有的优化语句 优化SQL语...

4407
来自专栏别先生

MySql的基本操作以及以后开发经常使用的常用指令

第一章:数据类型和操作数据表 MySQL语句的规范 (1):关键字与函数名称全部大写 (2):数据库名称,表名称,字段名称全部小写 (3):SQL语句必须以分号...

19310
来自专栏java 成神之路

聚簇索引和二级索引

3814
来自专栏Vamei实验室

Python标准库14 数据库 (sqlite3)

Python自带一个轻量级的关系型数据库SQLite。这一数据库使用SQL语言。SQLite作为后端数据库,可以搭配Python建网站,或者制作有数据存储需求的...

2139
来自专栏hbbliyong

SQL SERVER 原来还可以这样玩 FOR XML PATH

FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活...

2717

扫码关注云+社区

领取腾讯云代金券