MySQL中多表联查JOIN的常见用法详解
多表联查核心就是 JOIN(连接) ,分为:INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL 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中dd::columns表结构转table过程及应用详解
MySQL的dd表是用来存放表结构和各种建表信息的,客户端建的表都存在mysql.table和mysql.columns表里,还有一个表mysql.column_type_elements比较特殊,用来存放SET和ENUM类型的字段集合值信息,对mysql dd::columns表结构相关知识感兴趣的朋友一起看看吧2022-09-09
MySQL安装starting the server失败的2种解决办法(推荐!)
MySQL是一个非常强大的关系型数据库,但有些初学者在安装配置的时候,遇到种种的困难,下面这篇文章主要给大家介绍了关于MySQL安装starting the server失败的2种解决办法,需要的朋友可以参考下2023-04-04
mysql8新特性之binlog_expire_logs_seconds浅析
MySQL8中新增了不少新特性,这些特性提高了数据库的安全性和性能,使数据库管理员能够更灵活地进行账户管理工作,下面这篇文章主要给大家介绍了关于mysql8新特性之binlog_expire_logs_seconds的相关资料,需要的朋友可以参考下2023-02-02


最新评论