left join 过滤条件写在on后面和写在where 后面的区别

本文深入探讨SQL查询中左连接、内连接及使用条件进行查询的方法。通过实例展示了如何从两个表中获取数据,并在特定条件下筛选信息。文章还特别强调了使用WHERE子句在连接查询前进行条件过滤的重要性,以及何时可以将LEFT JOIN替换为INNER JOIN以提高查询效率。同时,提供了关于选择关键字和标签的建议,确保信息覆盖了信息技术领域的关键概念。
 

create table t1(id int, feild int);
insert into t1 values(1 , 1);
insert into t1 values(1 , 2);
insert into t1 values(1 , 3);
insert into t1 values(1 , 4);
insert into t1 values(2 , 1);
insert into t1 values(2 , 2);
create table t2(id int, feild int);
insert into t2 values(1 , 1);
insert into t2 values(1 , 2);
insert into t2 values(1 , 5);
insert into t2 values(1 , 6);
insert into t2 values(2 , 1);
insert into t2 values(2 , 3);

 

select t1.*,t2.* from t1 left join t2 on t1.id=t2.id  

--取t1表的第一行,扫瞄t2表,按条件做对比,如果满足条件,就加入返回结果表.
   然后取t1表的第二行,扫瞄t2表,按条件做对比,如果满足条件,就加入返回结果表.
   重复以上过程,直到t1表扫描结束.

select t1.*,t2.* from t1 left join t2 on t1.id=t2.id  and t1.feild=1 

--给左表加条件的时候,左表满足条件的,按上面的过程返回值,左表不满足条件的,直接输出,右表的列补null
       1 1 1 1
       1 1 1 2
       1 1 1 5
       1 1 1 6
       2 1 2 1
       2 1 2 3                   
      1 2 NULL NULL
      1 3 NULL NULL
      1 4 NULL NULL
      2 2 NULL NULL


select t1.*,t2.* from t1 left join t2 on t1.id=t2.id  where t1.feild=1     先执行where后连接查询

                                                                                    执行where后表为   1 , 1
                                                                                                                      2 , 1
                                                                                   用它来left join t2.
 

 --下面三条语句查询结果是一样的,当为右表加条件的时候,可以把left join 改为inner jin, 因为inner join比left join 要快!

select t1.*,t2.* from t1 left join t2 on t1.id=t2.id  and t2.feild=1
select t1.*,t2.* from t1 left join t2 on t1.id=t2.id  where t2.feild=1
select t1.*,t2.* from t1 inner join t2 on t1.id=t2.id  and t2.feild=1

 

更多详情请点击:更多介绍

在SQL查询中,`LEFT JOIN` 是一种常见的连接方式,用于返回左表中的所有记录,即使右表中没有匹配的行。当使用 `LEFT JOIN` 时,筛选条件可以放置在 `ON` 子句或 `WHERE` 子句中,但两者在执行顺序结果影响上存在显著差异。 ### 执行顺序 `ON` 子句中的条件是在连接过程中应用的,这意味着它会在生成连接结果集之前对数据进行筛选。具体来说,只有满足 `ON` 条件的行才会被包含到连接结果集中。相比之下,`WHERE` 子句中的条件是在连接操作完成后应用的,它会对已经生成的连接结果集进行进一步的过滤[^2]。 ### 结果影响 当在 `ON` 子句中添加筛选条件时,这些条件会影响连接过程本身,可能导致某些左表中的行因为不满足 `ON` 条件而不出现在结果集中,尤其是在外连接(如 `LEFT JOIN`)的情况下。然而,如果相同的筛选条件被放置在 `WHERE` 子句中,则这些条件仅对最终的连接结果集进行过滤,不会改变连接过程本身[^5]。 ### 示例说明 假设我们有两个表 `TableA` `TableB`,并且我们想要通过 `LEFT JOIN` 获取所有 `TableA` 的记录,同时只包括那些 `TableB` 中 `FilterColumn` 等于 `100` 的记录。 #### 使用 ON 条件 ```sql SELECT * FROM TableA LEFT JOIN TableB ON TableA.Key = TableB.Key AND TableB.FilterColumn = 100; ``` 在这个例子中,只有当 `TableB` 中的 `Key` 与 `TableA` 匹配并且 `FilterColumn` 等于 `100` 时,`TableB` 的记录才会被包含在结果集中。这确保了即使 `TableB` 中没有满足 `FilterColumn = 100` 的记录,`TableA` 的所有记录仍然会出现在结果集中[^5]。 #### 使用 WHERE 条件 ```sql SELECT * FROM TableA LEFT JOIN TableB ON TableA.Key = TableB.Key WHERE TableB.FilterColumn = 100; ``` 在这个例子中,首先执行 `LEFT JOIN` 操作,然后 `WHERE` 子句会过滤掉 `TableB` 中 `FilterColumn` 不等于 `100` 的所有记录。这可能导致 `TableA` 中的一些记录不显示在最终结果集中,因为它们可能没有对应的 `TableB` 记录满足 `WHERE` 条件[^5]。 ### 最佳实践 - 将与连接直接相关的条件放在 `ON` 子句中,这样可以使连接操作更加高效语义明确。 - 将对整个连接结果进行筛选的条件放在 `WHERE` 子句中。 - 避免在 `ON` 子句中使用复杂的筛选条件,以保持查询逻辑的清晰易于维护。 通过理解 `ON` `WHERE` 子句的不同作用,可以更有效地编 SQL 查询,确保获取到正确的数据结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值