ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MySQL 5.7 JOIN 连接方式整理

MySQL 5.7 JOIN 连接方式整理 MySQL5.7 原生支持INNER、LEFT、RIGHT、CROSS、SELF五种标准 JOIN不支持直接写 FULL OUTER JOIN需用LEFT RIGHT UNION模拟另外衍生出左独有、右独有、两表独有三种筛选写法行业常统称 7 种 JOIN 逻辑。目录基础前置测试表INNER JOIN 内连接作用语法结果LEFT [OUTER] JOIN 左外连接作用语法结果RIGHT [OUTER] JOIN 右外连接作用语法结果CROSS JOIN 交叉连接作用SELF JOIN 自连接作用示例FULL OUTER JOIN 全外连接作用模拟语法结果衍生 3 种筛选 JOIN业务高频使用左独有只存在左表右表无匹配右独有只存在右表左表无匹配两表独有全连接去掉交集只保留两边独有数据各 JOIN 对比速查表总结基础前置测试表-- 用户表A CREATE TABLE t_user(uid INT, uname VARCHAR(20)); INSERT t_user VALUES(1,张三),(2,李四),(3,王五); -- 订单表B CREATE TABLE t_order(oid INT, uid INT, money DECIMAL); INSERT t_order VALUES(101,1,99),(102,2,199),(103,4,299);INNER JOIN 内连接Intersection作用只返回两表匹配成功的数据无匹配直接过滤简写JOIN等价INNER JOIN。语法SELECT * FROM t_user u INNER JOIN t_order o ON u.uid o.uid; -- 简写JOIN SELECT * FROM t_user u JOIN t_order o ON u.uid o.uid;结果只保留 uid1、2张三、李四有订单王五、订单 4 全部过滤。LEFT [OUTER] JOIN 左外连接左表全量 匹配右表作用保留左表所有行右表无匹配则填充NULLOUTER可省略。语法SELECT * FROM t_user u LEFT JOIN t_order o ON u.uid o.uid;结果张三、李四带订单数据王五无订单订单字段全为 NULL。RIGHT [OUTER] JOIN 右外连接右表全量 匹配左表作用保留右表所有行左表无匹配填充NULLMySQL 底层会自动转 LEFT JOIN 执行。语法SELECT * FROM t_user u RIGHT JOIN t_order o ON u.uid o.uid;结果101、102 订单匹配用户103 订单无用户用户字段全 NULL。CROSS JOIN 交叉连接笛卡尔积作用无关联条件左表每一行匹配右表每一行数据量 左行数 × 右行数慎用大表。两种等价写法-- 写法1 CROSS JOIN SELECT * FROM t_user CROSS JOIN t_order; -- 写法2 逗号分隔无WHERE关联 SELECT * FROM t_user, t_order;示例 3 用户 ×3 订单 9 条全部组合数据。SELF JOIN 自连接同表自己关联自己作用一张表自己和自己 JOIN必须起别名适用于层级、上下级、同表对比场景。示例查询同表用户 id 相同模拟关联SELECT a.uid,a.uname,b.uname FROM t_user a LEFT JOIN t_user b ON a.uid b.uid;经典场景员工表查上级、分类表查父级分类。FULL OUTER JOIN 全外连接MySQL5.7 无原生语法模拟实现作用返回左右两表全部数据无匹配填充 NULLMySQL 不支持直接FULL OUTER JOIN用LEFT UNION RIGHT模拟。模拟语法-- UNION自动去重推荐 (SELECT * FROM t_user u LEFT JOIN t_order o ON u.uido.uid) UNION (SELECT * FROM t_user u RIGHT JOIN t_order o ON u.uido.uid);UNION自动合并重复匹配行UNION ALL不去重性能更高匹配数据会重复两份结果张三、李四、王五、订单 4 全部出现无匹配字段 NULL。衍生 3 种筛选 JOIN业务高频使用左独有只存在左表右表无匹配左 JOIN 后过滤右表主键 IS NULLSELECT * FROM t_user u LEFT JOIN t_order o ON u.uido.uid WHERE o.oid IS NULL; -- 只查出王五无订单用户右独有只存在右表左表无匹配右 JOIN 过滤左表主键 IS NULLSELECT * FROM t_user u RIGHT JOIN t_order o ON u.uido.uid WHERE u.uid IS NULL; -- 只查出103订单无归属用户两表独有全连接去掉交集只保留两边独有数据-- 左独有 (SELECT * FROM t_user u LEFT JOIN t_order o ON u.uido.uid WHERE o.oid IS NULL) UNION -- 右独有 (SELECT * FROM t_user u RIGHT JOIN t_order o ON u.uido.uid WHERE u.uid IS NULL);各 JOIN 对比速查表连接类型保留数据范围MySQL 原生支持常用场景INNER JOIN两表交集✅查询两表都存在的关联数据用户 有效订单LEFT JOIN左表全部 匹配右表✅查全部用户不管有没有下单RIGHT JOIN右表全部 匹配左表✅查全部订单不管是否绑定用户CROSS JOIN笛卡尔积全组合✅生成排列组合、测试数据SELF JOIN同表自关联✅树形结构、上下级查询FULL JOIN左右两表全部❌ UNION 模拟完整合并两张表所有数据左独有 / 右独有 / 两表独有单边无匹配数据派生写法查缺失关联数据未下单用户、孤儿订单总结本文系统梳理 MySQL 5.7 的 7 种 JOIN 逻辑INNER、LEFT、RIGHT、CROSS、SELF 五种原生连接FULL OUTER JOIN 用 LEFT UNION RIGHT 模拟并衍生左独有、右独有、两表独有三种筛选写法附语法、结果与速查表便于业务选型。
返回列表