INNER JOIN之前的WHERE子句

52
如果我有
SELECT * FROM Table1 t1 
LEFT JOIN Table2 t2 ON t1.id = t2.id 
WHERE t1.user='bob';

WHERE子句是否在两个表进行JOIN之后运行?

如何使其在JOIN之前运行?


给出的答案是正确的,但值得深入探究一下。你为什么要寻找这种行为?我想查询优化器会为你处理明显的情况... - Dan J
8个回答

123

where 条件子句会在 join 之前执行,以避免连接不必要的记录。因此,您的代码已经很好了。


11
我可以确认。运行“explain”查询,你就会看到。 - Mosty Mostacho
3
这是更好的答案。 - Mahdi Yusuf

36

WHERE条件改为另一个JOIN条件

LEFT JOIN Table2 t2 ON t1.id = t2.id AND t1.user='bob'


2
在我做左连接的经验中,你不能在ON语句中排除“左”(t1)表中的记录,因为根据定义,所有的t1记录都将被包括。where语句确实有效,因为它将应用于连接结果之后。我不确定你想要达到什么目的,但很可能内部连接也适合你的需求,然后你可以在ON语句中添加t1.user=“bob”的条件。但如果Mosty Mostacho是正确的,条件的位置(WHERE vs ON)对执行速度无影响。

2
您可以在FROM后使用表达式,例如:
SELECT *
FROM (SELECT
        id
    FROM Table1
    WHERE user = 'bob') AS t1
LEFT JOIN Table2 t2
    ON t1.id = t2.id

1
你只需在其他条件之前在ON子句中添加t1.user='bob'条件,并且它会首先被评估。
SELECT * FROM Table1 t1 
LEFT JOIN Table2 t2
ON t1.user='bob' AND t1.id = t2.id;

0

你可以做到

SELECT * 
    FROM Table1 t1 
    LEFT JOIN Table2 t2
        ON t1.id=t2.id AND t1.user='bob';

0

使用RIGHT JOIN是解决方案:

SELECT cars.manufacturer, cars.year FROM cars 
RIGHT JOIN (SELECT m.manufacturer FROM cars AS m ORDER BY m.year DESC LIMIT 3) subq 
ON cars.manufacturer=subq.manufacturer

还没有完全测试过,但似乎可以工作。

0

ON子句中条件的顺序没有影响。SQL查询优化器将以优化的方式评估和执行条件,无论它们的顺序如何。

因此

SELECT t1.column1, t1.column2, t2.column3
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.user = 'bob' AND t2.age = 25 AND t1.id = t2.id;

或者

SELECT t1.column1, t1.column2, t2.column3
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.id = t2.id AND t1.user = 'bob' AND t2.age = 25;

在结果和查询执行方面是相同的


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接