【发布时间】:2013-09-24 13:34:12
【问题描述】:
我有三个表:客户、订单和退款。部分客户(并非全部)下单,部分订单(并非全部)获得了退款。
当我像这样加入三个表时(细节不是那么重要):
SELECT ...
FROM customers LEFT JOIN orders
ON customers.customer_id=orders.customer_id
LEFT JOIN refunds
ON orders.order_id=refunds.order_id;
//WHERE order_id IS NOT NULL;// uncomment to filter out customers that have no orders
我得到一个大表,其中列出了所有客户(即使是那些没有下任何订单并且他们在 'order_id' 列中有 NULL 的客户),以及他们的所有订单和订单的退款(即使不是全部订单有退款):
NAME ORDER_ID ORDER AMOUNT REFUND
------------------------------------------------------------
Natalie 2 12.50 NULL
Natalie 3 18.00 18.00
Brenda 4 20.00 NULL
Adam NULL NULL NULL
由于我只想查看已下订单的客户,即在本例中我想从表中过滤 Adam,因此我取消了上面 SQL 查询中“WHERE”行的注释。 这产生了预期的结果。 我的问题是: 在哪个表上执行 WHERE - 在原始“订单”表(没有为 NULL 的 order_id)或作为 JOIN 的结果的表上? 显然是后者,但只是想确定一下,因为从SQL语法上看不是很明显,而且很重要。
谢谢
【问题讨论】:
-
为什么不遍历执行计划,看看它在哪里呢?虽然我同意,但它往往发生在茶几。