sql连接查询语句中on、where筛选的区别总结
转自: 陈宏鸿 的《sql连接查询语句中on、where筛选的区别总结》
原址:https://www.jb51.net/article/118258.htm
前言
相信对于每位程序员来说,sql查询这个东西, 要说它简单, 可以很简单, 通常情况下只需使用增删查改配合编程语言的逻辑表达能力,就能实现所有功能。 但是增删查改并不能代表sql语句的所有, 完整的sql功能会另人望而生畏。 就拿比普通增删查改稍微复杂一个层次的连接查询来说, 盲目使用, 也会出现意料之外的危险结果,导致程序出现莫名其妙的BUG。
在连接查询语法中,另人迷惑首当其冲的就要属on筛选和where筛选的区别了, 在我们编写查询的时候, 筛选条件的放置不管是在on后面还是where后面, 查出来的结果总是一样的, 既然如此,那为什么还要多此一举的让sql查询支持两种筛选器呢? 事实上, 这两种筛选器是存在差别的,只是如果不深挖不容易发现而已。
sql中的连接查询分为3种, cross join,inner join,和outer join , 在 cross join和inner join中,筛选条件放在on后面还是where后面是没区别的,极端一点,在编写这两种连接查询的时候,只用on不使用where也没有什么问题。因此,on筛选和where筛选的差别只是针对outer join,也就是平时最常使用的left join和right join。
下面话不多说,来一起看看详细的介绍:
来看一个示例,有两张数据表,结构和数据如图所示
表main
表ext
可以把这两张表看作是用来存放用户信息的, main放置主要信息,ext表放置附加信息,两张表的关系是1对1的,以id字符作为对应关系键。现在我们需要将地址不为杭州的所有用户信息筛选出来,结果中需要包含main表和ext表的所有字段数据。
1 |
|
闭上眼睛, 请用大脑人肉运行一下这段SQL, 想象一下是什么结果。
当把address <> '杭州'
这个筛选条件放在on之后,查询得到的结果似乎跟我们预料中的不同,从结果中能看出,这个筛选条件好像只过滤掉了ext表中对应的记录,而main表中的记录并没有被过滤掉,也就是上图中标记为红色的那条记录。outer join
相对于inner join
的一个主要特性就是以一侧的表为基础,但是在这里以左表为基这一点却可以无视筛选条件,这未免也太霸道了一些。
把查询语句稍微改动一下,将地址的筛选条件从on转移至where
?
1 |
|
结果就如我们预期的那样了
造成这种结果上的差异要从outer join
查询的逻辑查询的各个阶段说起。
总的来说,outer join 的执行过程分为4步
1、先对两个表执行交叉连接(笛卡尔积)
2、应用on筛选器
3、添加外部行
4、应用where筛选器
就拿上面不使用where筛选器的sql来说,执行的整个详细过程如下
第一步,对两个表执行交叉连接,结果如下,这一步会产生36条记录(此图显示不全)
第二步,应用on筛选器。筛选器中有两个条件,main.id = ext.id and address<> '杭州'
,符合要求的记录如下
这似乎正是我们期望中查询的结果,然而在接下来的步骤中这个结果会被打乱
第三步,添加外部行。outer join
有一个特点就是以一侧的表为基,假如另一侧的表没有符合on筛选条件的记录,则以null替代。在这次的查询中,这一步的作用就是将那条原本应该被过滤掉的记录给添加了回来
是不是不种画蛇添足的感觉, 结果就成了这样
第四步,应用where筛选器
在这条问题sql中,因为没有where筛选器,所以上一步的结果就是最终的结果了。
而对于那条地址筛选在where条件中的sql,这一步便起到了作用,将所有地址不属于杭州的记录筛选了出来
通过上面的讲解,已经能反应出在outer join
中的筛选条件在on中和where中的区别,开发人员如能详细了解之中差别,能规避很多在编写sql过程中出现的莫名其妙的错误。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
sql连接查询语句中on、where筛选的区别总结相关推荐
- mysql sql 连接查询语句_Mysql——sql数据库中的连接查询
1.1.1 交叉连接(CROSS JOIN) 交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的. ...
- 如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集
如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?(2006-12-14 09:25:36) 与这个问题具有相同性质的其他描述还包括: 如 ...
- mysql五补充部分:SQL逻辑查询语句执行顺序
mysql五补充部分:SQL逻辑查询语句执行顺序一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SE ...
- Oracle 10g数据库基础之基本查询语句-中-函数
Oracle 10g数据库基础之基本查询语句-中-函数 --资料参考:张烈 张建中<数据库管理员培训讲义> 函数: 使用函数的目的是为了操作数据 将输入的变量处理,返回一个结果. 变量可以 ...
- MySQL学习记录 (二) ----- SQL数据查询语句(DQL)
相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...
- oracle只查询0点数据,Oracle 10g数据库基础之基本查询语句-中-函数
Oracle 10g数据库基础之基本查询语句-中-函数 --资料参考:张烈 张建中<数据库管理员培训讲义> 函数: 使用函数的目的是为了操作数据 将输入的变量处理,返回一个结果. 变量可以 ...
- mysql基础10(SQL逻辑查询语句执行顺序)
SQL语句定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <rig ...
- 查询语句中select from where group by having order by的执行顺序
查询语句中select from where group by having order by的执行顺序 1.查询中用到的关键词主要包含六个,并且他们的顺序依次为 select--from--whe ...
- SQL Server 查询处理中的各个阶段
SQL Server 查询处理中的各个阶段 SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管 ...
- SQL 基本查询语句
这篇博客主要介绍SQl基本查询语句 下面是查询基于的表 Student表 SC表 Course表 下面是具体的代码 1.创建表CREATE TABLE Student( //创建学生表 Sno CHA ...
最新文章
- 安装 Fedora 21 工作站后要做的10件事情
- [转]web标准的几个误区
- kubernetes认证,对接第三方认证系统,对接github认证
- rabbitmq连接java快速入门
- 管理集群中的 crs 管理员
- 如何下载一个物种的全部EST序列 | NCBI | 表达序列标签
- 机器学习(三十)——Model-Free Control
- c语言链表代码大全,C语言实现链表
- React Native通信机制详解
- Spring 环境与profile(一)——超简用例
- HOW TO:构造Java类
- 自定义双向线性插值滤子(卷积核)code
- .Net读取Excel(包括Excel2007)
- 一幅图告诉你C-C++注释转换有多简单
- 【Demo】文件下载操作(console版和web版)
- viper4android脉冲样本,v4a脉冲反馈样本官方版
- 微信订阅消息模板消息推送-JAVA
- FPGA 视频处理 FIFO 的典型应用
- Oracle 大表数据删除/清理方法小结
- ROS入门跟着我就够了(一)ROS概述与环境搭建
热门文章
- Excel百“练“成钢,从题库随机抽取题目 V 2.0版本
- Lvgl(V8.2)自定义字体实现多国语言切换功能
- 【eclipse安装】安装包中-win32-x86_64的意思
- matlab 二维矩形函数,rect矩形函数 matlab中怎样编写矩形函数
- MVCC(多版本并发控制)原理
- win10安装jdk
- 硬盘坏了怎么修复 教你如何修复硬盘坏道
- 三菱plc pwm指令_【三菱PLC指令教程】定时器指令应用之时序图编程法(一)
- CATIA V6二次开发——宏应用
- python查内置函数,怎么查看python内置函数