数据库——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 JOINRIGHT JOINUNION实现。

语法

(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 左右表全量 + 匹配合并 需要两表完整数据的统计分析

你可能感兴趣的:(MySQL,数据库,mysql)