6
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');

这三个语句具有相同的结果。除了where不能在不使用的情况下独占使用之外on,还有什么特别的理由where在表连接中使用吗?

4

5 回答 5

11

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

通常,如果您要使用内部联接,您应该会看到相同的结果,但是一旦您开始使用 LEFT 联接,结果就会发生变化。

看看下面的例子

SQL 小提琴演示

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

编辑@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');

和测试

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;
于 2012-10-30T04:04:19.727 回答
10

where是在使用连接选择行后应用的过滤器。条件并不总是在join ... on语义上等同于where条件。因此,是的,使用where表内连接有一个特殊的原因:当它做正确的事情时。


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

于 2012-10-30T04:01:44.963 回答
1

使用on通常用于查询多个表。进行该查询时,表之间必须具有关系,通常在特定字段中具有相同的值。

on将连接相同的值,例如:

**table1**:

id_name   id_position   name
1         1             john
2         2             doe
3         2             tom
4         3             hawkins

**table2**
id_position   position
1             system analyst
2             programmer

SELECT t1.id_name, t1.name, t2.position
  FROM table1 t1 LEFT JOIN table2 t2
  ON t1.id_position = t2.id_position

-- RESULT:
id_name   name     position
1         john     system analyst
2         doe      programmer
3         tom      programmer
4         hawkins  NULL            -- NO MATCH IN table 2

正如我们所看到的on,将连接具有相同值的 table1 和 table2 id_position,所以它与你上面写的有点不同。

虽然where可以在每个查询中使用,而不取决于该查询中有多少表。通常where用于我们想要的有条件的东西。

于 2012-10-30T04:54:03.570 回答
0

区别在于引擎何时执行过滤。“where”表示对两个表的计算结果的过滤器。“on”关键字指定如何执行连接。即使有时它们都产生相同的结果,它们在语义上也不等价。

干杯

于 2012-10-30T04:03:26.937 回答
0

ON子句定义表之间的关系。

  • ON子句支持所有连接类型。

WHERE子句描述了您感兴趣的行。

  • WHERE子句只支持内连接,不支持外连接,比如LEFT JOINand RIGHT JOIN
于 2015-11-27T09:04:57.490 回答