多表关联查询入门:LEFT JOIN、INNER JOIN一文搞懂|转行学DB第6天

简介: 本文通俗易懂地讲解了数据库多表查询的三种JOIN操作:INNER JOIN(内连接)只返回两表匹配的数据,适用于查询交集数据;LEFT JOIN(左连接)保留左表所有记录并匹配右表数据,适用于查询主表完整信息;RIGHT JOIN(右连接)则保留右表所有记录。

🤔 为什么查询数据要"连表"?一张图说清多表查询的底层逻辑!

大家好呀!我是数据库小学妹👋一个正在从设计转行学数据库的"萌新"。

昨天学完主键、外键和约束后,我就在想一个问题:

"我有学生表,也有成绩表,怎么一次性查出'每个学生的姓名和成绩'?"

但现实中的数据往往分散在多个表里! 这时候,就需要用到多表关联查询了!

今天这篇,我就用最直白的话,把INNER JOIN、LEFT JOIN、RIGHT JOIN讲清楚!
保证你一看就懂!


一、为什么需要多表关联查询?

先看个实际场景:

学生表(students)

id name age
1 张三 18
2 李四 19
3 王五 20

成绩表(scores)

id student_id subject score
1 1 数学 90
2 1 英语 85
3 2 数学 78

需求​:查出每个学生的姓名数学成绩

❌ ​错误做法​:分别查两个表,然后手动匹配
✅ ​正确做法​:用JOIN把两个表"连"起来!

💡 ​核心逻辑​:通过​外键关联​,把分散在不同表的数据"拼"在一起!


二、INNER JOIN:只查"都有"的数据

INNER JOIN = 内连接 = 只返回两个表都有的数据

✨ 适用场景:

  • 查"既有学生信息又有成绩记录"的数据
  • 查"既有订单又有用户"的数据

🛠️ 语法:

SELECT students.name, scores.score
FROM students
INNER JOIN scores ON students.id = scores.student_id;

📊 效果:

稿定设计-1.jpg

结果:只返回张三和李四(王五没成绩,不显示)

💡 ​我的理解​:

INNER JOIN就像​交集​——只保留两个表都有的部分!


三、LEFT JOIN:以左表为主,查"左边所有"

LEFT JOIN = 左连接 = 返回左表所有数据 + 右表匹配的数据

✨ 适用场景:

  • 查"所有学生",包括没有成绩的
  • 查"所有用户",包括没有订单的

🛠️ 语法:

SELECT students.name, scores.score
FROM students
LEFT JOIN scores ON students.id = scores.student_id;

📊 效果图:

稿定设计-2.jpg

结果:张三、李四、王五都显示(王五成绩为NULL)

💡 ​我的理解​:

LEFT JOIN就像​左表的全部 + 右表的匹配部分​!
"左"字诀:左边的都要,右边的有就拿,没有就NULL!


四、RIGHT JOIN:以右表为主,查"右边所有"

RIGHT JOIN = 右连接 = 返回右表所有数据 + 左表匹配的数据

✨ 适用场景:

  • 查"所有成绩",包括没有学生信息的(数据异常时用)
  • 查"所有订单",包括没有用户信息的

🛠️ 语法:

SELECT students.name, scores.score
FROM students
RIGHT JOIN scores ON students.id = scores.student_id;

📊 效果图:

稿定设计-3.jpg

结果:所有成绩都显示(如果成绩表有学生表没有的数据,也会显示)

💡 ​我的理解​:

RIGHT JOIN和LEFT JOIN相反,"右"字诀:右边的都要,左边的有就拿,没有就NULL!


五、一张图说清三种JOIN的区别

图片排版设计 (1).png


六、实战案例:学生管理系统查询

案例1:查所有学生的数学成绩(包括没成绩的)

SELECT students.name, scores.score
FROM students
LEFT JOIN scores 
    ON students.id = scores.student_id 
    AND scores.subject = '数学';

案例2:查有成绩记录的学生

SELECT students.name, scores.score
FROM students
INNER JOIN scores ON students.id = scores.student_id;

案例3:查所有成绩记录(包括异常数据)

SELECT students.name, scores.score
FROM students
RIGHT JOIN scores ON students.id = scores.student_id;

七、常见误区

常见错误 正确做法
忘记写 ON 条件 会产生​笛卡尔积​(A表每行 × B表每行),数据爆炸
ON 条件写错(比如 s.id = sc.id 仔细检查关联字段是不是外键关系
列名重复不指定表名 表名.列名 或别名区分
用 INNER JOIN 查不到没有匹配的数据 如果想查所有学生(即使没成绩),用 LEFT JOIN

我踩过的坑:忘记写 ON,结果学生表3行 × 成绩表3行 = 9行,完全乱了套。后来才知道那叫“笛卡尔积”,吓得我赶紧加上条件。


八、学习心得

📝 ​核心总结​:

  1. INNER JOIN = 都要有 = 交集
  2. LEFT JOIN = 左表全 = 左边的都要
  3. RIGHT JOIN = 右表全 = 右边的都要

💡 ​实用建议​:

  • 80%的场景用LEFT JOIN​(查主表所有数据)
  • INNER JOIN用于筛选​(只查匹配的数据)
  • RIGHT JOIN用得少​(可以用LEFT JOIN反过来写)

👋 我是数据库小学妹,一个每天都在和SQL语句"较劲"的数据库小白。我们一起把看似复杂的技术,变得简单有趣!💪

相关文章
|
3月前
|
SQL 关系型数据库 MySQL
子查询:让SQL像俄罗斯套娃一样嵌套!|转行学DB第8天
数据库小学妹带你轻松入门子查询!用“SELECT里套SELECT”,像俄罗斯套娃一样,一步解决“先算平均分、再查高分学生”等两步难题。支持WHERE(条件筛选)、FROM(临时表)、SELECT(标量列)三种用法,简洁直观,新手友好~
|
3月前
|
SQL 关系型数据库 MySQL
数据量大查询慢?索引让你的SQL秒级响应!|转行学DB第9天
用生活化比喻(如字典目录)详解索引原理:它通过B+树结构加速查询,避免全表扫描;涵盖创建、查看、删除索引方法,联合索引的最左前缀原则,以及读写平衡等实战要点——让查询从“等几秒”变“秒出”!
数据量大查询慢?索引让你的SQL秒级响应!|转行学DB第9天
|
2月前
|
SQL 关系型数据库 MySQL
MySQL慢查询诊断实战:从10秒到0.1秒,我的5步排障法
数据库小学妹分享慢查询优化实战:从10秒降至0.08秒!详解「发现→收集→分析→优化→验证」5步排障法,覆盖慢日志配置、EXPLAIN进阶、索引失效场景、JOIN与分页优化等核心技巧,附真实案例与速查表。
|
3月前
|
SQL 关系型数据库 MySQL
主键、外键和约束:让数据库“有规矩”才能不出错!|转行学DB第5天
本文用通俗易懂的语言讲解了主键(数据的唯一标识)、外键(表间关联)以及唯一约束、非空约束等其他常见约束规则。通过具体SQL示例展示了各种约束的使用方法,并分享了新手容易踩的坑和实用建议。
|
1月前
|
SQL 存储 关系型数据库
覆盖索引:让你的查询直接从索引返回,彻底告别回表
覆盖索引是SQL优化中性价比较高的技巧,让查询直接从索引返回所需列,避免回表操作。本文解释覆盖索引的原理,通过EXPLAIN的“Using index”判断是否生效。结合复合索引设计、深分页优化(延迟关联)等场景,给出覆盖索引的使用方法和注意事项。用好覆盖索引,不改SQL逻辑,仅调整索引设计即可显著提升查询性能。
|
3月前
|
SQL 关系型数据库 MySQL
WHERE、ORDER BY、LIMIT三大神器,让你的查询精准又高效!
本文介绍了SQL查询中的三大核心语句:WHERE(条件过滤)、ORDER BY(排序)和LIMIT(限制结果数)。通过电商订单查询、用户活跃度分析等实际案例,展示了如何组合使用这些语句实现精准查询。文章还分享了常见避坑技巧(如字符串引号使用、NULL值判断)和性能优化建议(如索引使用、分页查询优化)。
|
2月前
|
canal 缓存 NoSQL
数据库扛不住高并发?Redis缓存+双写一致性:给你的系统装上“涡轮增压”
数据库小学妹带你破解Redis缓存一致性难题!面对高并发,如何确保Redis与数据库数据同步?详解“先更库后删缓”“延时双删”“Binlog异步同步”等4大方案,直击雪崩、击穿、穿透三座大山,助你构建又快又稳的数据库架构.
|
2月前
|
消息中间件 NoSQL 数据库
分库分表后数据不一致?3种分布式事务方案,帮你彻底解决“钱货不等”难题
本文由“数据库小学妹”详解分布式事务核心难题:分库分表后如何保障跨库数据一致性。涵盖TCC、消息队列(最终一致性)、2PC等方案对比,强调互联网场景首选“MQ+幂等+本地消息表”,并指出避坑要点(重复消费、消息丢失、悬挂问题)。
|
3月前
|
SQL 关系型数据库 MySQL
SQL优化十大技巧,查询速度提升10倍!
数据库小学妹带你轻松提速SQL!10个实战优化技巧:精简SELECT、善用LIMIT、巧用EXPLAIN、合理建索引、避开函数索引失效、JOIN优于子查询、IN替代OR、批量操作、EXISTS优化大子查询、定期OPTIMIZE。附避坑指南,新手也能秒上手!
|
1月前
|
SQL 关系型数据库 MySQL
SQL代码审查指南:命名规范+10大反模式+四维检查清单,一篇全搞定
数据库小学妹带你攻克SQL规范难题!从命名、格式到10大反模式(如SELECT*、隐式转换、ORDER BY RAND等),结合真实踩坑案例,详解可读、可维护、高性能的SQL写法,并提供SQL Review四维审查清单与团队落地方法,助你写出工业级质量SQL。

热门文章

最新文章