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

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 本文通俗易懂地讲解了数据库多表查询的三种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语句"较劲"的数据库小白。我们一起把看似复杂的技术,变得简单有趣!💪

相关文章
|
8天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
34507 22
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
20天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
45371 143
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
2天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
3111 11
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
9天前
|
人工智能 JSON 监控
Claude Code 源码泄露:一份价值亿元的 AI 工程公开课
我以为顶级 AI 产品的护城河是模型。读完这 51.2 万行泄露的源码,我发现自己错了。
5012 21
|
2天前
|
人工智能 监控 安全
阿里云SASE 2.0升级,全方位监控Agent办公安全
AI Agent办公场景的“安全底座”
1136 1
|
8天前
|
人工智能 API 开发者
阿里云百炼 Coding Plan 售罄、Lite 停售、Pro 抢不到?最新解决方案
阿里云百炼Coding Plan Lite已停售,Pro版每日9:30限量抢购难度大。本文解析原因,并提供两大方案:①掌握技巧抢购Pro版;②直接使用百炼平台按量付费——新用户赠100万Tokens,支持Qwen3.5-Max等满血模型,灵活低成本。
1993 6
阿里云百炼 Coding Plan 售罄、Lite 停售、Pro 抢不到?最新解决方案

热门文章

最新文章