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

MySQL 进阶专题:笛卡尔积内连接外连接详解(JOIN ON/ OUTER JOIN)

从笛卡尔积到 JOIN 的全面解析

什么是笛卡尔积?

笛卡尔积是 SQL 中两个表在没有任何连接条件的情况下进行组合时的结果。每个表中的行会与另一个表的每一行进行配对,从而生成巨大的数据量。

示例:

假设有两个表:

student

idname
1张三
2李四

score

idstudent_idscore
1180
2190
3270

执行如下查询:

SELECT *
FROM student, score;

结果:

student.idstudent.namescore.idscore.student_idscore.score
1张三1180
1张三2190
1张三3270
2李四1180
2李四2190
2李四3270

这里生成了 student 表和 score 表所有行的笛卡尔积,总共有 6 行。这种结果通常是我们不希望出现的,因为它没有任何逻辑意义。

添加条件过滤笛卡尔积

为了避免笛卡尔积的无意义结果,我们需要添加过滤条件,将关联的表按逻辑连接起来。

示例:
SELECT *
FROM student, score
WHERE student.id = score.student_id;

结果:

student.idstudent.namescore.idscore.student_idscore.score
1张三1180
1张三2190
2李四3270

通过 WHERE 子句,我们将 student.idscore.student_id 进行匹配,过滤掉了无意义的组合。

使用 JOIN 优化连接

虽然使用 WHERE 可以避免笛卡尔积,但在语义上显得不够直观。而 JOIN 提供了一种更清晰的写法,明确表达了表与表之间的关系。

示例:
SELECT *
FROM student
JOIN score ON student.id = score.student_id;

结果与上述相同,但语义更清晰:

student.idstudent.namescore.idscore.student_idscore.score
1张三1180
1张三2190
2李四3270

内连接 (INNER JOIN)

内连接是最常用的连接类型,用于返回两个表中满足连接条件的记录。

示例:
SELECT student.name, score.score
FROM student
INNER JOIN score ON student.id = score.student_id;

结果:

namescore
张三80
张三90
李四70
特点:
  • 只返回两个表中满足条件的记录。
  • 默认情况下,JOIN 等价于 INNER JOIN

外连接 (OUTER JOIN)

外连接分为左连接 (LEFT JOIN)、右连接 (RIGHT JOIN) 和全连接 (FULL OUTER JOIN)。

左连接 (LEFT JOIN)

左连接返回左表的所有记录,以及右表中满足条件的记录。如果右表中没有匹配项,则对应的列返回 NULL

示例:
SELECT student.name, score.score
FROM student
LEFT JOIN score ON student.id = score.student_id;

结果:

namescore
张三80
张三90
李四70
王五NULL
右连接 (RIGHT JOIN)

右连接返回右表的所有记录,以及左表中满足条件的记录。如果左表中没有匹配项,则对应的列返回 NULL

示例:
SELECT student.name, score.score
FROM student
RIGHT JOIN score ON student.id = score.student_id;

结果:与左连接类似,只是记录方向相反。

结合 GROUP BY 的案例

在实际业务中,除了表连接,我们还经常需要对数据进行分组统计。

示例:
SELECT student.id AS id, student.name, SUM(score.score) AS total_score
FROM student
JOIN score ON student.id = score.student_id
GROUP BY student.id;

结果:

idnametotal_score
1张三170
2李四70

这里我们通过 GROUP BY 对每个学生的成绩进行了汇总统计。

总结

  1. 笛卡尔积 是表连接的基础,但结果可能不符合实际需求。
  2. 使用 WHERE 可以过滤笛卡尔积,但写法不够直观。
  3. 使用 JOIN 是更推荐的做法,语义清晰且功能强大。
  4. 内连接用于返回两个表中满足条件的记录。
  5. 外连接可以返回一个表的所有记录,适用于需要保留部分空值的场景。
  6. 结合 GROUP BY,可以对连接后的数据进行分组和统计。

http://www.kler.cn/a/530451.html

相关文章:

  • 北京门头沟区房屋轮廓shp的arcgis数据建筑物轮廓无偏移坐标测评
  • OpenAI开源战略反思:中国力量推动AI产业变革
  • C# 类与对象详解
  • Rust 控制流语法详解
  • Sqoop导入MySQL中含有回车换行符的数据
  • React
  • C++进阶: 红黑树及map与set封装
  • 智慧物业管理系统实现社区管理智能化提升居民生活体验与满意度
  • 垃圾回收之弱引用+实例说明+weakSet+weakMap
  • 硕成C语言4
  • 【Conda 和 虚拟环境详细指南】
  • 飞行汽车与人形机器人,无刷外转子电机与无框力矩电机,接小鹏飞行汽车后续
  • Rust 数据类型详解:Scalar 与 Compound 类型
  • Hot100之二分查找
  • 深度卷积神经网络实战无人机视角目标识别
  • (笔记+作业)书生大模型实战营春节卷王班---L1G3000 浦语提示词工程实践
  • MySQL入门 – CRUD基本操作
  • 洛谷 P1130 红牌 C语言
  • 亲和传播聚类算法应用(Affinity Propagation)
  • javaEE-7.网络原理-HTTPS
  • 2.2.1 人眼色觉与色度图
  • 实验十 Servlet(一)
  • C# 操作符重载对象详解
  • DeepSeek的出现对全球GPT产业产生的冲击
  • 【JAVA篇】------ spring aop
  • 【C语言设计模式学习笔记1】面向接口编程/简单工厂模式/多态