当前位置: 首页 > 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保留右表全部记录用得少,了解即可

相关文章:

  • uni-app 中使用 mqtt.js 的完整版
  • 关于百度模型迭代个人见解:技术竞速下的应用价值守恒定律
  • Maven 使用教程
  • 图像生成新势力:GPT-Image-1 与 GPT-4o 在智创聚合 API 的较量
  • 码蹄杯——tips
  • 龙芯远程方案
  • 常用的多传感器数据融合方法
  • 衡石科技:HENGSHI SENSE 数据权限解决方案
  • 从线性回归到逻辑回归
  • Spring XML 外部实体(XXE)指南:示例和预防
  • 使用XMLSpy校验xml是否合法
  • 强化学习中关键超参数的详细说明
  • vue2 开发一个实习管理系统电脑端-前端静态网站练习
  • 基于知识库的客户服务工具
  • Kubernetes学习笔记-环境变量的使用
  • 使用 Vue 3 开发桌面端应用的框架性能对比
  • 图神经网络(GNN)基本概念与核心原理
  • Qt中的全局函数讲解集合(全)
  • IM云端搜索全面升级,独家能力拓展更多“社交连接”玩法
  • Windows server 2019中百度网盘登录中安全验证窗口空白
  • 欧盟官员:欧盟酝酿对美关税政策反制措施,包含所有选项
  • 丁薛祥在学习《习近平经济文选》第一卷专题研讨班上强调,深入学习贯彻习近平经济思想,加强党中央对经济工作的集中统一领导
  • 言短意长|党政主官如何塑造流量城市?
  • 马斯克“星舰基地”成为新城镇,首任市长为SpaceX员工
  • 一金两银一铜!中国田径从柯桥望向世界大赛
  • 跳水世界杯女子单人10米台决赛,陈芋汐、全红婵包揽金银牌