首先建两个表来测试下。
create table a(id number,type number );
insert into a values(1,1);
insert into a values(2,1);
insert into a values(3,2);
insert into a values(4,1);
insert into a values(5,2);
create table b(id number);
insert into b values(1);
insert into b values(2);
insert into b values(5);
表a 表b
id type id
1 1 1
2 1 2
3 2
4 1
5 2 5
内连接时
select * from a inner join b on a.id =b.id where a.type = 1;
select * from a inner join b on a.id =b.id and a.type = 1;
结果一样
左连接时
select * from a left join b on a.id =b.id where a.type = 1;
select * from a left join b on a.id =b.id and a.type = 1;
可以发现当a.type = 1条件在on 后面时, 和where时是不同的
可以发现当a.type = 1条件在on 后面时, 和where时是不同的
分析:
内连接:返回符合条件的行。
左外连接:以左边表为基础,返回右边表中符合条件的行。
也就是左表的全部记录都在。所有筛选条件都是针对右表
当条件在on后时
所以上面左连接时,
a表id 为1,在b表中也有id = 1,且a表这行的记录type = 1,条件为真,所以 和b有关的列有值。
a表id 为2,在b表中也有id = 2,且a表这行的记录type = 1,条件为真,所以 和b有关的列有值。
a表id 为3,在b表中没有id = 3,条件为假,所以 和b有关的列值为空。
a表id 为4,在b表中没有id = 4 ,条件为假 ,所以 和b有关的列 值为空 。
a表id 为5,在b表中也有id = 5,且a表这行的记录type = 2,条件为假,所以 和b有关的列 值为空 。
所以最后的结果如图2所示
当条件在where后时
a表id 为1,在b表中也有id = 1,条件为真,所以 和b有关的列有值。
a表id 为2,在b表中也有id = 2,条件为真,所以 和b有关的列有值。
a表id 为3,在b表中没有id = 3,条件为假,所以 和b有关的列值为空。
a表id 为4,在b表中没有id = 4 ,条件为假 ,所以 和b有关的列 值为空 。
a表id 为5,在b表中也有id = 5,条件为 真 ,所以 和b有关的列 有值 。
结果为:
然后根据a.type = 1来筛选条件,所以最后结果为图1
右连接时
select * from a right join b on a.id =b.id where a.type = 1;
select * from a right join b on a.id =b.id and a.type = 1;
右外连接:以左边表为基础,返回右边表中符合条件的行。
同样,也就是右表的全部记录都在。所有筛选条件都是针对左表
所以上面右连接时,
b表id 为1,在a表中也有id = 1,且a表这行的记录type = 1,条件为真,所以 和a有关的列有值。
b表id 为2,在a表中也有id = 2,且a表这行的记录type = 1,条件为真,所以 和a有关的列有值。
b表id 为5,在a表中没有id = 5,且a表这行的记录type = 2,条件为假,所以 和a有关的列值为空。
所以最后的结果如图4所示
b表id 为1,在a表中也有id = 1 ,条件为真,所以 和a有关的列有值。
b表id 为2,在a表中也有id = 2,条件为真,所以 和a有关的列有值。
b表id 为5,在a表中没有id = 5,条件为真,所以 和a有关的列 有值 。
结果为:
然后根据a.type = 1来筛选条件,所以最后结果为图3
结论:当内连接时,条件放在where后和on后结果一样,
当外连接时,条件放在where后和on后结果不一样,根据自己的需要选择到底放在哪。
相关推荐
left_join_on_and与left_join_on_where的区别
### SQL语句JOIN中ON和WHERE的区别 #### 引言 在SQL中,JOIN操作用于合并两个或多个表中的行。正确理解`ON`和`WHERE`子句的区别对于高效地编写查询至关重要。本文将详细解释这两者的不同,并通过具体的例子来加深...
### left join 过滤条件写在on后面和写在where 后面的区别 在SQL查询语句中,连接(JOIN)是一种非常重要的操作,用于从两个或多个表中获取数据。其中,`LEFT JOIN`是一种常用的连接类型,它返回左表的所有记录以及...
6. ON与WHERE的区别:在JOIN操作中,ON子句用于指定连接条件,而WHERE子句用于过滤结果集。ON子句的条件应用于确定哪些记录应该组合在一起,而WHERE子句的条件则应用于已经组合后的结果集。换句话说,ON是在连接之前...
对于LEFT JOIN、RIGHT JOIN和FULL JOIN,ON条件的过滤是在生成中间表时进行的,而WHERE是在中间表生成后应用。而对于INNER JOIN,由于它只返回匹配的记录,所以ON和WHERE在功能上是等价的。理解这些概念对于优化SQL...
当我们涉及到LEFT JOIN时,可能会遇到使用ON和WHERE子句的情况,两者虽然都可以用来指定条件,但在语义上有所区别。 首先,ON子句是在生成联接结果集(临时表)时应用的条件。无论ON条件是否为真,都会返回左表的...
总结一下,`ON` 和 `WHERE` 在 `LEFT JOIN` 中的主要区别在于: 1. `ON` 用于在生成临时表时定义连接条件,无论条件是否满足,都会返回左表的所有行。 2. `WHERE` 在临时表生成后进行过滤,如果它包含了连接条件,...
在SQL查询中,JOIN操作是连接两个或多个...`ON`关键字定义了连接的条件,而`WHERE`则在连接后对结果集进行进一步的过滤。理解这三个关键字的区别和用法是SQL查询中的基本技能,对于处理复杂的数据关联问题至关重要。
总结来说,ON子句在JOIN操作中定义连接条件,而WHERE子句则在连接后对结果集进行过滤。LEFT JOIN保留左表的所有记录,即使在右表中没有匹配,而INNER JOIN只返回两表的交集。在LEFT JOIN中,WHERE子句可以进一步限制...
当我们设置LEFT JOIN的条件时,可以在ON和WHERE子句中指定,但它们之间存在一些关键区别。 首先,理解ON子句的作用至关重要。ON子句中的条件是在连接左右两表时使用的,它定义了两个表之间的关系。在这个例子中,`...
而on和where是用于指定连接条件和过滤结果集的关键字,在Left Join中它们的使用方法和时机对最终查询结果会产生重大影响。 在Left Join的语句中,on关键字用于指定连接条件,它定义了两张表之间如何关联,确保了...
如果在`LEFT JOIN`中同时使用`ON`和`WHERE`,需要注意的是,`WHERE`条件可能会覆盖`ON`条件的效果。在`LEFT JOIN`中,`WHERE`通常用于限制最终结果集的行,而不是影响连接本身。如果`WHERE`子句中包含`JOIN`条件,...
在使用LEFT JOIN和RIGHT JOIN时,条件筛选可以使用ON和WHERE子句。它们之间的差异是很多人容易混淆的地方。ON子句是在连接操作中对连接条件进行指定,而WHERE子句通常用于对结果集进行过滤。由于这两者在查询的逻辑...
- 如果在`INNER JOIN`中同时使用`ON`和`WHERE`,`WHERE`的过滤条件会进一步筛选由`ON`过滤后的结果集。 - 示例: ```sql SELECT * FROM person p INNER JOIN account a ON p.id = a.id AND p.id != 4 AND a.id !...
在进行数据库操作时,理解`ON`与`WHERE`条件的区别至关重要,尤其是在处理表连接(如`LEFT JOIN`、`INNER JOIN`等)时更为关键。这两种条件虽然都能用于限制结果集,但它们在执行时机、作用范围以及对结果的影响上...
这篇博文“深入解析on where谓词的区别”旨在帮助我们理解这两个关键字在联接(JOIN)操作和简单查询中的不同作用。 首先,让我们来看看`WHERE`子句。在SQL中,`WHERE`主要用于基本的单表查询,它在`SELECT`语句...