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

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS AI 助手,专业版
PolarDB Agent Express,2核4GB
简介: 本文通俗易懂地讲解了数据库多表查询的三种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语句"较劲"的数据库小白。我们一起把看似复杂的技术,变得简单有趣!💪

相关文章
|
2月前
|
SQL 关系型数据库 MySQL
主键、外键和约束:让数据库“有规矩”才能不出错!|转行学DB第5天
本文用通俗易懂的语言讲解了主键(数据的唯一标识)、外键(表间关联)以及唯一约束、非空约束等其他常见约束规则。通过具体SQL示例展示了各种约束的使用方法,并分享了新手容易踩的坑和实用建议。
|
24天前
|
SQL 关系型数据库 MySQL
MySQL慢查询诊断实战:从10秒到0.1秒,我的5步排障法
数据库小学妹分享慢查询优化实战:从10秒降至0.08秒!详解「发现→收集→分析→优化→验证」5步排障法,覆盖慢日志配置、EXPLAIN进阶、索引失效场景、JOIN与分页优化等核心技巧,附真实案例与速查表。
|
2月前
|
SQL 关系型数据库 MySQL
子查询:让SQL像俄罗斯套娃一样嵌套!|转行学DB第8天
数据库小学妹带你轻松入门子查询!用“SELECT里套SELECT”,像俄罗斯套娃一样,一步解决“先算平均分、再查高分学生”等两步难题。支持WHERE(条件筛选)、FROM(临时表)、SELECT(标量列)三种用法,简洁直观,新手友好~
|
2月前
|
SQL 关系型数据库 MySQL
数据量大查询慢?索引让你的SQL秒级响应!|转行学DB第9天
用生活化比喻(如字典目录)详解索引原理:它通过B+树结构加速查询,避免全表扫描;涵盖创建、查看、删除索引方法,联合索引的最左前缀原则,以及读写平衡等实战要点——让查询从“等几秒”变“秒出”!
数据量大查询慢?索引让你的SQL秒级响应!|转行学DB第9天
|
2月前
|
SQL 关系型数据库 MySQL
5款好用的免费MySQL客户端,新手必备!
告别枯燥命令行!数据库小学妹精选5款免费MySQL图形化工具:Workbench(官方全能)、phpMyAdmin(免安装Web版)、DBeaver(多库支持)、HeidiSQL(Windows轻量之选)、TablePlus(高颜值跨平台)。小白友好,语法高亮、自动补全、可视化结构一应俱全,助你高效学SQL!
|
29天前
|
canal 缓存 NoSQL
数据库扛不住高并发?Redis缓存+双写一致性:给你的系统装上“涡轮增压”
数据库小学妹带你破解Redis缓存一致性难题!面对高并发,如何确保Redis与数据库数据同步?详解“先更库后删缓”“延时双删”“Binlog异步同步”等4大方案,直击雪崩、击穿、穿透三座大山,助你构建又快又稳的数据库架构.
|
1月前
|
消息中间件 NoSQL 数据库
分库分表后数据不一致?3种分布式事务方案,帮你彻底解决“钱货不等”难题
本文由“数据库小学妹”详解分布式事务核心难题:分库分表后如何保障跨库数据一致性。涵盖TCC、消息队列(最终一致性)、2PC等方案对比,强调互联网场景首选“MQ+幂等+本地消息表”,并指出避坑要点(重复消费、消息丢失、悬挂问题)。
|
2月前
|
存储 JSON 缓存
告别数据混乱!数据库设计三范式从入门到实践
数据库小学妹带你轻松入门三范式!用“建房打地基”比喻,讲清1NF(列不可分)、2NF(消除部分依赖)、3NF(消除传递依赖),直击数据冗余、更新异常等痛点。附实战拆表案例与反范式化提醒,助你设计出结构清晰、稳定高效的数据库!
|
24天前
|
关系型数据库 MySQL 测试技术
JOIN、IN、EXISTS谁最快?实测三种写法性能差异与执行计划深度剖析
本文用MySQL 8.0实测拆解`IN`/`EXISTS`/`JOIN`子查询性能:从执行计划、半连接优化、临时表开销等底层原理出发,结合10万+100万数据实测(`EXISTS`最快95ms),给出三条选型铁律——告别盲从“最佳实践”,只选最适配业务与数据的写法!