left join on和where区别

本文深入探讨了SQL中Left Join操作的细节,包括临时表生成、WHERE与ON条件的区别及应用,以及它们如何影响数据行数和查询结果。通过具体案例,帮助读者理解左连接的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

left join中关于where和on条件的几个知识点:
    1.多表left join是会生成一张临时表,并返回给用户
    2.where条件是针对最后生成的这张临时表进行过滤,过滤掉不符合where条件的记录,是真正的不符合就过滤掉。
    3.on条件是对left join的右表进行条件过滤,但依然返回左表的所有行,右表中没有的补为NULL
    4.on条件中如果有对左表的限制条件,无论条件真假,依然返回左表的所有行,但是会影响右表的匹配值。也就是说on中左表的限制条件只影响右表的匹配内容,不影响返回行数。
结论:
    1.where条件中对左表限制,不能放到on后面
    2.where条件中对右表限制,放到on后面,会有数据行数差异,比原来行数要多

参考博客地址:

https://www.cnblogs.com/cuisi/p/7685893.html

 

转载于:https://my.oschina.net/uwith/blog/3035655

### SQL中LEFT JOIN ONWHERE区别及用法比较 在SQL查询中,`LEFT JOIN ON` `WHERE` 是两种不同的语法结构,分别用于实现不同的功能。以下是两者的区别及用法的详细比较: #### 1. **LEFT JOIN ON 的作用** `LEFT JOIN ON` 用于将两个表进行连接,并返回左表中的所有记录以及右表中满足连接条件的匹配记录。如果右表中没有匹配的记录,则返回 NULL 值。其基本语法如下: ```sql SELECT columns FROM table1 LEFT JOIN table2 ON table1.column = table2.column; ``` 此语法确保即使右表中没有匹配的数据,左表的所有行也会被保留[^1]。 #### 2. **WHERE 的作用** `WHERE` 子句用于过滤查询结果,限制返回的行数。它通常用于指定条件以筛选数据。例如: ```sql SELECT columns FROM table1 WHERE condition; ``` 当 `WHERE` 子句与 `LEFT JOIN` 结合使用时,可能会改变查询结果的行为。具体来说,`WHERE` 条件会进一步过滤已经通过 `LEFT JOIN` 连接后的结果集[^2]。 #### 3. **LEFT JOIN ONWHERE 的结合使用** 当 `LEFT JOIN ON` `WHERE` 同时出现在一个查询中时,需要注意它们的作用范围顺序。例如: ```sql SELECT t1.id, t1.name, t2.value FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id WHERE t2.value IS NOT NULL; ``` 在这个例子中,`LEFT JOIN` 确保了即使 `table2` 中没有匹配的记录,`table1` 的所有行仍然会被保留。然而,`WHERE t2.value IS NOT NULL` 的条件会过滤掉那些在 `table2` 中没有匹配值的行。因此,最终的结果可能与单独使用 `LEFT JOIN` 不同[^3]。 #### 4. **关键区别** - **数据保留**:`LEFT JOIN ON` 保证左表的所有行都会被包含在结果集中,即使右表中没有匹配的记录。而 `WHERE` 则会对整个结果集进行额外的过滤。 - **作用范围**:`LEFT JOIN ON` 的条件仅影响表之间的连接逻辑,而 `WHERE` 的条件则作用于整个查询结果。 - **性能影响**:`LEFT JOIN ON` 的条件会在连接阶段应用,而 `WHERE` 的条件会在连接完成后再进行过滤。这可能导致性能上的差异[^4]。 #### 示例代码 以下是一个具体的示例,展示两者的行为差异: ```sql -- 示例表 CREATE TABLE table1 (id INT, name VARCHAR(50)); CREATE TABLE table2 (id INT, value INT); INSERT INTO table1 (id, name) VALUES (1, 'A'), (2, 'B'), (3, 'C'); INSERT INTO table2 (id, value) VALUES (1, 10), (3, 30); -- 使用 LEFT JOIN ON SELECT t1.id, t1.name, t2.value FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id; -- 输出: -- id | name | value -- 1 | A | 10 -- 2 | B | NULL -- 3 | C | 30 -- 使用 LEFT JOIN ON + WHERE SELECT t1.id, t1.name, t2.value FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id WHERE t2.value IS NOT NULL; -- 输出: -- id | name | value -- 1 | A | 10 -- 3 | C | 30 ``` #### 总结 `LEFT JOIN ON` `WHERE` 在 SQL 查询中有不同的用途行为。正确理解它们的作用范围顺序对于编写高效的查询语句至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值