SQL ON与WHERE区别

在 MySQL 中,ONWHERE 都用于过滤数据,但它们的使用场景和作用有所不同,尤其是在涉及 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 用于过滤查询结果集中的行。它在连接操作之后生效。

示例:

继续使用上面的 orderscustomers 表,现在需要查询 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. ONWHERE 的区别

场景 1:INNER JOIN 中的 ONWHERE

INNER JOIN 中,ONWHERE 的效果通常是相同的,因为 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 中,ONWHERE 的结果是相同的。

场景 2:LEFT JOIN 中的 ONWHERE

LEFT JOIN 中,ONWHERE 的效果可能不同,因为 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 中,ONWHERE 的效果通常是相同的。

  • LEFT JOINRIGHT JOIN 中,ONWHERE 的效果可能不同,需要根据实际需求谨慎选择。

相关推荐
雨辰AI17 分钟前
生产级实测:SpringBoot3 + 达梦数据库接口从 200ms 优化至 20ms 完整调优指南
java·数据库·spring boot·后端·政务
凡人叶枫1 小时前
Effective C++ 条款39:明智而审慎地使用 private 继承
java·数据库·c++·嵌入式开发
基德爆肝c语言1 小时前
MySQL表的操作
前端·数据库·mysql
TDengine (老段)1 小时前
TDengine 连接算子 — Inner/Outer/ASOF/Window Join 的实现与使用
大数据·数据库·物联网·哈希算法·时序数据库·tdengine·涛思数据
Keano Reurink2 小时前
搜索API与GSC数据对比:发现数据盲区
数据库·python·数据挖掘
shushangyun_2 小时前
汽车服务行业B2B平台+AI解决方案哪家专业:2026年最新测评
java·运维·网络·数据库·人工智能·汽车
大黄说说2 小时前
深入理解 Go 协程 Goroutine:并发编程的核心精髓
java·数据库·python
sulikey2 小时前
数据库系统概论4 - 更新与视图 期末速成课笔记
数据库·笔记·考试·期末速成·数据库系统概论
锋行天下2 小时前
数据库安全并发控制详解:乐观锁 vs 悲观锁 vs 原子操作
前端·数据库·后端
2601_961875242 小时前
花生十三公考课程|网课|视频
数据库·windows·git·svn·eclipse·github