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