1. 连接表过滤的本质差异
当我们在SQL中处理多表连接查询时,过滤条件可以放在ON子句或WHERE子句中,这两种方式看似都能实现数据筛选,但底层执行逻辑存在本质区别。理解这个差异对于编写高效查询和排查数据问题至关重要。
ON子句是连接操作的一部分,它决定了两个表之间的匹配关系。以简单的订单和客户表为例:
sql复制SELECT *
FROM orders
JOIN customers ON orders.customer_id = customers.id
AND customers.status = 'VIP'
这里的customers.status = 'VIP'作为连接条件,意味着只匹配VIP客户对应的订单。如果在连接阶段找不到匹配的VIP客户,该订单记录根本不会出现在结果集中。
相比之下,WHERE子句是对连接后的结果集进行二次过滤:
sql复制SELECT *
FROM orders
JOIN customers ON orders.customer_id = customers.id
WHERE customers.status = 'VIP'
这个查询会先执行完整的连接操作(包括所有客户状态的订单),然后再过滤掉非VIP客户的数据。对于大型表,这种操作方式可能产生巨大的临时结果集。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 执行计划深度解析
通过EXPLAIN命令可以清晰观察到两种写法的执行计划差异。假设我们有两个各含100万条记录的表:
ON条件过滤的执行计划:
code复制-> Nested Loop Inner Join
-> Filter: (customers.status = 'VIP')
-> Table Scan on customers
-> Index Lookup on orders using fk_customer (customer_id=customers.id)
WHERE条件过滤的执行计划:
code复制-> Nested Loop Inner Join
-> Table Scan on customers
-> Index Lookup on orders using fk_customer (customer_id=customers
