数据库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 字段列表
FROM 表1
INNER JOIN 表2
ON 表1.关联字段 = 表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 字段列表
FROM 表1
LEFT JOIN 表2
ON 表1.关联字段 = 表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 | 保留右表全部记录 | 用得少,了解即可 |