SQL左连接中"on ..和"与"on .. where"之间的区别?

jac*_*.li 24 sql syntax join where

Sql语句.

1.select a.* from A a left join B b on a.id =b.id and a.id=2;

2.select a.* from A a left join B b on a.id =b.id where a.id=2;
Run Code Online (Sandbox Code Playgroud)

这两个sql语句有什么区别?

mr_*_*air 31

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
Run Code Online (Sandbox Code Playgroud)

过滤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
Run Code Online (Sandbox Code Playgroud)

在JOIN发生后将过滤WHERE.

select a.*,b.* 
from   A a left join B b 
on     a.id =b.id 
where  a.id=2;

id          id
----------- -----------
2           2
Run Code Online (Sandbox Code Playgroud)


小智 10

从a.id = b.id和a.id = 2的左连接B b中选择a.*;

这仅用于a.id连接条件,因此记录a.id <> 2不会被过滤掉.你可能会得到这样的结果:

+------+------+
| a.id | b.id |
+------+------+
| 1    | NULL |
| 2    | 2    |
| 3    | NULL |
+------+------+

你没有选择任何b列,但如果你这样做,它会更容易理解.

从a.id = b.id中的左连接B b中选择a.*,其中a.id = 2;

现在记录a.id <> 2过滤掉的地方.

+------+------+
| a.id | b.id |
+------+------+
| 2    | 2    |
+------+------+