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

发布于:2025-05-01 ⋅ 阅读:(31) ⋅ 点赞:(0)

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 保留右表全部记录 用得少,了解即可

网站公告

今日签到

点亮在社区的每一天
去签到