JOIN或WHERE中的条件?

时间:2014-02-19 08:13:34

标签: mysql sql database

哪个更有效,将条件放在JOIN中:

SELECT * FROM table1
LEFT JOIN table2 ON 
     table1.id=table2.fk AND
     table1.field1='some' AND
     ....

或者放入WHERE:

SELECT * FROM table1
LEFT JOIN table2 ON 
     table1.id=table2.fk
WHERE 
     table1.field1='some' AND
     ....

3 个答案:

答案 0 :(得分:1)

SELECT t2.name

FROM table1 t1

INNER JOIN table2 t2 ON t1.h_id = t2.h_id

WHERE t1.Date = CURDATE()

另一种可能性是where子句,试试这样:

 SELECT t2.name
 FROM table1 t1
 INNER JOIN table2 t2 ON t1.h_id = t2.h_id
 WHERE convert(varchar, t1.Date, 112) = convert(varchar, getdate(), 112)

答案 1 :(得分:0)

join中的条件只会连接特定条件匹配的特定表中的行,而where子句中的条件将过滤掉整个结果集。像table2有10行,对于特定条件,表2有3行,所以在连接中应用条件时,你将获得左表中的所有行,即table1,但是当在where子句中应用条件时,你将获得table1中table2的条件匹配的行,而不是table1的所有行

答案 2 :(得分:0)

他们的效果不是或多或少,他们在功能上有所不同。

如果没有过滤器,则会将主设备中的所有记录连接到子设备中匹配的记录

select * from t1
    left join t2 on t1.a = t2.c 

使用where,并对子表进行过滤,此连接将等同于内连接

select * from t1
    left join t2 on t1.a = t2.c 
where t2.d=5

使用联接,并对子表进行过滤,这会过滤子表的记录

select * from t1
    left join t2 on t1.a = t2.c and t2.d=5

使用where,过滤主表,这会过滤主表记录

select * from t1
    left join t2 on t1.a = t2.c 
where t1.b = 3

使用连接,这会过滤主要中可以加入的记录,但仍会返回主记录中的所有记录。

select * from t1
    left join t2 on t1.a = t2.c and t1.b = 3

所以给出以下表格

表t1

a           b
----------- -----------
1           2
1           3
2           4
3           3

表t2

c           d
----------- -----------
1           9
4           5
2           5

结果

query1

a           b           c           d
----------- ----------- ----------- -----------
1           2           1           9
1           3           1           9
2           4           2           5
3           3           NULL        NULL

query2

a           b           c           d
----------- ----------- ----------- -----------
2           4           2           5

QUERY3

a           b           c           d
----------- ----------- ----------- -----------
1           2           NULL        NULL
1           3           NULL        NULL
2           4           2           5
3           3           NULL        NULL

query4

a           b           c           d
----------- ----------- ----------- -----------
1           3           1           9
3           3           NULL        NULL

QUERY5

a           b           c           d
----------- ----------- ----------- -----------
1           2           NULL        NULL
1           3           1           9
2           4           NULL        NULL
3           3           NULL        NULL