
MySQL 多表联查多表联查核心就是JOIN连接分为INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOINMySQL 不支持用 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代表 usero代表 order隐式内连接逗号写法等价 inner joinSELECT u.name, o.order_name FROM user u,order o WHERE u.id o.user_id;⚠️不要忘记 where 条件否则会产生笛卡尔积数据爆炸2、左连接 LEFT JOINLEFT OUTER JOIN以左边表为主左表全部数据都展示右表匹配不到字段为 NULLSELECT 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以右边表为主右表全部数据左表匹配不到则 NULLSELECT u.name, o.order_name FROM user u RIGHT JOIN order o ON u.id o.user_id;4、全连接 FULL JOINMySQL没有 FULL JOIN 关键字想要左右全部数据用LEFT JOIN UNION RIGHT JOINSELECT u.name, o.order_name FROM user u LEFT JOIN order o ON u.ido.user_id UNION SELECT u.name, o.order_name FROM user u RIGHT JOIN order o ON u.ido.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 age18) t1 LEFT JOIN order o ON t1.id o.user_id;7、关键注意事项ON 和 WHERE 的区别ONjoin 连接时做匹配条件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.ido.user_id WHERE o.order_name手机; -- ✅正确把条件放on SELECT u.name,o.order_name FROM user u LEFT JOIN order o ON u.ido.user_id AND o.order_name手机;避免笛卡尔积join 必须写 on 关联条件字段重名必须指定表别名u.id不能只写id性能关联字段建议建立索引外键字段加索引联查速度提升巨大快速选型记忆表格连接类型作用INNER JOIN两边匹配的数据LEFT JOIN左边全部右边匹配RIGHT JOIN右边全部左边匹配UNION合并结果集