文档章节

left join 与where 的区别

冰暝
 冰暝
发布于 2016/06/28 17:08
字数 613
阅读 11
收藏 0
点赞 0
评论 0

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中,返回的结果集是相同的。 就效率而言,要比from+多表 稍高,(可是我实测却是相反的,为啥?难道我测反了?)

本文转载自:http://blog.sina.com.cn/s/blog_4e345ce70101hu3d.html

共有 人打赏支持
冰暝
粉丝 4
博文 84
码字总数 22415
作品 0
程序员
SQL中 join 和 union 总结

Union 将两个结果集的数据做纵向连接,可以直接作为一个新的结果集,需要两个结果集的返回字段一致 分为Union 和 Union All,二者区别如下: Join 将两个结果集做横向连接,作为一个新的数据...

Meet相识_bfa5
03/20
0
0
left join on and 与 left join on where的区别

工作中遇到连表查询问题,用left join on where 结果不是我想要的,跟同事讨论了,被告知left join on and 可以一试,于是找度娘查看其区别如下: 数据库在通过连接两张或多张表来返回记录时...

不肥的小肥羊
2015/12/22
105
0
数据库表与表的关联问题

如果有5张表:table1、table2、table3、table4、table5 table1与table2关联、table2与table3关联、table3与table4关联、table4与table5关联 select 1.xxx,2.xxx,3.xxx,4.xxx,5.xxx from tabl......

wangaowell
2014/04/10
155
2
JOIN关联表中ON,WHERE后面跟条件的区别

SQL中on条件与where条件的区别 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。 在使用left jion时,on和where条件的区别如下: 1、 ...

nibilly
2016/02/26
1K
0
SQL join 之间的区别。

Inner Join , Outer Join(left join, right join), Full Join之间的区别。 有两个表table A ,table B inner join 只返回A与 B 相match的行。 left join 返回左表所有行,右表没有与左表m...

enosh
2014/05/14
0
0
图文并茂详解 SQL JOIN

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

大数据之路
2013/05/31
0
5
ORACLE SQL总结一:集合函数和多表查询

1、集合函数总结 1.1 在select从句中没有使用集合函数的列,就必须出现在group by从句中。即一个列要么在select从句中使用集合函数,要么放在group by从句中。但是注意,出现在group by从句中...

yeyelei
2012/07/15
0
0
SQL中inner join、outer join和cross join的区别

现有两张表,Table A 是左边的表。Table B 是右边的表。其各有四条记录,其中有两条记录name是相同的: 1.INNER JOIN 产生的结果是AB的交集 SELECT FROM TableA INNER JOIN TableB ON TableA...

颓废的幻想者
2016/03/30
41
0
SQL学习精粹之内外连接以及where和on条件的区别

sql内外连接(重点) 在oracle的SQL语句常用的连接有内连接(inner join),外连接(outer join)等,内连接又包括等值连接,非等值连接,自连接;而外连接又分为左连接和右连接全连接。其中...

颖辉小居
2016/10/31
22
0
oracle--left join and 和left join where的区别

开发程序时,经常会遇到left join,inner join的语句,Join是关系型数据库系统的重要操作之一,相对来说速度要快一些,所以大家一般都会优先选择join语句。 但是在做程序时,对于join的一些用...

java梦想家01
2015/08/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

打印斐波那契数

package com.jerry.ch04;public class PrintFibonacci {public static void main(String[] args) {for (int i=0; i<10; i++) {System.out.print(fib(i) + " ");}......

JerryNing
7分钟前
0
0
shell编程

一、shell脚本介绍

人在艹木中
7分钟前
0
0
istio 0.8 遥测 案例

==============遥测===================================== 演示如何从网格中收集遥测信息。 分布式跟踪。如何配置代理以向Zipkin或Jaeger发送跟踪请求 收集度量标准和日志。此任务说明如何配...

xiaomin0322
9分钟前
0
0
ND4J求多元线性回归以及GPU和CPU计算性能对比

上一篇博客《梯度下降法求多元线性回归及Java实现》简单了介绍了梯度下降法,并用Java实现了一个梯度下降法求回归的例子。本篇博客,尝试用dl4j的张量运算库nd4j来实现梯度下降法求多元线性回...

冷血狂魔
11分钟前
0
0
springboot常用注解

@SpringBootApplication: 包含@Configuration、@EnableAutoConfiguration、@ComponentScan 通常用在主类上。 @Service: 用于标注业务层组件。 @RestController: 用于标注控制层组件(如strut...

GoldenVein
17分钟前
1
0
如何进行大数据的入门级学习?

不知道你是计算机专业应届生还是已经从业者。总之,有java基础的学生学习大数据会轻松很多,零基础的小白都需要从java和linux学起。 如果你是一个学习能力特别强,而且自律性也很强的人的话可...

董黎明
30分钟前
0
0
使用Parcelable传递复杂参数

最近做AIDL传递对象,对象必须实现Parcelable的方法才可以被传递。 @Override    public int describeContents() {//这个 默认返回0就行了。        return 0;    }    ...

火云
31分钟前
0
0
十大Intellij IDEA快捷键

Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一些有趣的讨论。每个人都有自己的最爱,想排出个理想的榜单还真是困难。以前也整理过Intellij的快捷键,这次就按照我日常开发...

HJCui
41分钟前
0
0
word 使用mathtype 编写 数学公式

下载安装,这个链接命名。。。。 http://www.mathtype.cn/xiazai.html 安装之后会多出一个选项 使用内联方式插入图表 编写公式的界面 设置支持latex 语法 输入公式回车就可以看到结果...

阿豪boy
今天
0
0
Promise

定义 Promise是异步编程的一种解决方案,所谓Promise就是一个容器,里面保存着某个未来才会结束的事件(通常是一个一步操作)的结果。 特点: 2.1 对象的状态不受外界影响,三种状态pending...

litCabbage
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部