sql(join on 和where的执行顺序)

left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录。

right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录。

inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行。

full join:外连接,返回两个表中的行:left join + right join。

cross join:结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。

关键字: on

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

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

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

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

假设有两张表:

表1:tab2

id size
1 10
2 20
3 30

表2:tab2

size name
10 AAA
20 BBB
20 CCC

两条SQL:
1、select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
2、select * form tab1 left 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中,返回的结果集是相同的。

sql(join on 和where的执行顺序)相关推荐

  1. sql(join on 和where的执行顺序

    left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner join: 内连接,又 ...

  2. SQL语句中各个部分的执行顺序(转)

    原文链接:http://www.tuicool.com/articles/fERNv2 写在前面的话:有时不理解SQL语句各个部分执行顺序,导致理解上出现偏差,或者是书写SQL语句时随心所欲,所以有必 ...

  3. 执行sql语句_SQL查询语句的执行顺序解析

    SQL语句执行顺序 结合上图,整理出如下伪SQL查询语句. 从这个顺序中我们可以发现,所有的查询语句都是从 FROM 开始执行的.在实际执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将 ...

  4. mysql join 循环_关于mysql联表的内嵌循环操作nested loop join中on和where执行顺序问题...

    mysql的理论依据没找到,个人理解是先执行where的过滤条件,先关联再过滤明显做的是无用功. oracle中倒是能在执行计划中看到,先执行的是过滤条件(下面代码中最后一行). explain pl ...

  5. mysql五补充部分:SQL逻辑查询语句执行顺序

    mysql五补充部分:SQL逻辑查询语句执行顺序一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SE ...

  6. MySQL 基础 ———— SQL语句的执行顺序与 LIMIT 子句

    引言 到目前为止,已经总结了常见的SQL子句,包括 SELECT .FROM.JOIN ... ON.WHERE.GROUP BY.HAVING.ORDER BY. 虽然SQL的书写顺序是固定的,但在 ...

  7. join语句的执行顺序

    前言 通常我们写的一个完整的SQL语句都可以拆分成多个子句,子句的执行过程通常会产生虚拟表.什么是虚拟表呢?虚拟表,英文为virtual table,简称为vt.顾名思义,就是实际上并不存在,至少在物 ...

  8. select语句的语法顺序和执行顺序

    目录 1.语法顺序 2.执行顺序 3.优化方法 1.join 方面 2.where 方面 1.语法顺序 select语句的语法格式如下. select 字段列表 from 数据源 [ where条件表 ...

  9. 关于线程的执行顺序,可能真的只是你以为的你以为

    摘要:今天,我们就一起来看看线程到底是如何执行的,它的顺序又是怎样的? 本文分享自华为云社区<线程的执行顺序与你想的不一样!!>,作者:冰 河 . 一.线程的执行顺序是不确定的 调用Thr ...

最新文章

  1. Hadoop实战(6)_搭建Apache Hadoop的Eclipse开发环境
  2. Annovar注释的突变文件转MAF对象
  3. java session 作用范围_ssm项目session使用及其作用域问题
  4. 【工具推荐】Hadoop集群监控工具 HTools
  5. 火焰效果材质实现_利用噪音图制作一个纸张燃烧的效果
  6. Swift - 警告提示框(UIAlertController)的用法
  7. Flask Jinja2 模板中的变量和过滤器
  8. 编写一个可动态注入Spring 容器的工具类
  9. 启动报错 classnofoundexception org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  10. spring,springmvc,mybatis整合ssm框架出现ORA-02289:序列不存在问题
  11. Python 数据处理与分析(五) 设计一个高回报的投资组合(投资回报和风险分析)任务 4:马科维茨的均值-方差组合模型
  12. Windows编程 DirectInput 鼠标和键盘的输入
  13. 模拟退火算法+大规模邻域算法求解大规模固定节点的路径规划问题matlab代码
  14. ThreeJs 学习之旅(七)
  15. HTML实现怀旧小游戏,超级玛丽、飞机大战…等十余款【完整源码分享】
  16. 电感、电容、电阻基本元器件参数选型
  17. linux mtd 用法,Linux mtd与ubi关系详解,ubi使用命令总结
  18. 安卓六大布局之 线性布局(LinearLayout)
  19. 在cordova中处理原生键盘相关问题的总结,mark供参考
  20. 2015链家网面试记录

热门文章

  1. vue element-ui级联选择器选中后下拉框自动收起
  2. 百度地图gif图标_华为手机误删照片怎么找回?手机怎么快速制作GIF动图
  3. 如何禁用计算机的服务,如何彻底禁用电脑中的迅雷服务XLservicePlatform
  4. centos8 挂载ntfs_CentOS 8 挂载NTFS系统磁盘方案
  5. RANSAC算法在图像拼接上的应用的实现
  6. Atitti 大话存储读后感 attilax总结
  7. Discuz! 防御CC攻击的设置办法
  8. 67-Flutter中高德地图插件的使用
  9. 6、Flutter Error waiting for a debug connection: ProcessException: adb did not report f(转)
  10. eclipse 安装 lombok插件