我有一个查询,其中我使用13 LEFT OUTER JOINS。左边的表有一个大数据,因此执行查询并返回结果需要很长时间。 但是当我使用where子句来过滤结果时,它只需要很少的时间。 现在我很困惑哪个首先执行:产生结果的连接然后where子句从中过滤或者首先过滤结果,得到结果的连接。
答案 0 :(得分:10)
通常,任何DBMS(例如SQL)都会执行自己的查询优化,它使用它认为最快的算法。所以它是过滤,然后加入。
答案 1 :(得分:2)
阅读:which one runs first in query execution WHERE CLAUSE orJOIN CLAUSE ?
和
我正在改变Pinal Dave的帖子,我发现了这个,它还能帮助你理解
理解它在JOIN之前应用的ON子句,这就是为什么它检索Table2的所有结果,其中有Flag = 1但它不影响Table1,因此它检索table1的所有行。当应用WHERE子句时,它将应用于完整结果,因此它将删除Table1和Table2中Flag不等于1的所有行,从而基本上保持Table1和Table2中的flag = 1行。
答案 2 :(得分:2)
Copied from my previous answer
create table A(id int);
create table B(id int);
INSERT INTO A VALUES(1);
INSERT INTO A VALUES(2);
INSERT INTO A VALUES(3);
INSERT INTO B VALUES(1);
INSERT INTO B VALUES(2);
INSERT INTO B VALUES(3);
SELECT * FROM A;
SELECT * FROM B;
id
-----------
1
2
3
id
-----------
1
2
3
过滤JOIN以防止在JOIN过程中添加行。
select a.*,b.*
from A a left join B b
on a.id =b.id and a.id=2;
id id
----------- -----------
1 NULL
2 2
3 NULL
JOIN发生后将在哪里过滤。
select a.*,b.*
from A a left join B b
on a.id =b.id
where a.id=2;
id id
----------- -----------
2 2