SQL表连接中ON和WHERE子句之间的区别

Jay*_*Jay 6 sql oracle join

select e.last_name, e.hire_date
from employees e join employees m
on (m.last_name = 'Davies')
and (e.hire_date > m.hire_date);

select e.last_name, e.hire_date
from employees e join employees m
on (m.last_name = 'Davies')
where (e.hire_date > m.hire_date);

select e.last_name, e.hire_date
from employees e join employees m
on (e.hire_date > m.hire_date)
where (m.last_name = 'Davies');
Run Code Online (Sandbox Code Playgroud)

这三个陈述具有相同的结果.除了where不能单独使用的事实,没有使用on,是否有任何特殊的理由where在表连接中使用?

Adr*_*der 11

主要区别在于使用不同的连接时.

通常,如果要使用内部联接,则应该看到相同的结果,但是一旦开始使用LEFT联接,结果将会更改.

看看下面的例子

SQL Fiddle DEMO

并看看下面的文章(非常解释)

编辑@ShannonSeverance

架构和测试数据

CREATE TABLE Table1 (
  ID INT,
  Val VARCHAR(20)
 );

INSERT INTO Table1 VALUES (1,'a');
INSERT INTO Table1 VALUES (2,'a');

CREATE TABLE Table2 (
  ID INT,
  Val VARCHAR(20)
 );

INSERT INTO Table2 VALUES (1,'a');
Run Code Online (Sandbox Code Playgroud)

和测试

SELECT t1.ID,
t1.Val,
t2.ID ID2,
t2.Val Val2
FROM Table1 t1 INNER JOIN
Table2 t2 ON t1.ID = t2.ID AND t1.Val = t2.Val;

SELECT  t1.ID,
t1.Val,
t2.ID ID2,
t2.Val Val2
FROM Table1 t1,Table2 t2 
WHERE t1.ID = t2.ID
 AND t1.Val = t2.Val;

SELECT  t1.ID,
t1.Val,
t2.ID ID2,
t2.Val Val2
FROM Table1 t1 LEFT JOIN
Table2 t2 ON t1.ID = t2.ID  AND t1.Val = t2.Val;

SELECT  t1.ID,
t1.Val,
t2.ID ID2,
t2.Val Val2
FROM Table1 t1 LEFT JOIN
Table2 t2 ON t1.ID = t2.ID  
WHERE t1.Val = t2.Val;
Run Code Online (Sandbox Code Playgroud)


Mat*_*all 10

where是使用连接选择行后应用的过滤器.情况并非总是在某种join ... on情况下等效于where条件.因此,是的,有一个特殊的原因使用where表连接:当它做正确的事情.


...相反,ON条件在进行连接时执行.ON多表连接中较早连接的条件可以切断数百万个不必要的连接,因此如果语义正确则通常是首选
- 波希米亚语

  • ...相反,`ON`条件在进行连接时执行*.多表连接中早期连接的"ON"条件可以切断数百万个不必要的连接,因此如果在语义上正确则通常是首选 (3认同)