MySQL JOIN 关联语句

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/

截止目前, 星球 内专栏累计输出 72w+ 字,讲解图 3103+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2400+ 小伙伴加入学习 ,欢迎点击围观

在 MySQL 中,JOIN 操作用于从多个表中查询相关联的数据。 通过 JOIN 可以把符合条件的数据从不同的表合并在一起,使得复杂的数据查询和关联分析更加便捷。

MySQL 中常见的 JOIN 类型有:INNER JOINLEFT JOINRIGHT JOINFULL JOIN(不直接支持),不同类型的 JOIN 会根据需要获取交集、左连接、右连接或完整的并集数据。

1. JOIN 的基本语法

SELECT 表1.列名, 表2.列名, ...
FROM 表1
JOIN 表2
ON 表1.关联列 = 表2.关联列;
  • JOIN:表示连接操作。
  • ON:用于指定两个表之间的关联条件。
  • 表1.列名表2.列名:用于选择需要的列。

2. INNER JOIN(内连接)

INNER JOIN 仅返回两个表中匹配的记录,即满足条件的交集部分。如果没有匹配的记录,不会出现在结果中。

示例

假设有两个表:employeesdepartments,分别包含以下数据:

employees 表:

emp_idnamedept_id
1Alice1
2Bob2
3CharlieNULL
4Diana3

departments 表:

dept_iddept_name
1HR
2IT
3Marketing

执行以下 INNER JOIN 查询:

SELECT employees.name, departments.dept_name
FROM employees
INNER JOIN departments ON employees.dept_id = departments.dept_id;

查询结果:

namedept_name
AliceHR
BobIT
DianaMarketing

该结果只包含在两个表中有匹配 dept_id 的记录。

3. LEFT JOIN(左连接)

LEFT JOIN 会返回左表中的所有记录,即使右表中没有对应匹配的记录。对于没有匹配的右表记录,用 NULL 填充。

示例

使用 LEFT JOIN 查询:

SELECT employees.name, departments.dept_name
FROM employees
LEFT JOIN departments ON employees.dept_id = departments.dept_id;

查询结果:

namedept_name
AliceHR
BobIT
CharlieNULL
DianaMarketing

此结果包含了 employees 表中的所有记录,即使 dept_idNULLCharlie 也会出现在结果中。

4. RIGHT JOIN(右连接)

RIGHT JOINLEFT JOIN 类似,但会返回右表中的所有记录,即使左表中没有匹配记录。对于没有匹配的左表记录,用 NULL 填充。

示例

使用 RIGHT JOIN 查询:

SELECT employees.name, departments.dept_name
FROM employees
RIGHT JOIN departments ON employees.dept_id = departments.dept_id;

查询结果:

namedept_name
AliceHR
BobIT
DianaMarketing

由于 departments 表中所有记录都有对应的员工或为空,因此此处结果和 INNER JOIN 的结果相同。

5. FULL JOIN(全连接)

MySQL 不直接支持 FULL JOIN,但可以通过 UNION 来实现。FULL JOIN 会返回两个表中所有记录,匹配不到的部分会填充 NULL。相当于 LEFT JOINRIGHT JOIN 的并集。

示例

使用 LEFT JOINRIGHT JOINUNION 实现 FULL JOIN

SELECT employees.name, departments.dept_name
FROM employees
LEFT JOIN departments ON employees.dept_id = departments.dept_id
UNION
SELECT employees.name, departments.dept_name
FROM employees
RIGHT JOIN departments ON employees.dept_id = departments.dept_id;

查询结果:

namedept_name
AliceHR
BobIT
CharlieNULL
DianaMarketing

此查询结果会包含两个表中的所有记录。

6. CROSS JOIN(笛卡尔积)

CROSS JOIN 不需要 ON 条件,它会将左表和右表的所有组合列出,适合在需要笛卡尔积时使用。

示例

SELECT employees.name, departments.dept_name
FROM employees
CROSS JOIN departments;

假设 employees 表有 4 条记录,departments 表有 3 条记录,则结果会包含 4 × 3 = 12 条记录。

7. 小结

  • INNER JOIN:返回两表中符合条件的交集部分。
  • LEFT JOIN:返回左表的所有数据,右表不匹配的部分填充 NULL
  • RIGHT JOIN:返回右表的所有数据,左表不匹配的部分填充 NULL
  • FULL JOIN:MySQL 不支持,可用 UNION 模拟。
  • CROSS JOIN:返回左表和右表的笛卡尔积。

通过合理使用这些 JOIN 操作符,可以将多个表的相关数据进行合并,完成复杂的数据查询。