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. 浏览器缓存网站静态文件
  2. matlab数据可视化总结,机器学习----Matlab数据可视化总结(plot篇)
  3. 扩展存储过程在哪里_青浦区智能仓储哪里有,一件代发1.9元全国_1.9元发全国-上海东臻仓储服务...
  4. 计算机书籍-机器学习预测分析
  5. 地铁进出站是一站怎么办_高铁坐过站?别担心,这样能免费送回
  6. javascript 编码规范 用更合理的方式写 javascript
  7. Qt connect信号连接的几种写法
  8. jdk12源代码文件_在JDK 11中启动单文件源代码程序
  9. jupyter notebook python怎么设置_jupyter notebook 的工作空间设置操作
  10. 网管学习日记-三层交换机
  11. 数据加密以及国密基础知识
  12. Axure8.1破解码 注册码 授权码
  13. Linux下使用FDDB 测试MTCNN人脸检测模型生成 ROC 曲线
  14. phpstudy php56 zend,phpstudy集成环境
  15. 1147 Heaps (30分)
  16. 【贪玩巴斯】数字图像处理基础课堂笔记(四)——「Matlab中的代码优化问题、meshgrid函数和交互式I/O」 2021-10-11
  17. 苹果怎么安装未签名的app_Windows端超简单安装未签名ipa应用
  18. c#关于GMap离线地图加载的问题
  19. Oracle默认内置账户介绍,SYS与SYSTEM两个账户的区别
  20. mac连接iphone闪断解决办法

热门文章

  1. 第二十六期:100 个网络基础知识普及,看完成半个网络高手
  2. 45请求转发和请求重定向区别
  3. java学习(151):字节输出流
  4. 实例2:python
  5. enter power save mode解决
  6. css3修改input[type=radio]样式
  7. 编写高效的PyTorch代码技巧(下)
  8. python 模块学习--Numpy
  9. 测试nb信号的软件_NB-IOT的OTA测试(功率、灵敏度测试)
  10. shell语法 06-Linux文本处理-grep