![左连接时mysql服务器行为不可预测](https://linux22.com/image/584648/%E5%B7%A6%E8%BF%9E%E6%8E%A5%E6%97%B6mysql%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%A1%8C%E4%B8%BA%E4%B8%8D%E5%8F%AF%E9%A2%84%E6%B5%8B.png)
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
,但由于没有连接后过滤,因此您得到结果。