MySQL JOIN 关联语句


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

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

  • 《Spring AI 项目实战(问答机器人、RAG 智能客服、联网搜索)》已完结,基于 Spring AI + Spring Boot 3.x + JDK 21...,查看介绍

  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...,查看介绍;演示链接:http://116.62.199.48:7070/

  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接:http://116.62.199.48/

  • 新开坑项目:《从零手撸:秒杀系统高并发优化实战》 正在更新中...,查看介绍

截止目前,星球内专栏累计输出 150w+ 字,讲解图 5110+ 张,还在持续爆肝中.. 后续还会上新更多项目,已有 4700+ 小伙伴加入学习,欢迎点击围观

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

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

1. JOIN 的基本语法

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

2. INNER JOIN(内连接)

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

示例

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

employees 表:

emp_id name dept_id
1 Alice 1
2 Bob 2
3 Charlie NULL
4 Diana 3

departments 表:

dept_id dept_name
1 HR
2 IT
3 Marketing

执行以下 INNER JOIN 查询:

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

查询结果:

name dept_name
Alice HR
Bob IT
Diana Marketing

该结果只包含在两个表中有匹配 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;

查询结果:

name dept_name
Alice HR
Bob IT
Charlie NULL
Diana Marketing

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

4. RIGHT JOIN(右连接)

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

示例

使用 RIGHT JOIN 查询:

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

查询结果:

name dept_name
Alice HR
Bob IT
Diana Marketing

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

5. FULL JOIN(全连接)

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

示例

使用 LEFT JOIN 和 RIGHT JOIN 的 UNION 实现 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;

查询结果:

name dept_name
Alice HR
Bob IT
Charlie NULL
Diana Marketing

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

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 操作符,可以将多个表的相关数据进行合并,完成复杂的数据查询。