left join on右表为空
SQL LEFT JOIN 当右表为空时的行为
在执行 LEFT JOIN
操作时,如果右表没有任何与左表相匹配的记录,则结果集中仍然会保留左表中的所有行。对于这些没有找到匹配项的左表行,来自右表的列将会被填充为 NULL
值。
考虑如下场景:
假设存在两张表格 quality_process_inspection
和 related_table
,其中 quality_process_inspection
是左表而 related_table
是右表。当查询语句如下所示时:
SELECT *
FROM quality_process_inspection AS qpi
LEFT JOIN related_table AS rt ON qpi.some_id = rt.foreign_key;
即使 related_table
中不存在任何能够满足连接条件的数据行,只要 quality_process_inspection
表中有符合条件(例如 is_deleted = 0
) 的记录,那么最终的结果集里也会包含这些记录,并且对应于 related_table
那部分字段将全都是 NULL
[^1]。
然而需要注意的是,某些情况下可能会因为其他因素导致行为不符合预期。比如,在构建复杂的多层嵌套子查询或是应用额外过滤条件的情况下,可能会影响实际输出效果。因此建议仔细审查完整的SQL语句结构以及所使用的数据库管理系统版本特性[^2]。
另外值得注意的一点是在MySQL中,如果左表本身是空的话,默认情况下还是会显示出一行带有 COUNT(*)=0
的统计信息而不是完全空白的结果集;但这并不意味着每次都会如此表现,具体取决于上下文环境和具体的实现方式。
为了验证上述描述并展示确切的行为模式,下面提供了一个简单的测试案例来模拟这种情况下的 LEFT JOIN
结果:
测试用例
创建两个临时表用于演示目的:
CREATE TEMPORARY TABLE temp_left (
id INT PRIMARY KEY,
name VARCHAR(50)
);
INSERT INTO temp_left VALUES (1,'Record One'), (2,'Record Two');
CREATE TEMPORARY TABLE temp_right (
id INT PRIMARY KEY,
left_id INT,
detail TEXT
);
-- 不向temp_right插入任何数据使其保持为空状态
现在尝试进行 LEFT JOIN
并观察结果:
SELECT l.*, r.*
FROM temp_left l
LEFT JOIN temp_right r ON l.id = r.left_id;
此命令应该返回两行数据,每行代表 temp_left
表里的每一项记录,同时由于 temp_right
完全为空所以关联过来的所有字段都将是 NULL
[^4]。
相关推荐


















