Bootstrap

第十篇 秒懂SQL集合运算与联结:像逛超市一样学SQL

目录

    • 一、前情提要:SQL集合运算就像整理购物车 🛒
      • 1.1 基础三剑客:UNION/INTERSECT/EXCEPT
      • 1.2 新手必坑指南 ⚠️
    • 二、表联结:你的SQL人际关系学 🤝
      • 2.1 三种联结方式对比
      • 2.2 隐藏技巧:过时语法 vs 现代语法
    • 三、高级玩法:用JOIN代替集合运算 🚀
      • 3.1 交集替代方案
      • 3.2 差集替代方案
    • 四、综合练习:超市库存管理系统实战 🏪
    • 五、学习路线图 🗺️

一、前情提要:SQL集合运算就像整理购物车 🛒

想象你有两个购物车(表),一个装零食,一个装日用品。集合运算就是合并、对比这两个购物车的操作!

1.1 基础三剑客:UNION/INTERSECT/EXCEPT

运算符生活案例默认去重保留重复行
UNION合并两个购物车✔️UNION ALL
INTERSECT找出两个购物车都有的商品✔️INTERSECT ALL
EXCEPT第一个购物车独有的商品✔️EXCEPT ALL

极简代码示例

-- 合并两个班级的学生名单(自动去重)
SELECT name FROM ClassA
UNION
SELECT name FROM ClassB;

-- 查看两个购物车都有的薯片品牌(MySQL需用JOIN实现)
SELECT product FROM Cart1
INTERSECT
SELECT product FROM Cart2;

-- 查找只在Cart1出现的商品(差集)
SELECT product FROM Cart1
EXCEPT
SELECT product FROM Cart2;

1.2 新手必坑指南 ⚠️

  1. 列数必须相同
    ❌ 错误示范:SELECT 姓名,年龄 FROM 学生表 UNION SELECT 姓名 FROM 教师表
    ✅ 正确写法:SELECT 姓名,年龄 FROM 学生表 UNION SELECT 姓名,NULL FROM 教师表

  2. 类型要兼容

    兼容组合不兼容组合
    INT + FLOATVARCHAR + DATE
    CHAR(10)+CHAR(20)BOOLEAN + INTEGER

二、表联结:你的SQL人际关系学 🤝

把多张表想象成同学录:学生表存姓名,成绩表存分数,通过学号关联!

2.1 三种联结方式对比

联结类型生活案例关键词结果集特点
内联结只显示有电话号码的同学INNER JOIN只保留匹配行
左外联结所有同学显示,没号码的填无LEFT JOIN保留左表全部
交叉联结所有同学随机组队CROSS JOIN笛卡尔积

代码实战

-- 内联结:显示学生及其考试成绩(没成绩的不显示)
SELECT S.姓名, G.分数 
FROM 学生表 S
INNER JOIN 成绩表 G ON S.学号 = G.学号;

-- 左外联结:所有学生显示,没成绩的标记为NULL
SELECT S.姓名, G.分数 
FROM 学生表 S
LEFT JOIN 成绩表 G ON S.学号 = G.学号;

-- 交叉联结:生成所有可能的商品套餐组合(慎用!)
SELECT A.商品, B.赠品 
FROM 商品表 A
CROSS JOIN 赠品表 B;

2.2 隐藏技巧:过时语法 vs 现代语法

-- 🚫 过时写法(容易忘记WHERE条件导致笛卡尔积!)
SELECT * FROM 学生表, 成绩表 
WHERE 学生表.学号 = 成绩表.学号;

-- ✅ 现代标准写法(清晰易懂)
SELECT * FROM 学生表
INNER JOIN 成绩表 ON 学生表.学号 = 成绩表.学号;

三、高级玩法:用JOIN代替集合运算 🚀

MySQL不支持INTERSECT/EXCEPT?看这里!

3.1 交集替代方案

-- 使用INNER JOIN找共同好友
SELECT A.user_id 
FROM 好友列表 A
INNER JOIN 好友列表 B ON A.user_id = B.user_id 
WHERE A.group = '同学' AND B.group = '同事';

3.2 差集替代方案

-- 查找只关注A没关注B的用户(左联结+IS NULL)
SELECT A.user_id 
FROM 关注列表 A
LEFT JOIN 关注列表 B ON A.user_id = B.user_id AND B.target = 'B'
WHERE B.user_id IS NULL;

四、综合练习:超市库存管理系统实战 🏪

场景

  • 商品表:商品ID、名称、价格
  • 库存表:商品ID、仓库位置、库存量
  • 销售表:商品ID、销售日期、销售量

需求

  1. 合并线上线下商品列表(自动去重)
  2. 查找所有有库存但从未销售过的商品
  3. 显示商品完整信息(含库存和总销量)

五、学习路线图 🗺️

  1. 入门必看:《SQL必知必会》
  2. 在线练习SQLZoo
  3. 实战项目:搭建个人博客数据库
  4. 避坑指南:永远不要在JOIN的ON条件中使用OR!

🎯下期预告:《SQL高级用法》
💬互动话题:你在学习SQL时遇到过哪些坑?欢迎评论区留言讨论!
🏷️温馨提示:我是[随缘而动,随遇而安], 一个喜欢用生活案例讲技术的开发者。如果觉得有帮助,点赞关注不迷路🌟


;