SQL中left join操作和直接查询左表全量数据有什么区别?
LEFT JOIN 和直接查询左表的核心区别
你看到的LEFT JOIN维恩图仅展示了行的保留规则,没有体现列合并、行扩增的特性,这是产生混淆的核心原因
1. 返回的列范围不同
直接查询左表仅会返回左表本身的所有字段,而LEFT JOIN会返回「左表全部字段 + 右表符合关联条件的字段」。
举个示例:
- 左表
student字段:stu_id, stu_name, class - 右表
score字段:stu_id, subject, score
直接查询左表语句:
SELECT * FROM student;
返回结果仅包含stu_id, stu_name, class3个字段。
LEFT JOIN查询语句:
SELECT * FROM student LEFT JOIN score ON student.stu_id = score.stu_id;
返回结果包含stu_id(左表), stu_name, class, stu_id(右表), subject, score6个字段。
2. 返回的行数可能不同
如果右表中存在多条和左表某一行匹配的记录,LEFT JOIN后左表的对应行也会扩增为多条,和直接查询左表的行数不一致。
举个具体数据示例:student表数据:
| stu_id | stu_name | class |
|---|---|---|
| 1 | 张三 | 1班 |
| 2 | 李四 | 1班 |
score表数据:
| stu_id | subject | score |
|---|---|---|
| 1 | 语文 | 90 |
| 1 | 数学 | 95 |
- 直接查询
student表返回2行数据 - 用上述LEFT JOIN语句查询返回3行数据:张三对应2行(语文、数学成绩各一行),李四对应1行(成绩表无匹配,右表字段为NULL)
补充:维恩图的局限性
你常看到的维恩图高亮左表全量区域,仅表示左表的所有行无论是否能匹配到右表,都会被保留,不代表返回的内容和直接查左表一致。只有当右表和左表是1:1匹配,且你仅查询左表字段时,二者的返回结果才会相同。
内容的提问来源于stack exchange,提问作者Chandra Sekhar Gudipati
相关产品推荐
相关产品推荐

