Mysql连接查询之内连接、外连接与复合条件查询完全解析

 更新时间:2026年07月10日 10:13:15   作者:羊小蜜.  
MySQL连接查询通过内连接、外连接(左/右)及全连接实现多表数据关联,下面这篇文章主要介绍了Mysql连接查询之内连接、外连接与复合条件查询的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在 MySQL 中,连接查询(JOIN) 是多表数据关联查询的核心语法,用于从两张及以上表中提取关联数据。本文围绕图片中的核心知识点,从语法、场景、代码示例三个维度,带你彻底掌握 MySQL 连接查询。

一、核心知识点总览

连接类型语法核心逻辑结果特点
内连接(INNER JOIN)A INNER JOIN B ON 关联条件只返回两张表中匹配成功的记录无匹配数据不显示
左连接(LEFT JOIN)A LEFT JOIN B ON 关联条件左表 A 为基准,匹配右表 B;左表全显示,右表无匹配则补 NULL左表数据完整,右表按需补空
右连接(RIGHT JOIN)A RIGHT JOIN B ON 关联条件右表 B 为基准,匹配左表 A;右表全显示,左表无匹配则补 NULL右表数据完整,左表按需补空
复合条件连接连接查询 + 多条件过滤在连接基础上,追加 WHERE/ON 多条件筛选精准过滤关联数据

二、准备测试数据

先创建两张关联表,用于后续所有示例:

1. 学生表student(左表)

CREATE TABLE score (
    score_id INT PRIMARY KEY AUTO_INCREMENT,
    stu_id INT NOT NULL,
    subject VARCHAR(20) NOT NULL,
    score INT NOT NULL,
    FOREIGN KEY (stu_id) REFERENCES student(stu_id)
);
INSERT INTO score (stu_id, subject, score) VALUES
(1, '语文', 85),
(1, '数学', 92),
(2, '语文', 78),
(3, '数学', 88); -- 赵六(stu_id=4)无成绩

2. 成绩表score(右表)

CREATE TABLE score (
    score_id INT PRIMARY KEY AUTO_INCREMENT,
    stu_id INT NOT NULL,
    subject VARCHAR(20) NOT NULL,
    score INT NOT NULL,
    FOREIGN KEY (stu_id) REFERENCES student(stu_id)
);
INSERT INTO score (stu_id, subject, score) VALUES
(1, '语文', 85),
(1, '数学', 92),
(2, '语文', 78),
(3, '数学', 88); -- 赵六(stu_id=4)无成绩

三、各连接类型详解 + 代码示例

1. 内连接查询(INNER JOIN)

核心逻辑

内连接是最常用的连接方式,只返回两张表中满足关联条件的记录,相当于 “取两张表的交集”。

  • 等价语法:SELECT * FROM A,B WHERE A.id = B.id(隐式内连接)
  • 标准语法:SELECT * FROM A INNER JOIN B ON A.id = B.id(显式内连接,推荐)

代码示例

-- 显式内连接:查询有成绩的学生信息+成绩
SELECT 
    s.stu_id, s.stu_name, s.class, 
    sc.subject, sc.score
FROM student s
INNER JOIN score sc 
    ON s.stu_id = sc.stu_id;

运行结果

stu_idstu_nameclasssubjectscore
1张三一班语文85
1张三一班数学92
2李四二班语文78
3王五一班数学88

说明

  • 赵六(stu_id=4)无成绩,内连接中不会显示,因为右表无匹配数据。

2. 外连接查询

外连接会以某一张表为基准,保留基准表的所有数据,另一张表无匹配则补 NULL,分为左连接右连接

(1)左连接(LEFT JOIN)

核心逻辑

左表为基准,左表所有记录全部显示,右表匹配到则显示数据,匹配不到则补 NULL

  • 语法:A LEFT JOIN B ON 关联条件(A 是左表,B 是右表)

代码示例

-- 左连接:以学生表为基准,查询所有学生(含无成绩的赵六)
SELECT 
    s.stu_id, s.stu_name, s.class, 
    sc.subject, sc.score
FROM student s
LEFT JOIN score sc 
    ON s.stu_id = sc.stu_id;

运行结果

stu_idstu_nameclasssubjectscore
1张三一班语文85
1张三一班数学92
2李四二班语文78
3王五一班数学88
4赵六三班NULLNULL

说明

  • 左表(学生表)的所有学生都显示,赵六无成绩,右表字段补 NULL

(2)右连接(RIGHT JOIN)

核心逻辑

右表为基准,右表所有记录全部显示,左表匹配到则显示数据,匹配不到则补 NULL

  • 语法:A RIGHT JOIN B ON 关联条件(B 是右表,A 是左表)
  • 本质:A LEFT JOIN B 等价于 B RIGHT JOIN A,可互相转换,实际开发中优先用左连接(可读性更强)

代码示例

-- 右连接:以成绩表为基准,查询所有成绩(无学生的成绩不会出现,本例无此场景)
SELECT 
    s.stu_id, s.stu_name, s.class, 
    sc.subject, sc.score
FROM student s
RIGHT JOIN score sc 
    ON s.stu_id = sc.stu_id;

运行结果

与内连接结果完全一致(因为成绩表的所有记录都能匹配到学生表)。

3. 复合条件连接查询

核心逻辑

在连接查询的基础上,追加多个过滤条件,精准筛选关联数据。条件可写在 ON 子句(连接时过滤)或 WHERE 子句(连接后过滤)。

代码示例 1:连接 + 单条件过滤

-- 左连接+WHERE:查询一班所有学生(含无成绩)
SELECT 
    s.stu_id, s.stu_name, s.class, 
    sc.subject, sc.score
FROM student s
LEFT JOIN score sc 
    ON s.stu_id = sc.stu_id
WHERE s.class = '一班';

运行结果

stu_idstu_nameclasssubjectscore
1张三一班语文85
1张三一班数学92
3王五一班数学88

代码示例 2:多条件复合连接

-- 复合条件:左连接+多条件,查询一班成绩>80的学生,无成绩也显示
SELECT 
    s.stu_id, s.stu_name, s.class, 
    sc.subject, sc.score
FROM student s
LEFT JOIN score sc 
    ON s.stu_id = sc.stu_id 
    AND sc.score > 80  -- 连接时过滤成绩>80
WHERE s.class = '一班'; -- 过滤班级

运行结果

stu_idstu_nameclasssubjectscore
1张三一班数学92
3王五一班数学88

关键说明:ON与WHERE的区别

  • ON 子句:连接时过滤,只影响右表的匹配,不影响左表的显示(左表仍全显示)
  • WHERE 子句:连接后过滤,会直接过滤最终结果,不符合条件的行直接删除

四、核心对比与避坑指南

1. 内连接 vs 外连接 核心区别

场景推荐连接原因
只需要匹配成功的数据内连接结果最精简,性能最优
需要保留左表所有数据左连接左表完整,右表补空
需要保留右表所有数据右连接可转换为左连接,优先用左连接

2. 常见避坑

1.关联条件缺失:多表连接必须加 ON 关联条件,否则会产生笛卡尔积(数据爆炸)

-- 错误!无关联条件,笛卡尔积
SELECT * FROM student, score;

2.ONWHERE 混用:外连接中,WHERE 会过滤左表数据,导致外连接失效

-- 错误!WHERE sc.score>80 会过滤掉赵六的NULL行,左连接变内连接
SELECT * FROM student s LEFT JOIN score sc ON s.stu_id=sc.stu_id WHERE sc.score>80;

3.表别名不规范:多表同名字段必须加表别名,否则报错

-- 错误!stu_id 不明确属于哪个表
SELECT stu_id FROM student s JOIN score sc ON s.stu_id=sc.stu_id;
-- 正确:加表别名
SELECT s.stu_id FROM student s JOIN score sc ON s.stu_id=sc.stu_id;

五、综合实战:多表连接 + 复合条件

-- 需求:查询所有学生的总分,无成绩的学生总分显示0,按班级分组
SELECT 
    s.class,
    s.stu_name,
    IFNULL(SUM(sc.score), 0) AS total_score  -- IFNULL 把NULL转为0
FROM student s
LEFT JOIN score sc 
    ON s.stu_id = sc.stu_id
GROUP BY s.stu_id, s.stu_name, s.class
ORDER BY total_score DESC;

运行结果

classstu_nametotal_score
一班张三177
一班王五88
二班李四78
三班赵六0

六、核心总结

  1. 内连接:取交集,只显示匹配数据
  2. 左连接:左表全显,右表补空;右连接:右表全显,左表补空
  3. 复合条件ON 过滤连接,WHERE 过滤结果,不可混用
  4. 避坑关键:必须加关联条件,同名字段加别名,外连接慎用 WHERE 过滤
  5. 性能优化:大表连接优先用内连接,关联字段加索引,避免笛卡尔积

到此这篇关于Mysql连接查询之内连接、外连接与复合条件查询完全解析的文章就介绍到这了,更多相关Mysql内连接、外连接与复合条件查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL INSERT语句实现当记录不存在时插入的几种方法

    MySQL INSERT语句实现当记录不存在时插入的几种方法

    MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面这篇文章主要介绍了MySQL INSERT语句实现当记录不存在时插入的几种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • MySQL 4.1/5.0/5.1/5.5/5.6各版本的主要区别整理

    MySQL 4.1/5.0/5.1/5.5/5.6各版本的主要区别整理

    这篇文章主要介绍了MySQL 4.1/5.0/5.1/5.5/5.6各版本的主要区别整理,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-08-08
  • MySQL中TINYINT、INT 和 BIGINT的具体使用

    MySQL中TINYINT、INT 和 BIGINT的具体使用

    MySQL提供了多种整数类型来满足不同的数据存储需求,本文主要介绍了MySQL中TINYINT、INT 和 BIGINT的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • Sphinx/MySQL 协议支持与SphinxQL应用实例

    Sphinx/MySQL 协议支持与SphinxQL应用实例

    Sphinx/MySQL 协议支持与SphinxQL应用例子,供大家学习参考
    2013-02-02
  • MYSQL SET类型字段的SQL操作知识介绍

    MYSQL SET类型字段的SQL操作知识介绍

    本篇文章是对MYSQL中SET类型字段的SQL操作知识进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • Linux下mysql 5.6.17 安装图文教程

    Linux下mysql 5.6.17 安装图文教程

    这篇文章主要为大家详细介绍了Linux下mysql 5.6.17 安装图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 为MySQL中的JSON字段设置索引的两种方法

    为MySQL中的JSON字段设置索引的两种方法

    MySQL在2015年中发布的5.7.8版本中首次引入了JSON数据类型,自此,它成了一种逃离严格列定义的方式,可以存储各种形状和大小的JSON文档,虽然MySQL提供了读写JSON数据的函数,但JSON缺失了索引功能,本文介绍了如何为MySQL中的JSON字段设置索引,需要的朋友可以参考下
    2025-09-09
  • MySQL FIND_IN_SET 函数实战实例

    MySQL FIND_IN_SET 函数实战实例

    FIND_IN_SET是MySQL处理分隔字符串的函数,用于判断字符串是否存在于列表中,返回位置或0,适用于标签、分类等多值场景,但无法使用索引,性能较差,建议结合替代方案或优化设计,注意大小写敏感和空值处理问题,对mysql find_in_set函数感兴趣的朋友一起看看吧
    2025-07-07
  • MySQL数据库的事务和索引详解

    MySQL数据库的事务和索引详解

    这篇文章主要介绍了MySql 索引和事务,总结分析了mysql数据库中关于索引和事务的概念、原理、知识点及相关注意事项,需要的朋友可以参考下
    2021-10-10
  • MySQL教程彻底学懂存储过程

    MySQL教程彻底学懂存储过程

    这篇文章主要为大家介绍了MySQL系列的存储过程,文中详细的为大家解释存储过程的相关概念及用法语法,以及对存储过程的理解解析,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10

最新评论