在关系型数据库中,数据通常会按照业务维度拆分到不同的表中,比如用户基本信息存放在用户表,订单信息存放在订单表,要同时获取用户的姓名和对应的订单信息,就需要进行跨表关联查询。INNER JOIN是最基础的关联查询方式,它会返回所有满足关联条件的记录,是日常开发中使用频率很高的SQL语法。

INNER JOIN的基本语法
INNER JOIN用于连接两个表,语法结构如下:
-- 连接两个表的基础语法 SELECT 字段列表 FROM 表1 INNER JOIN 表2 ON 表1.关联字段 = 表2.关联字段;
其中INNER JOIN也可以简写为JOIN,两者效果完全一致。关联条件通过ON关键字指定,通常是两个表中含义相同的字段,比如用户表的用户ID和订单表的用户ID。
连接两个基础表的实例
假设我们有两个基础表,分别是用户表user和订单表order_info,表结构如下:
| user表字段 | 字段说明 |
|---|---|
| user_id | 用户ID,主键 |
| user_name | 用户姓名 |
| age | 用户年龄 |
订单表order_info的结构:
| order_info表字段 | 字段说明 |
|---|---|
| order_id | 订单ID,主键 |
| user_id | 下单用户ID,关联user表的user_id |
| order_amount | 订单金额 |
| create_time | 订单创建时间 |
现在要查询所有下单用户的姓名和对应的订单金额,就可以使用INNER JOIN连接两个表:
-- 查询用户姓名和对应订单金额 SELECT u.user_name, o.order_amount FROM user u INNER JOIN order_info o ON u.user_id = o.user_id;
这里给表设置了别名u代表user表,o代表order_info表,避免字段名重复导致歧义。执行上述语句后,只会返回user表和order_info表中user_id匹配的记录,如果某个用户没有下单,或者某个订单的用户ID在user表中不存在,这些记录都不会出现在结果中。
连接多个基础表的实现
INNER JOIN支持连续连接多个表,语法只需要在现有基础上追加新的INNER JOIN和ON条件即可。比如我们再增加一个订单商品表order_goods,记录每个订单包含的商品信息,表结构如下:
| order_goods表字段 | 字段说明 |
|---|---|
| id | 记录ID,主键 |
| order_id | 订单ID,关联order_info表的order_id |
| goods_name | 商品名称 |
| goods_num | 商品数量 |
如果要查询用户姓名、订单金额以及订单中的商品名称,就可以连接三个表:
-- 连接三个表查询用户、订单、商品信息 SELECT u.user_name, o.order_amount, g.goods_name FROM user u INNER JOIN order_info o ON u.user_id = o.user_id INNER JOIN order_goods g ON o.order_id = g.order_id;
连接多个表时,关联条件的顺序不影响最终结果,只要保证每个关联条件对应的字段在两个表中含义一致即可。
INNER JOIN使用注意事项
- 关联字段最好建立索引,尤其是大表关联时,索引可以大幅提升查询效率,避免全表扫描。
- 如果多个表存在同名字段,必须使用表别名或者表名限定字段,否则会报字段歧义错误。
- INNER JOIN只返回匹配的记录,如果需要返回左表所有记录即使右表没有匹配,要使用LEFT JOIN,返回右表所有记录要用RIGHT JOIN。
- 关联条件不要写在WHERE子句中,虽然部分数据库支持这种写法,但不符合SQL标准,可读性也较差,建议统一用ON指定关联条件。
常见错误示例
很多新手会忘记写ON关联条件,导致出现笛卡尔积,比如下面的错误写法:
-- 错误写法,缺少ON条件,会产生笛卡尔积 SELECT u.user_name, o.order_amount FROM user u INNER JOIN order_info o;
这种写法会把user表的每一条记录和order_info表的每一条记录组合,结果数量是两个表记录数的乘积,数据量大会直接导致数据库卡顿,一定要避免。
另外还要注意关联字段的数据类型必须一致,比如user表的user_id是INT类型,order_info表的user_id是VARCHAR类型,即使数值相同也无法匹配,会导致查询结果为空或者匹配错误。
SQLINNER_JOIN跨表查询关联查询修改时间:2026-06-14 21:39:30