MySQL中on和where的区别

select name, bonus from Employee left join Bonus on Employee.EmpId = Bonus.EmpId where bonus is null or bonus < 1000 作者:力扣官方题解 链接:https://leetcode.cn/problems/employee-bonus/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  1. ON子句的作用
    • 功能概述
      • ON子句主要用于在连接(JOIN)操作中指定连接条件。它定义了两个或多个表之间的关联关系,决定了如何将这些表中的行进行匹配。
    • 在示例中的作用
      • SELECT name, bonus FROM Employee LEFT JOIN Bonus ON Employee.EmpId = Bonus.EmpId这个查询中,ON Employee.EmpId = Bonus.EmpId表示通过Employee表中的EmpId列和Bonus表中的EmpId列来建立连接。这样,查询会根据这个条件,将Employee表中的每一行与Bonus表中具有相同EmpId的行进行匹配。对于LEFT JOIN(左连接)来说,Employee表中的所有行都会被返回,而Bonus表中如果没有匹配的行,对应的列(这里是bonus列)会显示为NULL
  2. WHERE子句的作用
    • 功能概述
      • WHERE子句用于过滤查询结果集。它在表连接完成后,根据指定的条件对结果集中的行进行筛选,只有满足条件的行才会被包含在最终的查询结果中。
    • 在示例中的作用
      • WHERE bonus is null or bonus < 1000中,这个条件是在Employee表和Bonus表连接完成后起作用。它会筛选出bonus列的值为NULL或者小于1000的行。也就是说,即使在连接操作后得到了所有可能的行组合,WHERE子句也会进一步排除那些不符合这个条件的行,从而得到我们真正想要的结果。
  3. 两者的主要区别
    • 执行顺序不同
      • 在查询执行过程中,ON子句先执行。它在进行表连接操作时就开始起作用,用于确定如何连接表。而WHERE子句是在表连接完成后才对结果集进行过滤。
    • 作用对象不同
      • ON子句作用于表之间的连接关系,是关于如何将不同表中的行进行匹配的规则。WHERE子句作用于连接后的整个结果集,是对已经生成的行组合进行筛选的条件。
    • 对连接结果的影响不同
      • ON子句会影响连接的方式和结果集的大小,因为它决定了哪些行能够参与连接。例如,不同的连接条件(如使用不同的列进行连接或者使用更复杂的连接条件)会导致不同的行组合出现在连接后的结果中。WHERE子句只是在连接后的结果上进行筛选,不会改变表之间的连接方式。例如,无论WHERE条件如何,LEFT JOIN的连接方式(返回左表的所有行以及右表中匹配的行)是不会改变的,只是最终返回的行数可能会因为WHERE子句的筛选而减少。

MySQL中,`ON``WHERE`子句都用于指定条件,但它们的作用使用场景有所不同。 1. **`ON`子句**: - `ON`子句主要用于`JOIN`操作(如`INNER JOIN`、`LEFT JOIN`等)中,用于指定连接条件,即如何将两个表中的行进行匹配。 - `ON`子句中的条件用于决定哪些行应该被连接在一起。 - `ON`子句可以包含对连接表的引用。 2. **`WHERE`子句**: - `WHERE`子句用于过滤结果集中的行,无论这些行是如何连接的。 - `WHERE`子句中的条件适用于最终结果集中的所有行。 - `WHERE`子句不能包含对连接表的引用,只能引用最终结果集中的列。 ### 示例 假设有两个表:`employees`(员工表)`departments`(部门表)。 ```sql SELECT employees.name, departments.department_name FROM employees JOIN departments ON employees.department_id = departments.id WHERE employees.salary > 5000; ``` 在这个示例中: - `ON employees.department_id = departments.id`:这是`JOIN`的连接条件,用于指定如何将`employees`表`departments`表中的行进行匹配。 - `WHERE employees.salary > 5000`:这是过滤条件,用于过滤出工资大于5000的员工。 ### 另一个示例 ```sql SELECT employees.name, departments.department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.id AND employees.salary > 5000; ``` 在这个示例中: - `ON employees.department_id = departments.id AND employees.salary > 5000`:连接条件过滤条件都放在`ON`子句中。这样做的好处是可以在连接时过滤数据,但要注意,这种方式只适用于`LEFT JOIN`,因为`INNER JOIN`会将不符合条件的行排除在结果集之外。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Komorebi_9999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值