当前位置: 首页 > article >正文

SQL ON与WHERE区别

在 MySQL 中,ON 和 WHERE 都用于过滤数据,但它们的使用场景和作用有所不同,尤其是在涉及 JOIN 操作时。下面通过具体的例子来说明它们的区别。

1. ON 的作用

ON 用于指定表之间的连接条件,决定哪些行应该被连接在一起。它在 JOIN 操作时生效。

示例:

假设有两个表:

orders 表:存储订单信息。

+---------+------------+-------------+
| order_id| order_date | customer_id |
+---------+------------+-------------+
| 1       | 2023-01-01 | 101         |
| 2       | 2023-02-01 | 102         |
| 3       | 2023-03-01 | 103         |
+---------+------------+-------------+

customers 表:存储客户信息。 

+-------------+------------+
| customer_id | name       |
+-------------+------------+
| 101         | Alice      |
| 102         | Bob        |
| 103         | Charlie    |
+-------------+------------+

 使用 ON 进行连接:

SELECT *
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id;

 结果

+---------+------------+-------------+-------------+-------+
| order_id| order_date | customer_id | customer_id | name  |
+---------+------------+-------------+-------------+-------+
| 1       | 2023-01-01 | 101         | 101         | Alice |
| 2       | 2023-02-01 | 102         | 102         | Bob   |
| 3       | 2023-03-01 | 103         | 103         | Charlie|
+---------+------------+-------------+-------------+-------+

ON 条件指定了 orders.customer_id = customers.customer_id,决定了哪些行应该被连接在一起。

2. WHERE 的作用

WHERE 用于过滤查询结果集中的行。它在连接操作之后生效。

示例:

继续使用上面的 orders 和 customers 表,现在需要查询 order_date 大于 2023-01-01 的订单。

SELECT *
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id
WHERE orders.order_date > '2023-01-01';

结果

+---------+------------+-------------+-------------+-------+
| order_id| order_date | customer_id | customer_id | name  |
+---------+------------+-------------+-------------+-------+
| 2       | 2023-02-01 | 102         | 102         | Bob   |
| 3       | 2023-03-01 | 103         | 103         | Charlie|
+---------+------------+-------------+-------------+-------+
  • WHERE 条件过滤了 order_date 大于 2023-01-01 的记录。

3. ON 和 WHERE 的区别

场景 1:INNER JOIN 中的 ON 和 WHERE

在 INNER JOIN 中,ON 和 WHERE 的效果通常是相同的,因为 INNER JOIN 只返回满足连接条件的行。

示例

-- 使用 ON 条件
SELECT *
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id
AND orders.order_date > '2023-01-01';

-- 使用 WHERE 条件
SELECT *
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id
WHERE orders.order_date > '2023-01-01';

 结果

+---------+------------+-------------+-------------+-------+
| order_id| order_date | customer_id | customer_id | name  |
+---------+------------+-------------+-------------+-------+
| 2       | 2023-02-01 | 102         | 102         | Bob   |
| 3       | 2023-03-01 | 103         | 103         | Charlie|
+---------+------------+-------------+-------------+-------+

 在 INNER JOIN 中,ON 和 WHERE 的结果是相同的。

场景 2:LEFT JOIN 中的 ON 和 WHERE

在 LEFT JOIN 中,ON 和 WHERE 的效果可能不同,因为 LEFT JOIN 会保留左表中的所有行,即使右表中没有匹配的行。

示例
假设 orders 表中有一条记录没有对应的 customer_id

+---------+------------+-------------+
| order_id| order_date | customer_id |
+---------+------------+-------------+
| 1       | 2023-01-01 | 101         |
| 2       | 2023-02-01 | 102         |
| 3       | 2023-03-01 | 103         |
| 4       | 2023-04-01 | NULL        | -- 没有对应的 customer_id
+---------+------------+-------------+

使用 ON 条件

SELECT *
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id
AND customers.name = 'Alice';

结果

+---------+------------+-------------+-------------+-------+
| order_id| order_date | customer_id | customer_id | name  |
+---------+------------+-------------+-------------+-------+
| 1       | 2023-01-01 | 101         | 101         | Alice |
| 2       | 2023-02-01 | 102         | NULL        | NULL  |
| 3       | 2023-03-01 | 103         | NULL        | NULL  |
| 4       | 2023-04-01 | NULL        | NULL        | NULL  |
+---------+------------+-------------+-------------+-------+

 ON 条件保留了所有 orders 表中的行,即使 customers.name 不是 Alice

使用 WHERE 条件

SELECT *
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id
WHERE customers.name = 'Alice';

 结果

+---------+------------+-------------+-------------+-------+
| order_id| order_date | customer_id | customer_id | name  |
+---------+------------+-------------+-------------+-------+
| 1       | 2023-01-01 | 101         | 101         | Alice |
+---------+------------+-------------+-------------+-------+

 WHERE 条件过滤了结果集,只返回 customers.name = 'Alice' 的行

4. 总结

  • ON:用于指定连接条件,决定哪些行应该被连接在一起。它在连接操作时生效。

  • WHERE:用于过滤查询结果,决定哪些行应该被返回。它在连接操作之后生效。

  • 在 INNER JOIN 中,ON 和 WHERE 的效果通常是相同的。

  • 在 LEFT JOIN 或 RIGHT JOIN 中,ON 和 WHERE 的效果可能不同,需要根据实际需求谨慎选择。

 


http://www.kler.cn/a/507725.html

相关文章:

  • PyTorch使用教程(2)-torch包
  • 【Flink系列】9. Flink容错机制
  • GitLab集成Jira
  • 用css和html制作太极图
  • 清除前端缓存的方式
  • 学习threejs,使用FlyControls相机控制器
  • 架构设计:微服务还是集群更适合?
  • Java负载均衡
  • C++ 强化记忆
  • 【Linux系统】分区挂载
  • 图像的旋转之c++实现(qt + 不调包)_c++图像旋转
  • 晨辉面试抽签和评分管理系统之十:如何搭建自己的数据库服务器,使用本软件的网络版
  • 【机器学习实战入门】有趣的Python项目:使用OpenCV进行性别和年龄检测
  • [Mac + Icarus Verilog + gtkwave] Mac运行Verilog及查看波形图
  • 计算机网络 (47)应用进程跨越网络的通信
  • cpu架构
  • Linux之文件系统前世今生(二)
  • Notepad++移除所有空格
  • js-闭包(封装私有变量,创建模块,函数柯里化接收多个参数转换为接收单一参数,实现迭代器-遍历数组与对象)
  • 御载 MATLAB
  • RHCE是什么级别
  • 鸿蒙Flutter实战:16-无痛开发指南(适合新手)
  • ios文件管理,沙盒机制以及如何操作“文件”APP,把文件共享到文件app
  • Golang Gin系列-2:搭建Gin 框架环境
  • Word2Vec中的CBOW模型训练原理详细解析
  • (2)Elasticsearch8.17的web管理工具:kibana