left join on 后and 和 where 的区别

left join on 后and 和 where 的区别


俩者放置相同条件,但是结果集不同,就是由于优先级不同,on的优先级高于where的。

首先得明确俩个概念

  1. 使用 left join 会返回左表中所有的数据,及时右表中没有匹配的行。
  2. 俩个表关联查询时,首先生成一张临时表,然后再将这张临时表返回。

俩者的区别

  1. and 是在生成临时表时候起作用的,不管条件是否成立,都会返回左表中的全部数据。
  2. where 是在生成临时表之后起作用的,那么就会对临时表中的数据过滤。

案例

创建表1 teacher 和表2 student 如下图

SELECT * from teacher t LEFT JOIN student s ON t.id = s.teacher_id and s.`name` = '韩信';
SELECT * from teacher t LEFT JOIN student s ON t.id = s.teacher_id WHERE s.`name` = '韩信';

第一条语句结果集:

第二条语句结果集:

第一条语句执行的时候 (t.id = s.teacher_id and s.name = ‘韩信’ )是一个整体 ,找到 student 表中符合的行于teacher 表中匹配 , 及时teacher 中有不符合的数据也会生成临时表返回。

第二条语句执行的时候 先执行了 (t.id = s.teacher_id) 生成临时表返回,然后where 条件过滤,所以存在丢失teacher 中的数据。

结论

  1. 如果左标中的数据全部返回 left join 后要用 and。
  2. where 会对左表中的数据过滤会丢失。
  3. t.id = s.teacher_id and s.name = ‘韩信’ )是一个整体,这样就很好理解俩者的区别。

关注我的技术公众号alistarfeng,每周都有优质技术文章推送。

微信扫一扫下方二维码即可关注:

### 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、付费专栏及课程。

余额充值