当前位置: 首页 > news >正文

数据库MySQL学习——day6(多表查询(JOIN)基础)

文章目录

  • 1、关系型数据库中的表关系
  • 2、连接(JOIN)的基本概念
  • 3、INNER JOIN(内连接)
    • 3.1. 概念
    • 3.2. 语法结构
  • 4、LEFT JOIN(左连接)
    • 4.1. 概念
    • 4.2. 语法结构
  • 5、RIGHT JOIN(右连接)(了解)
  • 6、实践任务
    • 6.2. 用 INNER JOIN 查询选课信息
    • 6.3. 用 LEFT JOIN 查询所有学生及选课情况
  • 7、今日小结

1、关系型数据库中的表关系

在实际数据库设计中,不同的表之间通过字段建立联系,常见的关系有:

类型说明示例
一对一(1:1)一个表中的一条记录对应另一个表中的一条记录用户表与用户详情表
一对多(1:N)一个表中的一条记录对应另一个表中的多条记录学生表与成绩表(一个学生有多门成绩)
多对多(M:N)多条记录对应多条记录,中间需要第三张表关联学生选课(一个学生选多门课,一门课有多名学生)

2、连接(JOIN)的基本概念

JOIN 用来根据两个表之间的关系,把相关联的数据查询出来。
常见的 JOIN 类型有:

JOIN 类型作用
INNER JOIN(内连接)只返回两个表中匹配的记录
LEFT JOIN(左连接)返回左表所有记录,即使右表没有匹配
RIGHT JOIN(右连接)返回右表所有记录,即使左表没有匹配(了解即可)

3、INNER JOIN(内连接)

3.1. 概念

  • 只返回两个表中 有匹配关系 的记录。
  • 如果在任一表中找不到匹配记录,该行不会出现在结果中。

3.2. 语法结构

SELECT 字段列表
FROM1
INNER JOIN2
ON1.关联字段 =2.关联字段;
  • 示例:查询学生及其选修的课程名称
    假设有以下两张表:
-- 学生表
CREATE TABLE student (student_id INT PRIMARY KEY,name VARCHAR(100)
);-- 选课表
CREATE TABLE enrollment (enroll_id INT PRIMARY KEY,student_id INT,course_name VARCHAR(100)
);

查询每个学生选修的课程:

SELECT student.name, enrollment.course_name
FROM student
INNER JOIN enrollment ON student.student_id = enrollment.student_id;
  • 结果 :只显示那些有选课记录的学生及其课程。

4、LEFT JOIN(左连接)

4.1. 概念

  • 返回左表(第一个表)的所有记录。
  • 如果右表中有匹配记录,则显示;如果没有匹配,右表字段显示 NULL。

4.2. 语法结构

SELECT 字段列表
FROM1
LEFT JOIN2
ON1.关联字段 =2.关联字段;
  • 示例:列出所有学生及他们对应的选课,如果没选课显示空值
SELECT student.name, enrollment.course_name
FROM student
LEFT JOIN enrollment ON student.student_id = enrollment.student_id;
  • 结果 :即使有的学生没有选课记录,仍然会显示学生姓名,选课栏为 NULL。

5、RIGHT JOIN(右连接)(了解)

  • RIGHT JOIN 与 LEFT JOIN 类似,只是它保留的是右表的所有记录,即使左表中没有匹配。
  • 语法示例(仅了解):
SELECT student.name, enrollment.course_name
FROM student
RIGHT JOIN enrollment ON student.student_id = enrollment.student_id;
  • 使用场景较少,通常通过调整表顺序+LEFT JOIN可以代替。

6、实践任务

6.1. 创建两个表

-- 学生表
CREATE TABLE student (student_id INT PRIMARY KEY,name VARCHAR(100)
);-- 选课表
CREATE TABLE enrollment (enroll_id INT PRIMARY KEY,student_id INT,course_name VARCHAR(100)
);-- 插入学生数据
INSERT INTO student (student_id, name) VALUES
(1, '张三'),
(2, '李四'),
(3, '王五');-- 插入选课数据
INSERT INTO enrollment (enroll_id, student_id, course_name) VALUES
(1, 1, '数学'),
(2, 1, '英语'),
(3, 2, '物理');

6.2. 用 INNER JOIN 查询选课信息

SELECT student.name, enrollment.course_name
FROM student
INNER JOIN enrollment ON student.student_id = enrollment.student_id;

结果 :张三选了数学和英语,李四选了物理,王五没有记录,不会出现在结果中。

6.3. 用 LEFT JOIN 查询所有学生及选课情况

SELECT student.name, enrollment.course_name
FROM student
LEFT JOIN enrollment ON student.student_id = enrollment.student_id;

结果 :张三、李四、王五都会出现;王五因为没有选课,course_name 显示 NULL。

7、今日小结

内容关键词说明
多表关系一对一、一对多、多对多数据表之间常见的组织关系
INNER JOIN只返回匹配的记录双方都有数据才能显示
LEFT JOIN保留左表全部记录右表没有匹配的用 NULL 填充
RIGHT JOIN保留右表全部记录用得少,了解即可
http://www.xdnf.cn/news/177355.html

相关文章:

  • A系统使用iframe嵌套B系统时登录跨域问题!
  • 分享:google高级搜索常用的4个入口
  • Python中的协程(Coroutine)
  • 机器人抓取位姿检测——GRCN训练及测试教程(Pytorch)
  • 【Linux】Centos7 在 Docker 上安装 Redis7.0(最新详细教程)
  • 计算机视觉算法 segment anything 论文解读
  • 英文中数字读法规则
  • 设计模式全解析:23种经典设计模式及其应用
  • Javase 基础入门 —— 05 多态
  • 【AM2634】 RTI
  • MCP+A2A协议终极指南:AI系统构建技术全解析(医疗/金融实战+Streamable HTTP代码详解)
  • @RequiredArgsConstructor和@AllArgsConstructor的区别
  • 深度图像报错
  • 大模型时代的具身智能:从虚拟到现实的智能体进化革命
  • Spark-Streaming核心编程(四)总结
  • Revive 中的 Precompile 合约:实现与调用机制
  • 学习海康VisionMaster之路径提取
  • 怎么检测代理IP延迟?如何选择低延迟代理?
  • 《明解C语言入门篇》读书笔记四
  • 总线位宽不变,有效数据位宽变化的缓存方案
  • 颠覆传统微商!开源AI智能名片链动2+1模式S2B2C商城小程序:重构社交电商的“降维打击”革命
  • 常见锁策略
  • 再学GPIO(二)
  • 02 业务流程架构
  • npm、pnpm 和 yarn 包管理工具
  • 【密码学——基础理论与应用】李子臣编著 第八章 SM2公钥密码算法 课后习题
  • LeetCode3☞无重复字符的最长子串
  • 辞九门回忆
  • 深入理解编程中的同步与异步:原理、区别及实战应用
  • Go 语言中的 `select` 语句详解