MySQL中多表联查JOIN的常见用法详解

 更新时间:2026年09月05日 10:48:38   作者:用户25263275347  
多表联查核心就是 JOIN(连接) ,分为INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN,本文将为大家详细讲解这些多表查询的实现,希望对大家有所帮助

多表联查核心就是 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='手机';
  • 避免笛卡尔积:join 必须写 on 关联条件
  • 字段重名,必须指定表别名:u.id,不能只写id
  • 性能:关联字段建议建立索引(外键字段加索引,联查速度提升巨大)

快速选型记忆

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

到此这篇关于MySQL中多表联查JOIN的常见用法详解的文章就介绍到这了,更多相关MySQL多表联查内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL数据库安全秘籍之守护数据金库防火防盗防攻击

    MySQL数据库安全秘籍之守护数据金库防火防盗防攻击

    MySQL是许多公司和组织的关键数据库,因此其安全性的重要性如此显而易见,为了确保MySQL的安全性,需要采取多种措施来增强其安全性,本文给大家介绍MySQL数据库安全秘籍之守护数据金库防火防盗防攻击,感兴趣的朋友一起看看吧
    2023-03-03
  • MySQL中dd::columns表结构转table过程及应用详解

    MySQL中dd::columns表结构转table过程及应用详解

    MySQL的dd表是用来存放表结构和各种建表信息的,客户端建的表都存在mysql.table和mysql.columns表里,还有一个表mysql.column_type_elements比较特殊,用来存放SET和ENUM类型的字段集合值信息,对mysql dd::columns表结构相关知识感兴趣的朋友一起看看吧
    2022-09-09
  • MySQL 聚合函数排序

    MySQL 聚合函数排序

    这篇文章主要介绍了MySQL查询排序与查询聚合函数用法,结合实例形式分析了MySQL查询结果排序以及查询聚合函数相关使用技巧,需要的朋友可以参考下
    2021-07-07
  • MySQL select查询之LIKE与通配符用法

    MySQL select查询之LIKE与通配符用法

    这篇文章主要介绍了MySQL select查询之LIKE与通配符用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • mysql 5.7 的 /etc/my.cnf 参数介绍

    mysql 5.7 的 /etc/my.cnf 参数介绍

    这篇文章主要介绍了mysql 5.7 的 /etc/my.cnf 参数介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • mysql zip 文件安装教程

    mysql zip 文件安装教程

    这篇文章主要为大家详细介绍了mysql zip 文件安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • MySQL安装starting the server失败的2种解决办法(推荐!)

    MySQL安装starting the server失败的2种解决办法(推荐!)

    MySQL是一个非常强大的关系型数据库,但有些初学者在安装配置的时候,遇到种种的困难,下面这篇文章主要给大家介绍了关于MySQL安装starting the server失败的2种解决办法,需要的朋友可以参考下
    2023-04-04
  • 如何利用Mysql计算地址经纬度距离实时位置

    如何利用Mysql计算地址经纬度距离实时位置

    最近工作中遇到了一个附近门店的功能,下面这篇文章主要给大家介绍了关于如何利用Mysql计算地址经纬度距离实时位置的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • MySQL指令进行分页显示的使用示例

    MySQL指令进行分页显示的使用示例

    本文主要介绍了MySQL指令进行分页显示的使用示例,主要使用LIMIT命令来实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • mysql8新特性之binlog_expire_logs_seconds浅析

    mysql8新特性之binlog_expire_logs_seconds浅析

    MySQL8中新增了不少新特性,这些特性提高了数据库的安全性和性能,使数据库管理员能够更灵活地进行账户管理工作,下面这篇文章主要给大家介绍了关于mysql8新特性之binlog_expire_logs_seconds的相关资料,需要的朋友可以参考下
    2023-02-02

最新评论