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

时间: 2024-10-10 15:07:05

sql(join中on与where区别)的相关文章

SQL文摘:sql(join中on与where区别)

原文地址:https://www.cnblogs.com/wlzhang/p/4532587.html left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行. full join:外连接,返回两个表中的行:left join + right join. cross join:结果是笛卡尔积,就是第一个表的行数

SQL点滴31—SQL语句中@@IDENTITY和@@ROWCOUNT区别

原文:SQL点滴31-SQL语句中@@IDENTITY和@@ROWCOUNT区别 SQL语句中@@IDENTITY和@@ROWCOUNT区别 在一条 INSERT.SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的最后一个标识值. 如果语句未影响任何包含标识列的表,则 @@IDENTITY 返回 NULL. 如果插入了多个行,生成了多个标识值,则 @@IDENTITY 将返回最后生成的标识值. 如果语句触发了一个或多个触发器,该触发器又执行了生成标识值的插入操

SQL JOIN 中 on 与 where 的区别

left join : 左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join : 右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner join : 内连接,又叫等值连接,只返回两个表中连接字段相等的行. full join : 外连接,返回两个表中的行:left join + right join. cross join : 结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数. 关键字 on 数据库在通过连接两张或多张表来返回记录时,都会生成一张

SQL语句Left join 中On和Where的用法区别

SQL语句如下: SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.id = 表2.id AND 表2.Name != 'ff'WHERE 表1.NAME != 'aa' 步骤1:返回笛卡尔积(SELECT * FROM 表1 CROSS JOIN 表2) 步骤2:应用ON筛选器(当前的条件为  表1.id = 表2.id AND 表2.Name != 'ff') 步骤3:添加外部行 这一步只对OUTER JOIN起作用,如果是LEFT JOIN会以左边的表为保留表,如果是

SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别

前言: 今天主要的内容是要讲解SQL中关于Join.Inner Join.Left Join.Right Join.Full Join.On. Where区别和用法,不用我说其实前面的这些基本SQL语法各位攻城狮基本上都用过.但是往往我们可能用的比较多的也就是左右连接和内连接了,而且对于许多初学者而言不知道什么时候该用哪种语法进行查询,并且对于左右,或者内连接查询的时候关于ON 和Where 的作用也是模糊不清的,说不出其中的一个大概的差别,因此接下来请容我把它们好好描述一遍. 数据库(MS S

sql语句中left join、inner join中的on与where的区别

table a(id, type): id type ---------------------------------- 1 1 2 1 3 2 table b(id, class): id class --------------------------------- 1 1 2 2 sql语句1:select a.*, b.* from a left join b on a.id = b.id and a.type = 1; sql语句2:select a.*, b.* from a le

解析sql语句中left_join、inner_join中的on与where的区别

以下是对在sql语句中left_join.inner_join中的on与where的区别进行了详细的分析介绍,需要的朋友可以参考下 table a(id, type):id     type ----------------------------------1      1         2      1          3      2          table b(id, class):id    class ---------------------------------1  

sql join 与where的区别

在公司里帮新人检查问题时发现,发现有人写的SQL不习惯用join语句,看着写的挺简单,但是数据量多了执行起来会很慢. 仔细看,经常会在一个SQL查询中的from中写多个表,例如:select a.a1,a.a2,b.b1,b.b2 from a,b where a.a3=b.b3,其中a,b是表,a1.a2.a3.b1.b2.b3是a表和b表的列. 看上去怪怪的,但是具体为什么执行效率慢又讲不出个所以然来,下面的内容是转的别人的,学习下理论知识,整理下思路. [转]今天在分析一个sql语句的时候

转:SQL数据库中临时表、临时变量和WITH AS关键词创建“临时表”的区别

原文链接:https://www.cnblogs.com/zhaowei303/articles/4204805.html SQL数据库中数据处理时,有时候需要建立临时表,将查询后的结果集放到临时表中,然后在针对这个数据进行操作. 创建"临时表"(逻辑上的临时表,可能不一定是数据库的)的方法有一下几种: 1.with tempTableName as方法(05之后出现): with temptable as 其实并没有建立临时表,只是子查询部分(subquery factoring),