左连接时mysql服务器行为不可预测

左连接时mysql服务器行为不可预测
CREATE TEMPORARY TABLE tmp_userid
(
    uUserId int unsigned NOT NULL PRIMARY KEY
) ENGINE='MEMORY';

CREATE TEMPORARY TABLE tmp_studentid
(
    uClassId INT UNSIGNED NOT NULL,
    uUserId int unsigned NOT NULL,
    PRIMARY KEY(uClassId,uUserId)
) ENGINE='MEMORY';

INSERT INTO tmp_userid
values (18);

INSERT INTO tmp_studentid
values (1,1),
    (1,3),
    (2,15),
    (3,20),
    (3,25),
    (4,35),
    (4,45)
;

现在,如果我尝试执行:

SELECT * FROM tmp_userid U
LEFT JOIN tmp_studentid S ON U.uUserId = S.uUserId
where  uClassId = 4;

SELECT * FROM tmp_userid U
LEFT JOIN tmp_studentid S ON U.uUserId = S.uUserId AND uClassId = 4;

返回不同的结果!

有人可以解释这种行为吗?

谢谢

答案1

如果您使用 检查执行计划,EXPLAIN您将看到第一个查询有Impossible WHERE noticed after reading const tables。就是这样 - mysql 首先执行 JOIN,然后过滤结果。由于没有连接输出行与您的过滤器匹配,因此您得到的最终结果是空的。

第二个查询执行 OUTER JOIN,其条件始终为假,对uClassId和返回 NULL uUserId,但由于没有连接后过滤,因此您得到结果。

相关内容