Mysql的join操作用于将多张表按照指定的关联条件组合查询,返回符合关联规则的数据集合,是处理多表关联业务场景的常用手段。不同的join类型对应不同的数据筛选逻辑,适用场景也有明显区别。

Mysql常见join操作类型
Mysql中常用的join操作主要分为以下几类,每种类型的关联逻辑和返回结果都有明确差异:
- INNER JOIN:内连接,返回两张表中同时满足关联条件的数据
- LEFT JOIN:左连接,返回左表所有数据,右表匹配不到关联条件的字段显示为NULL
- RIGHT JOIN:右连接,返回右表所有数据,左表匹配不到关联条件的字段显示为NULL
- CROSS JOIN:交叉连接,返回两张表的笛卡尔积,即所有可能的组合
join操作基础语法
所有join操作的基础语法结构如下,其中关联条件通过ON关键字指定:
-- 基础join语法结构 SELECT 字段列表 FROM 表1 [INNER|LEFT|RIGHT|CROSS] JOIN 表2 ON 表1.关联字段 = 表2.关联字段 [WHERE 过滤条件];
示例表结构准备
为了更直观地展示不同join的效果,我们准备两张测试表,表结构如下:
用户表user
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | int | 用户ID,主键 |
| name | varchar(50) | 用户名称 |
| age | int | 用户年龄 |
订单表order_info
| 字段名 | 类型 | 说明 |
|---|---|---|
| order_id | int | 订单ID,主键 |
| user_id | int | 下单用户ID,关联user表的id |
| amount | decimal(10,2) | 订单金额 |
插入测试数据:
-- 插入用户表数据 INSERT INTO user (id, name, age) VALUES (1, '张三', 20), (2, '李四', 25), (3, '王五', 30); -- 插入订单表数据 INSERT INTO order_info (order_id, user_id, amount) VALUES (1001, 1, 199.99), (1002, 1, 299.50), (1003, 2, 99.00);
INNER JOIN使用示例
INNER JOIN会返回两张表中user.id等于order_info.user_id的所有匹配数据,不匹配的记录会被过滤掉。
-- 查询有订单的用户及其订单信息 SELECT u.id, u.name, o.order_id, o.amount FROM user u INNER JOIN order_info o ON u.id = o.user_id;
上述查询的返回结果如下,王五没有订单所以不会出现在结果中:
| id | name | order_id | amount |
|---|---|---|---|
| 1 | 张三 | 1001 | 199.99 |
| 1 | 张三 | 1002 | 299.50 |
| 2 | 李四 | 1003 | 99.00 |
LEFT JOIN使用示例
LEFT JOIN以左表user为基准,返回左表所有记录,右表order_info中匹配不到关联条件的字段显示为NULL。
-- 查询所有用户及其订单信息,没有订单的用户也显示 SELECT u.id, u.name, o.order_id, o.amount FROM user u LEFT JOIN order_info o ON u.id = o.user_id;
返回结果中王五的订单相关字段为NULL:
| id | name | order_id | amount |
|---|---|---|---|
| 1 | 张三 | 1001 | 199.99 |
| 1 | 张三 | 1002 | 299.50 |
| 2 | 李四 | 1003 | 99.00 |
| 3 | 王五 | NULL | NULL |
RIGHT JOIN使用示例
RIGHT JOIN以右表order_info为基准,返回右表所有记录,左表user中匹配不到关联条件的字段显示为NULL,实际业务中LEFT JOIN使用频率更高,RIGHT JOIN可以通过调整表顺序用LEFT JOIN替代。
-- 查询所有订单对应的用户信息,假设存在无关联用户的订单 SELECT u.id, u.name, o.order_id, o.amount FROM user u RIGHT JOIN order_info o ON u.id = o.user_id;
CROSS JOIN使用示例
CROSS JOIN不需要指定ON关联条件,会返回两张表所有记录的组合,结果数量为左表记录数乘以右表记录数,使用时需要谨慎避免返回过多无效数据。
-- 查询用户和订单的笛卡尔积 SELECT u.id, u.name, o.order_id, o.amount FROM user u CROSS JOIN order_info o;
上述查询会返回3*3=9条记录,是所有用户和所有订单的组合。
join操作注意事项
- 关联字段建议建立索引,能大幅提升join查询的效率
- ON和WHERE的过滤逻辑不同,ON是在关联时过滤,WHERE是在关联完成后过滤
- 多表join时需要注意表的关联顺序,避免产生不必要的笛卡尔积
- 如果右表存在多条匹配左表的记录,LEFT JOIN会返回多条对应左表记录的结果
Mysqljoin操作inner_joinleft_joinright_join修改时间:2026-06-17 03:57:39