Skip to content

MySQL多表查询大冒险 🌍

🧭 数据宇宙导航图

在这里你将掌握:

  • 表连接:数据关系的桥梁 🌉
  • 子查询:查询中的俄罗斯套娃 🪆
  • 联合查询:数据的大合唱 🎤
  • 自连接:镜子里的自己 🤳

1. 表连接全家福 👨👩👧👦

1.1 内连接(INNER JOIN)🤝

sql
-- 找出有订单的用户(交集)
SELECT 用户.姓名, 订单.*
FROM 用户
INNER JOIN 订单 ON 用户.ID = 订单.用户ID;

生活案例:相亲成功的情侣(双方都满意的匹配)

1.2 左连接(LEFT JOIN)👈

sql
-- 所有用户+他们的订单(没有订单显示NULL)
SELECT 用户.姓名, 订单.金额
FROM 用户
LEFT JOIN 订单 ON 用户.ID = 订单.用户ID;

生活案例:全班同学的成绩单(没考试的同学显示缺考)

1.3 右连接(RIGHT JOIN)👉

sql
-- 所有订单+对应的用户(没有用户显示NULL)
SELECT 订单.*, 用户.姓名
FROM 用户
RIGHT JOIN 订单 ON 用户.ID = 订单.用户ID;

生活案例:所有商品+购买者(未售出的商品显示未售出)

1.4 全连接(FULL JOIN)🤜🤛

sql
-- MySQL不支持FULL JOIN,但可以用UNION模拟
SELECT * FROM 用户 LEFT JOIN 订单 ON 用户.ID = 订单.用户ID
UNION
SELECT * FROM 用户 RIGHT JOIN 订单 ON 用户.ID = 订单.用户ID;

生活案例:全校师生大会(包括没课的老师+没老师教的学生)

2. 子查询大挑战 🪆

2.1 标量子查询(返回单个值)

sql
-- 找出比平均工资高的员工
SELECT 姓名, 工资 
FROM 员工
WHERE 工资 > (SELECT AVG(工资) FROM 员工);

2.2 列子查询(返回一列)

sql
-- 找出有订单的用户
SELECT 姓名
FROM 用户
WHERE ID IN (SELECT DISTINCT 用户ID FROM 订单);

2.3 行子查询(返回一行)

sql
-- 找出和张三同部门同职级的员工
SELECT 姓名
FROM 员工
WHERE (部门, 职级) = (
    SELECT 部门, 职级 
    FROM 员工 
    WHERE 姓名 = '张三'
);

3. 联合查询(UNION)🎤

sql
-- 合并北京和上海的客户
SELECT 姓名, '北京' AS 城市 FROM 北京客户
UNION ALL
SELECT 姓名, '上海' FROM 上海客户;

对比表

特性UNIONUNION ALL
去重
性能较慢较快
结果排序不保证不保证

4. 自连接(Self Join)🤳

sql
-- 找出同部门的同事
SELECT A.姓名, B.姓名 AS 同事
FROM 员工 A
JOIN 员工 B ON A.部门 = B.部门
WHERE A.ID <> B.ID;

5. 综合实战:电商数据分析 🛒

sql
-- 分析每个用户的消费情况
SELECT 
    用户.姓名,
    COUNT(订单.ID) AS 订单数,
    SUM(订单.金额) AS 总消费
FROM 用户
LEFT JOIN 订单 ON 用户.ID = 订单.用户ID
GROUP BY 用户.ID
HAVING 总消费 > 1000
ORDER BY 总消费 DESC;

🚨 多表查询避坑指南

  1. 别名大法好:给表起简短别名(如 u 代表 users)
  2. **避免SELECT ***:明确列出所需字段
  3. 索引很重要:连接字段记得加索引
  4. 小心笛卡尔积:忘记WHERE条件会导致数据爆炸
  5. 分步调试:复杂查询先拆解测试

🎁 高级技巧

sql
-- 使用EXISTS优化查询
SELECT 姓名
FROM 用户 u
WHERE EXISTS (
    SELECT 1 
    FROM 订单 o 
    WHERE o.用户ID = u.ID
);

-- 交叉连接生成序列
SELECT 
    t1.num + t2.num*10 AS seq 
FROM
    (SELECT 0 num UNION SELECT 1 UNION SELECT 2) t1,
    (SELECT 0 num UNION SELECT 1 UNION SELECT 2) t2;

📜 多表查询顺口溜

多表查询莫慌张,JOIN是座桥樑
左连右连分左右,内连只要匹配项
子查询套俄罗斯,UNION合并数据行
别名索引要记牢,性能优化不能忘