数据库——MySQL连接表
一、数据准备
示例表结构
为便于演示,我们创建两个简单表:学生表(students)和成绩表(scores)。
-- 学生表
CREATE TABLE students (
student_id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 成绩表
CREATE TABLE scores (
score_id INT PRIMARY KEY,
student_id INT,
subject VARCHAR(20),
score DECIMAL(5,2)
);
-- 插入数据
INSERT INTO students VALUES
(1, '张三'),
(2, '李四'),
(3, '王五'),
(4, '赵六');
INSERT INTO scores VALUES
(1, 1, '数学', 90),
(2, 1, '英语', 85),
(3, 2, '数学', 78),
(4, 3, '物理', 92),
(5, 5, '化学', 88); -- 注意:student_id=5在students表中不存在
二、内连接(INNER JOIN)
定义
内连接仅返回两个表中匹配的记录。
语法
SELECT 列名
FROM 表1
INNER JOIN 表2 ON 表1.字段 = 表2.字段;
示例
SELECT s.name, sc.subject, sc.score
FROM students s
INNER JOIN scores sc ON s.student_id = sc.student_id;
输出
name | subject | score
张三 | 数学 | 90
张三 | 英语 | 85
李四 | 数学 | 78
王五 | 物理 | 92
应用场景
需要获取两个表完全匹配的数据,例如查询有成绩记录的学生信息。
三、左连接(LEFT JOIN)
定义
左连接返回左表(FROM
后的表)的所有记录,以及右表中匹配的记录。若右表无匹配,则填充NULL
。
语法
SELECT 列名
FROM 表1
LEFT JOIN 表2 ON 表1.字段 = 表2.字段;
示例
SELECT s.name, sc.subject, sc.score
FROM students s
LEFT JOIN scores sc ON s.student_id = sc.student_id;
输出
name | subject | score
张三 | 数学 | 90
张三 | 英语 | 85
李四 | 数学 | 78
王五 | 物理 | 92
赵六 | NULL | NULL
应用场景
需要获取左表全部数据,即使右表无匹配。例如,列出所有学生及其成绩(包括无成绩的学生)。
四、右连接(RIGHT JOIN)
定义
右连接返回右表的所有记录,以及左表中匹配的记录。若左表无匹配,则填充NULL
。
语法
SELECT 列名
FROM 表1
RIGHT JOIN 表2 ON 表1.字段 = 表2.字段;
示例
SELECT s.name, sc.subject, sc.score
FROM students s
RIGHT JOIN scores sc ON s.student_id = sc.student_id;
输出
name | subject | score
张三 | 数学 | 90
张三 | 英语 | 85
李四 | 数学 | 78
王五 | 物理 | 92
NULL | 化学 | 88 -- scores表中student_id=5在students表中不存在
应用场景
需要获取右表全部数据,即使左表无匹配。例如,列出所有成绩记录及其对应的学生(包括无学生信息的成绩)。
五、全连接(FULL OUTER JOIN)
定义
全连接返回左右两表的所有记录,匹配部分合并,不匹配部分填充NULL
。
注意:MySQL原生不支持
FULL OUTER JOIN
,但可通过LEFT JOIN
和RIGHT JOIN
的UNION
实现。
语法
(SELECT 列名 FROM 表1 LEFT JOIN 表2 ON 条件)
UNION
(SELECT 列名 FROM 表1 RIGHT JOIN 表2 ON 条件);
示例
(SELECT s.name, sc.subject, sc.score
FROM students s
LEFT JOIN scores sc ON s.student_id = sc.student_id)
UNION
(SELECT s.name, sc.subject, sc.score
FROM students s
RIGHT JOIN scores sc ON s.student_id = sc.student_id);
输出
name | subject | score
张三 | 数学 | 90
张三 | 英语 | 85
李四 | 数学 | 78
王五 | 物理 | 92
赵六 | NULL | NULL
NULL | 化学 | 88
应用场景
需要同时获取两表所有数据,例如统计完整的学生和成绩信息(包括无匹配记录的情况)。
六、对比与总结
连接类型 | 描述 | 适用场景 |
---|---|---|
INNER JOIN | 仅返回匹配记录 | 需要精确匹配的关联查询 |
LEFT JOIN | 左表全量 + 右表匹配 | 保留左表所有记录 |
RIGHT JOIN | 右表全量 + 左表匹配 | 保留右表所有记录 |
FULL JOIN | 左右表全量 + 匹配合并 | 需要两表完整数据的统计分析 |