mysql ON子句中的OR和连续连接的效果不同?

select *

from a

join b

on (a.userid = b.id or a.clientid = b.id)

select *

from a

join b b1 on (a.userid = b1.id)

join b b2 on (a.clientid = b2.id)

上面的两个sql语句我的理解应该效果是一致的,但是现实却不同,我有哪里理解出现问题了么?

回答

假设a,b 两表有如下数据:

create table a (userid int, clientid int, name char(10));

insert into a values (1,2,'A'),(3,4,'B'),(2,5,'C');

CREATE TABLE b (id int, bname char(10));

INSERT into b VALUES(1,'D'),(2,'E'),(3,'F'),(4,'G'),(5,'H');

截屏2020-06-16 下午11.03.22.png

对应第一条语句:

select *

from a

join b

on (a.userid = b.id or a.clientid = b.id)

截屏2020-06-16 下午11.03.07.png

绿色是第一个条件的结果,并上黄部分的第二条结果

等价于

select *

from a

join b

on (a.userid = b.id)

union

select *

from a

join b

(a.clientid = b.id);

而第二条语句:

相当于

截屏2020-06-16 下午11.03.28.png

相当于是 A与 B1联表得到一个临时表T,再与 B2联表查询。

以上是 mysql ON子句中的OR和连续连接的效果不同? 的全部内容, 来源链接: utcz.com/a/25127.html

回到顶部