SQL操作顺序

tin*_*ime 10 sql optimization join where sql-execution-plan

如果我运行以下SQL查询

SELECT * 
FROM A
LEFT JOIN B
ON A.foo=B.foo
WHERE A.date = "Yesterday"
Run Code Online (Sandbox Code Playgroud)

请问WHERE声明得到之前或之后的评价JOIN

如果之后,什么是更好的方式来编写此语句,以便只返回A从中的行"Yesterday"连接到B

KM.*_*KM. 9

这取决于数据库.

在SQL Server上运行:SET SHOWPLAN_ALL ON然后运行查询,您将了解运行时会发生什么.


Tah*_*tar 7

您对"评估"的想法并不正确,因为SQL是一种声明性语言.

顺便说一下,你可以看到查询执行计划.在MySQL中使用关键字describe为查询添加前缀以查看执行计划.


Cad*_*oux 6

语义上:在JOIN之后.但在这种情况下,时序没有区别,因为它位于JOIN的左侧.

正如你已经拥有的那样,"只有"昨天"中的A行加入了B".

优化器可以自由地重新组织其操作顺序,具体取决于关系代数中的等价.

这只返回A.date ="Yesterday"并加入B,它可以在foo上找到匹配:

SELECT * FROM A
LEFT JOIN B
    ON A.foo=B.foo
WHERE A.date="Yesterday"
Run Code Online (Sandbox Code Playgroud)

这将返回所有A而不管任何条件,并加入B,其中A.date ="Yesterday"并且它在foo上找到匹配:

SELECT * FROM A
LEFT JOIN B
    ON A.foo=B.foo
    AND A.date="Yesterday"
Run Code Online (Sandbox Code Playgroud)