当前位置: 首页 > news >正文

JOIN 和 WHERE?简单的问题也有学问。

今天在写SQL语句时,忽然想了解下 JOIN 和 WHERE 之间的顺序。简单的说,到底是先关联出数据再筛选,还是先筛选数据再关联。

理论上来说,应该是 先 JOIN 出数据然后再 WHERE。忍不住到发帖询问了下,牛人给出了精辟的答案,不敢苟藏:

 

 

/*

标题:SQL中on条件与where条件的区别

作者:爱新觉罗·毓华

时间:2008-07-14

地点:新疆乌鲁木齐

*/

 

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

在使用left jion时,on和where条件的区别如下:

 

1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

 

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

 

假设有两张表:

 

表1:tab1

id size

1  10

2  20

3  30

表2:tab2

size name

10  AAA

20  BBB

20  CCC

 

两条SQL:

1、select * from tab1left join tab2 on tab1.size = tab2.size where tab2.name='AAA'

2、select * from tab1left join tab2 on tab1.size = tab2.size and tab2.name='AAA'

 

第一条SQL的过程:

1、中间表

on条件:

tab1.size = tab2.size

tab1.id tab1.size tab2.size tab2.name

1 10 10 AAA

2 20 20 BBB

2 20 20 CCC

3 30 (null) (null)

2、再对中间表过滤

where 条件:

tab2.name='AAA'

tab1.id tab1.size tab2.size tab2.name

1 10 10 AAA

 

第二条SQL的过程:

1、中间表

on条件:

tab1.size = tab2.size and tab2.name='AAA'

(条件不为真也会返回左表中的记录)tab1.id tab1.size tab2.size tab2.name

1 10 10 AAA

2 20 (null) (null)

3 30 (null) (null)

 

其实以上结果的关键原因就是left join,right join,full join的特殊性,

不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。

而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

转载于:https://www.cnblogs.com/sofire/archive/2010/12/30/1921524.html

相关文章:

  • 图像替换技术
  • WCF 第四章 绑定 创建一个自定义绑定
  • 健康小常识
  • 似水流年 ? Chrome调试大全
  • 关于gulp复制文件时把整个目录结构都复制的问题解决
  • java 求集合真子集_高中数学第2讲:子集与并集
  • 网线传输速度测试_如何鉴定网线好坏?怎样测网线电阻?
  • 展示 用户画像_智能时代如何做好精准营销?从用户画像智能化开始
  • centos 一键安装ftp 配置_CentOS6一键安装vsftp脚本
  • ribbon基于接口配置超时_feign的ribbon超时配置和hystrix的超时配置说明
  • 怎么把好几行弄成一行_怎么在word文档里把很多行一下合并成一行
  • controller不跳转页面的几个原因_为什么很多人30岁了,还不结婚,有这几个原因...
  • clob存base64文件存不进去_cephfs:文件的扩展属性xattr
  • 山地车中轴进水表现_求山地自行车各部位上油的方法。特别是中轴和花鼓
  • matlab建立ar时间序列模型_请教matlab下建立AR模型的问题(附代码)
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • Apache的基本使用
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • E-HPC支持多队列管理和自动伸缩
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Vue.js源码(2):初探List Rendering
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • webpack4 一点通
  • win10下安装mysql5.7
  • 那些被忽略的 JavaScript 数组方法细节
  • 排序(1):冒泡排序
  • 使用 Docker 部署 Spring Boot项目
  • 使用API自动生成工具优化前端工作流
  • 写代码的正确姿势
  •  一套莫尔斯电报听写、翻译系统
  • 自定义函数
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • #控制台大学课堂点名问题_课堂随机点名
  • (9)STL算法之逆转旋转
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Java)【深基9.例1】选举学生会
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (剑指Offer)面试题34:丑数
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET实现之(自动更新)
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [AAuto]给百宝箱增加娱乐功能
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [IE6 only]关于Flash/Flex,返回数据产生流错误Error #2032的解决方式
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
  • [leetcode] 103. 二叉树的锯齿形层次遍历