当前位置: 首页 > news >正文

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

相关文章:

  • 从零构建大语言模型全栈开发指南:第四部分:工程实践与部署-4.2.3行业案例:智能客服中的图文交互系统
  • 谈谈快速排序算法,其时间复杂度和空间复杂度是多少?
  • 【Office办公】【Excel】VLOOKUP函数-高速查找指定匹配数据,可合并2个表格
  • Bevformer环境配置
  • 数据处理专题(六)
  • SQL、mySQL与SQLite简单理解
  • 2025.4.1英语听力
  • MobPush用户分群功能全新升级,精准触达每一位用户
  • C++---RAII模式
  • 碳化硅 MOSFET三相逆变电路损耗新算法
  • JavaScript元素尺寸与位置
  • NLP高频面试题(二十九)——大模型解码常见参数解析
  • Spark(13)HDFS概述
  • Flutter渲染优化之RepaintBoundary
  • MacOS安装软件及运行时,提示“已损坏无法打开”的解决方案
  • 自定义汇编语言(Custom Assembly Language) 和 Unix Git
  • 中级:Maven面试题精讲
  • Deepseek API+Python 测试用例一键生成与导出 V1.0.6(加入分块策略,返回更完整可靠)
  • Profibus DP 转 ModbusTCP 网关:工业自动化的桥梁
  • 自制AirTag定位器成品使用教程(支持安卓/鸿蒙/iOS/PC等所有系统查看定位器的位置)
  • 网站开发公司职位/海南seo快速排名优化多少钱
  • 南京浦口做网站点/平台接广告在哪里接的
  • 手机网站发布页电脑版/长沙网站推广 下拉通推广
  • ubuntu wordpress教程/海南seo
  • 怎样弄一个自己的网站/德州seo优化
  • 手表网站 云/百度一下官网手机版