文档章节

SQL语法:在join关联时,on和where的顺序和区别

夜雪连城785
 夜雪连城785
发布于 2016/10/14 16:46
字数 910
阅读 244
收藏 1

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

 在使用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中,返回的结果集是相同的。

      对于JOIN参与的表的关联操作,如果需要不满足连接条件的行也在我们的查询范围内的话,我们就必需把连接条件放在ON后面,而不能放在WHERE后面,如果我们把连接条件放在了WHERE后面,那么所有的LEFT,RIGHT,等这些操作将不起任何作用,对于这种情况,它的效果就完全等同于INNER连接。对于那些不影响选择行的条件,放在ON或者WHERE后面就可以。

记住:

  ON条件是在生成关联中间表过程中起到筛选作用,WHERE条件是对生成后的中间表进行筛选。

   所有的连接条件都必需要放在ON后面,,不然前面的所有LEFT,和RIGHT关联将作为摆设,而不起任何作用。对于子表(被关联的表)的一些状态字段(如状态字段,有效性字段等)酌情考虑是否放在on条件后面,两种情况考虑:①不可以放在on条件里面:在on条件中加入子表独有的字段条件,有可能使得在生成中间表过程中出现只有主表,子表字段全是NULL的情况。此时,如果where语句中含有对子表字段的判断条件,由于中间表中子表的字段已经全是NULL了,且where操作的是生成后的中间表整体,加任何对子表段的判断条件最后查询的结果都是空(where 子表字段a  is null 除外)。②可以放在on条件里面:除了①提到的情况,把子表特有字段放在on条件后面,可以减少中间表关联次数,即缩小中间表结果集,从而提高查询效率。

 

本文转载自:

夜雪连城785
粉丝 1
博文 2
码字总数 0
作品 0
青岛
私信 提问
简单十步让你全面理解SQL

很多程序员认为SQL是一头难以驯服的野兽。它是为数不多的声明性语言之一,也正因为这样,其展示了完全不同于其他表现形式、命令式语言、面向对象语言甚至函数式编程语言(虽然有些人觉得SQL...

首席安全砖家
2013/12/24
6.3K
19
Mysql索引分析

这里主要利用explain来观察语句是否走索引。 explain语法自行百度,详见Mysql官方文档。 一、explain输出格式说明 具体说明: 1) id 该字段标识select语句id,若SQL中只有1个select语句(即使...

阿阿阿阿阿局
2016/07/28
26
0
第 37 期:JOIN 延伸 – 维度查询语法

有了维度定义后,我们就可以来梳理前面讲过的简化 JOIN 语法了。 先定义字段维度: 维度字段的维度为其本身; 外键字段的维度为相应外键表中关联字段的维度; 测度字段没有维度; 这是个递归...

润乾软件
2018/10/22
0
0
SQL Server中CROSS APPLY和OUTER APPLY应用

SQL Server中CROSS APPLY和OUTER APPLY应用 1.什么是Cross Apply和Outer Apply ? 我们知道SQL Server 2000中有Cross Join用于交叉联接的。实际上增加Cross Apply和Outer Apply是用于交叉联接...

技术mix呢
2017/10/04
0
0
图文并茂详解 SQL JOIN

Join是关系型数据库系统的重要操作之一,一般关系型数据库中包含的常用Join:内联接、外联接和交叉联接等。如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的数据,这...

大数据之路
2013/05/31
0
5

没有更多内容

加载失败,请刷新页面

加载更多

在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
2
0
高德API入门教程

项目需求 1、实现打开地图就能定位到中心显示标注点 2、点击标注显示保利可爱岛的详细信息 3、实现导航功能 <!doctype html><html><head> <meta charset="utf-8"> <meta http-......

我叫小糖主
昨天
7
0
聊聊Elasticsearch的MonitorService

序 本文主要研究一下Elasticsearch的MonitorService MonitorService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/monitor/MonitorService.java public class MonitorServic......

go4it
昨天
3
0
二、Docker

1、Docker - The TLDR(Too Long,Don't Read,Linxu 终端工具 ) Docker是在Linux和Windows上运行的软件。它创建、管理和编排容器。该软件以开源方式开发,在Github上作为Moby开源项目的一部分。...

倪伟伟
昨天
3
0
Python猫荐书系列之七:Python入门书籍有哪些?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/ArN-6mLPzPT8Zoq0Na_tsg 最近,猫哥的 Python 技术学习群里进来了几位比较特殊的同学:一...

豌豆花下猫
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部