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 JOINLEFT JOINRIGHT JOINFULL JOIN(不直接支持),不同类型的 JOIN 会根据需要获取交集、左连接、右连接或完整的并集数据。

1. JOIN 的基本语法

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

2. INNER JOIN(内连接)

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

示例

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

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_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;

查询结果:

name dept_name
Alice HR
Bob IT
Diana Marketing

由于 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;

查询结果:

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