LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

如何实现MySQL多表联查

zhenglin
2026年9月7日 13:13 本文热度 153

MySQL 多表联查

多表联查核心就是 JOIN(连接) ,分为:INNER JOINLEFT JOINRIGHT JOINFULL JOIN(MySQL 不支持,用 union 模拟),还有隐式连接(逗号写法)。

准备两张示例表

-- 用户表 user

CREATE TABLE user(

  id INT PRIMARY KEY AUTO_INCREMENT,

  name VARCHAR(20),

  age INT

);


-- 订单表 order

CREATE TABLE `order`(

  id INT PRIMARY KEY AUTO_INCREMENT,

  user_id INT, -- 外键,关联user.id

  order_name VARCHAR(50)

);

1、内连接 INNER JOIN(最常用)

只返回两张表匹配上的数据,两边都有才出结果 语法:

SELECT 字段

FROM 表A

INNER JOIN 表B

ON 表A.关联字段 = 表B.关联字段;

示例:查询用户以及对应的订单

SELECT u.name, o.order_name

FROM user u

INNER JOIN `order` o

ON u.id = o.user_id;

别名:u 代表 user,o代表 order

隐式内连接(逗号写法,等价 inner join)

SELECT u.name, o.order_name

FROM user u,`order` o

WHERE u.id = o.user_id;

⚠️不要忘记 where 条件,否则会产生笛卡尔积(数据爆炸)

2、左连接 LEFT JOIN(LEFT OUTER JOIN)

以左边表为主,左表全部数据都展示;右表匹配不到,字段为 NULL

SELECT u.name, o.order_name

FROM user u

LEFT JOIN `order` o

ON u.id = o.user_id;

场景:查询所有用户,包含没有下单的用户

如果只想查左表有、右表没有的数据(没有订单的用户):

SELECT u.name

FROM user u

LEFT JOIN `order` o

ON u.id = o.user_id

WHERE o.id IS NULL;

3、右连接 RIGHT JOIN

以右边表为主,右表全部数据,左表匹配不到则 NULL

SELECT u.name, o.order_name

FROM user u

RIGHT JOIN `order` o

ON u.id = o.user_id;

4、全连接 FULL JOIN

MySQL 没有 FULL JOIN 关键字,想要左右全部数据,用 LEFT JOIN UNION RIGHT JOIN

SELECT u.name, o.order_name FROM user u LEFT JOIN `order` o ON u.id=o.user_id

UNION

SELECT u.name, o.order_name FROM user u RIGHT JOIN `order` o ON u.id=o.user_id;

5、三张及以上表联查

多张表就继续 JOIN ... ON 往后拼接

SELECT u.name,o.order_name,g.goods_name

FROM user u

LEFT JOIN `order` o ON u.id = o.user_id

LEFT JOIN goods g ON o.goods_id = g.id;

6、子查询实现多表(不是 JOIN,另一种方案)

-- where中子查询

SELECT * FROM user WHERE id IN (SELECT user_id FROM `order`);


-- from子查询(派生表)

SELECT * FROM (SELECT * FROM user WHERE age>18) t1

LEFT JOIN `order` o ON t1.id = o.user_id;

7、关键注意事项

  1. ON 和 WHERE 的区别
  • ON:join 连接时做匹配条件
  • WHERE:连接完成之后,对结果集过滤

left join 中,条件写 on 和 where 结果完全不一样!

示例坑点:

-- ❌错误:left join后where过滤order表,会把null数据过滤掉,退化成内连接

SELECT u.name,o.order_name FROM user u

LEFT JOIN `order` o ON u.id=o.user_id

WHERE o.order_name='手机';


-- ✅正确,把条件放on

SELECT u.name,o.order_name FROM user u

LEFT JOIN `order` o ON u.id=o.user_id AND o.order_name='手机';

  1. 避免笛卡尔积:join 必须写 on 关联条件
  2. 字段重名,必须指定表别名:u.id,不能只写id

  3. 性能:关联字段建议建立索引(外键字段加索引,联查速度提升巨大)

快速选型记忆

表格

连接类型作用
INNER JOIN两边匹配的数据
LEFT JOIN左边全部,右边匹配
RIGHT JOIN右边全部,左边匹配
UNION合并结果集


阅读原文:点击这里


该文章在 2026/9/7 13:13:34 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-2  粤公网安备44030602007207号