本篇文章将介绍 MySQL 中的 表连接(JOIN),帮助你掌握如何将多个表的数据通过不同的条件联合查询,以便获取更复杂的查询结果。
目录
- [JOIN 基础概念](#JOIN 基础概念)
- [内连接(INNER JOIN)](#内连接(INNER JOIN))
- [左连接(LEFT JOIN)](#左连接(LEFT JOIN))
- [右连接(RIGHT JOIN)](#右连接(RIGHT JOIN))
- [全连接(FULL JOIN)](#全连接(FULL JOIN))
- [自连接(SELF JOIN)](#自连接(SELF JOIN))
- [JOIN 常见示例对照表](#JOIN 常见示例对照表)
- 小结
JOIN 基础概念
在 MySQL 中,JOIN 用于将两个或更多表的数据通过特定条件联合起来,以便查询和分析多个表中的相关数据。常见的 JOIN 类型有:
- INNER JOIN:返回两个表中匹配的数据
- LEFT JOIN:返回左表所有数据以及匹配的右表数据
- RIGHT JOIN:返回右表所有数据以及匹配的左表数据
- FULL JOIN:返回两个表中所有数据
- SELF JOIN:将表与其自身连接
内连接(INNER JOIN)
INNER JOIN
是最常用的 JOIN 类型,它返回两个表中满足匹配条件的记录。如果表中某行没有匹配项,它就不会出现在结果集中。
语法
sql
SELECT columns
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
示例

customers表:
orders表:
sql
SELECT orders.id, customers.name
FROM orders
INNER JOIN customers
ON orders.customer_id = customers.id;
查询 orders
表和 customers
表中匹配的记录,只返回那些有匹配 customer_id
的订单。
左连接(LEFT JOIN)
LEFT JOIN
返回左表中的所有记录,以及右表中匹配的记录。如果右表没有匹配项,结果中会显示 NULL
。
语法
sql
SELECT columns
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;
示例
sql
SELECT orders.id, customers.name
FROM orders
LEFT JOIN customers
ON orders.customer_id = customers.id;
查询所有订单,并显示相应的客户姓名。如果某些订单没有客户,则显示 NULL
。
右连接(RIGHT JOIN)
RIGHT JOIN
返回右表中的所有记录,以及左表中匹配的记录。如果左表没有匹配项,结果中会显示 NULL
。
语法
sql
SELECT columns
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column;
示例
sql
SELECT orders.id, customers.name
FROM orders
RIGHT JOIN customers
ON orders.customer_id = customers.id;
查询所有客户,以及他们的订单。如果某些客户没有订单,则订单部分显示 NULL
。
全连接(FULL JOIN)
FULL JOIN
返回两个表中所有的记录。如果某个表没有匹配项,结果中会显示 NULL
。但是,MySQL 本身不支持 FULL JOIN
,你可以通过 UNION
来模拟 FULL JOIN
。
示例
sql
SELECT orders.id, customers.name
FROM orders
LEFT JOIN customers
ON orders.customer_id = customers.id
UNION
SELECT orders.id, customers.name
FROM orders
RIGHT JOIN customers
ON orders.customer_id = customers.id;
通过 UNION
将 LEFT JOIN
和 RIGHT JOIN
的结果合并,模拟 FULL JOIN
。
自连接(SELF JOIN)
SELF JOIN
是将表与其自身连接。通常用于处理与自身有关系的数据。
语法
sql
SELECT columns
FROM table1 AS t1, table1 AS t2
WHERE t1.column = t2.column;
示例
sql
SELECT e1.name AS Employee, e2.name AS Manager
FROM employees e1
INNER JOIN employees e2
ON e1.manager_id = e2.id;
查询每个员工的姓名和经理的姓名,employees
表在这里自连接,e1
和 e2
是两个别名。
JOIN 常见示例对照表
操作 | SQL 示例 | 说明 |
---|---|---|
内连接 | SELECT orders.id, customers.name FROM orders INNER JOIN customers ON orders.customer_id = customers.id; |
返回匹配的订单和客户数据 |
左连接 | SELECT orders.id, customers.name FROM orders LEFT JOIN customers ON orders.customer_id = customers.id; |
返回所有订单和匹配客户,缺少匹配时返回 NULL |
右连接 | SELECT orders.id, customers.name FROM orders RIGHT JOIN customers ON orders.customer_id = customers.id; |
返回所有客户和匹配订单,缺少匹配时返回 NULL |
全连接 | SELECT orders.id, customers.name FROM orders LEFT JOIN customers ON orders.customer_id = customers.id UNION SELECT orders.id, customers.name FROM orders RIGHT JOIN customers ON orders.customer_id = customers.id; |
模拟返回所有客户和所有订单 |
自连接 | SELECT e1.name AS Employee, e2.name AS Manager FROM employees e1 INNER JOIN employees e2 ON e1.manager_id = e2.id; |
查询员工及其经理 |
小结
本篇文章介绍了 MySQL 中的 表连接(JOIN) ,包括 INNER JOIN
、LEFT JOIN
、RIGHT JOIN
、FULL JOIN
和 SELF JOIN
等常见连接方式。掌握这些基本操作,你将能够更高效地处理多表查询的需求。
📘 下一篇,我们将学习 MySQL 数据库设计与规范,帮助你设计高效且易于维护的数据库架构。