原文:http://www.cnblogs.com/Jessy/p/3525419.html

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 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。常用的Join操作有:内联接、外联接和交叉联接等。如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的数据,这时我们应该考虑使用Join,因为Join操作具有联接表或函数进行查询的特性。多种sql实现,包括oracle和ms sql server都证明了其执行次序是先on后where,即一个带外连接的语句:

select * from a1 a left join a2 b on a.aa=b.cc where b.cc='3'
中,是先执行外连接,再用where 条件筛选。然而毕竟大量数据的连接会耗时较长,在语义允许的情况下,如果想先对某表筛选,再连接,应该如何操作? 可写成如下形式:

select * from a1 a left join (select * from a2 where a2.cc='3') b on a.aa=b.cc;
当然,先where还是先on的结果往往是不同的。这里只是指出如何强制使筛选先发生的方法罢了。

转载于:https://www.cnblogs.com/luyu1993/p/7019490.html

MySql join on 和 where相关推荐

  1. MySQL JOIN原理

    为什么80%的码农都做不了架构师?>>> 最近被公司某一开发问道JOIN了MySQL JOIN的问题,细数之下发下我对MySQL JOIN的理解并不是很深刻,所以也查看了很多文档,最 ...

  2. MySQL join 与where的执行顺序

    MySQL join 与where的执行顺序 -- 写法ok 先过滤后join select * from(select * from u1 where u1.id=3)t join u2 on t. ...

  3. MySQL Join算法与调优白皮书

    转载自 InsideMySQL 公众号,微信公众号不好被搜索引擎收录,所以转载一份备看. 原文地址: https://mp.weixin.qq.com/s/vt7YjxaikJh14pnY2FAWvg ...

  4. 神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程

    问题背景 对于 MySQL 的 JOIN,不知道大家有没有去想过他的执行流程,亦或有没有怀疑过自己的理解(自信满满的自我认为!):如果大家不知道怎么检验,可以试着回答如下的问题 驱动表的选择 MySQ ...

  5. 神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(二)

    开心一刻 一头母牛在吃草,突然一头公牛从远处狂奔而来说:"快跑啊!!楼主来了!" 母牛说:"楼主来了关我屁事啊?" 公牛急忙说:"楼主吹牛逼呀!&qu ...

  6. mysql join union_MySQL中union和join语句使用区别的辨析教程

    union和join是需要联合多张表时常见的关联词,具体概念我就不说了,想知道上网查就行,因为我也记不准确. 先说差别:union对两张表的操作是合并数据条数,等于是纵向的,要求是两张表字段必须是相同 ...

  7. mysql join order by_MySQL 14 慢查询优化join、order by、group by

    1.慢查询的优化思路 1.1优化更需要优化的SQL 优化SQL是有成本的 高并发低消耗的比低并发高消耗影响更大 优化示例 并发形式 优化前 假设优化后 高并发低消耗 每小时10000次,每次20个IO ...

  8. mysql join not in_MySQL 使用左连接替换not in

    众所周知,左连接和右连接的含义是以哪一张表为准. 左连接就是以左表为准,查出的结果中包含左表所有的记录,如果右表中没有与其对应的记录,那么那一行记录中B表部分的内容就全是NULL. 现在有两个表,一个 ...

  9. 浅析Mysql Join语法以及性能优化

    在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧,这里我有个比较简便的记忆方法,内外联结的区别是内联结将去除所有不符合条件的记录,而外联结则 ...

  10. mysql+join+分库分表_MySQL分库分表篇

    传统项⽬结构 数据库性能瓶颈: 1.数据库连接数有限 MySQL数据库默认100个连接.单机最⼤1500连接. 2.表数据量 1)表数量多,成百上千 2)单表数据,千万级别 3)索引,命中率问题,索引 ...

最新文章

  1. mysql语句优化方案(网上流传)
  2. 卷积神经网络迁移学习
  3. 步步为营 .NET三层架构解析 四、Model设计(四种设计方式)
  4. mysql rename table_Mysql: RENAME TABLE IF EXISTS
  5. Java当中 IO(File) 操作 之 递归打印子孙级目录和文件名称
  6. 如何使用Create React App DevOps自动化工作中所有无聊的部分
  7. 轨迹相似性度量方法总结
  8. jquery学习之路jquery之一:jquery选择元素的方法,太神了 2012.8.2
  9. php7如何安装swoole,初学Swoole:PHP7安装Swoole的步骤
  10. 数据结构C++ 栈——栈的应用
  11. PHP 生成带文字图片
  12. Windows蓝屏漏洞(利用多种途径与分析)
  13. oracle根据关键字搜索存储过程
  14. 土豪聪要请客(stol)
  15. 2021年G2电站锅炉司炉最新解析及G2电站锅炉司炉找解析
  16. 最新!使用Python爬取蓝奏云文件下载直链并下载,支持批量爬取,已封装为函数,可直接使用(含注释、库的使用解释)
  17. 基于Python使用ffmpeg批量缩放图片
  18. 计算机网络管理员路由与交换深圳积多少分,深圳积分入户初级证可以 累积加分吗,你需要知道这些!...
  19. c语言之文件操作,C语言之——文件操作模式
  20. 图片合成视频软件(二)软件自动选取时间节点

热门文章

  1. Eclipse下的java工程目录问题和路径问题理解
  2. PostgreSQL 9.5 pg_dump新特性 你是我的眼
  3. scp上传服务器加特殊端口
  4. Java知多少(24)包装类、拆箱和装箱详解
  5. [Link]NoSQL
  6. 一基于Fourinone实现分布式计算上手demo
  7. Web开发中实用小工具
  8. 各种池化操作(包括组合池化)
  9. 编写运行java的步骤,【简答题】编写运行Java程序需要经过哪些主要步骤? (30.0分)...
  10. java 正则 js_正则表达式在js和java中如何使用