【趣学SQL】第二章:高级查询技巧 2.1 复杂的 JOIN 操作——数据库世界的“社交达人“修炼手册

第二章:高级查询技巧

2.1 复杂的 JOIN 操作------数据库世界的"社交达人"修炼手册

如果说数据库是《老友记》里的中央咖啡馆,那么JOIN操作就是让角色们产生交集的经典对话!今天我们将化身"SQL社交大师",用一场虚拟的"咖啡店相亲局"和"披萨店黑帮风云",揭秘JOIN操作的终极奥义。☕️🔍


2.1.1 INNER JOIN------精准匹配的咖啡相亲局

sql 复制代码
-- 找出成功配对的情侣(有共同爱好)  
SELECT  
  boys.name AS 男生,  
  girls.name AS 女生,  
  boys.favorite_coffee  
FROM coffee_dating_boys AS boys  
INNER JOIN coffee_dating_girls AS girls  
  ON boys.favorite_coffee = girls.favorite_coffee;  

输出示例

复制代码
+--------+--------+------------------+  
| 男生   | 女生   | favorite_coffee  |  
+--------+--------+------------------+  
| 小明   | 小美   | 燕麦拿铁         |  
| 阿强   | 莉莉   | 生椰冷萃         |  
+--------+--------+------------------+  

经典台词:INNER JOIN就像婚介所说:"只展示有共同话题的配对,其他人都当不存在!"


2.1.2 LEFT JOIN------保留所有男生的悲情故事

sql 复制代码
-- 查看所有男生(即使没匹配到女生)  
SELECT  
  boys.name,  
  girls.name AS match_result  
FROM coffee_dating_boys AS boys  
LEFT JOIN coffee_dating_girls AS girls  
  ON boys.favorite_coffee = girls.favorite_coffee;  

扎心输出

复制代码
+--------+--------------+  
| name   | match_result |  
+--------+--------------+  
| 小明   | 小美         |  
| 阿强   | 莉莉         |  
| 大雄   | NULL         | ← 爱喝美式的大雄无人问津  
+--------+--------------+  

应用场景

  • 查找没有订单的顾客
  • 统计部门缺勤人员
  • 发现滞销商品

2.1.3 RIGHT JOIN & FULL JOIN------被遗忘的江湖秘术

sql 复制代码
-- RIGHT JOIN(保留所有女生)  
SELECT *  
FROM boys  
RIGHT JOIN girls ON boys.coffee = girls.coffee;  

-- MySQL实现FULL JOIN的魔法(LEFT + RIGHT + UNION去重)  
SELECT * FROM boys LEFT JOIN girls ON ...  
UNION  
SELECT * FROM boys RIGHT JOIN girls ON ...;  

冷知识

  • 90%的RIGHT JOIN都可以改写为LEFT JOIN(只是调换表顺序)
  • 真正的FULL JOIN就像"全员吃瓜大会"------不管有没有匹配,所有记录都出来露脸

2.1.4 SELF JOIN------披萨黑帮的家族关系网

sql 复制代码
-- 查找同一家族的披萨配方(共享秘制酱料)  
SELECT  
  A.pizza_name AS 披萨A,  
  B.pizza_name AS 披萨B,  
  A.secret_sauce  
FROM pizza_recipes AS A  
INNER JOIN pizza_recipes AS B  
  ON A.secret_sauce = B.secret_sauce  
  AND A.pizza_id != B.pizza_id;  

输出惊悚剧透

复制代码
+------------------+------------------+----------------+  
| 披萨A            | 披萨B            | secret_sauce   |  
+------------------+------------------+----------------+  
| 西西里火山       | 黑手党特供       | 魔鬼辣椒酱     |  
+------------------+------------------+----------------+  

黑帮暗语:SELF JOIN就像照镜子,让你发现"原来另一个自己也在用同款口红!"


2.1.5 多表 JOIN------咖啡店宇宙的终极联动

sql 复制代码
-- 查询订单详情(顾客+咖啡+店员)  
SELECT  
  c.name AS 顾客,  
  o.order_time,  
  cof.name AS 咖啡,  
  s.name AS 店员  
FROM orders o  
INNER JOIN customers c ON o.customer_id = c.id  
INNER JOIN coffees cof ON o.coffee_id = cof.id  
LEFT JOIN staff s ON o.staff_id = s.id;  

执行顺序解密

  1. 先让orderscustomers牵手成功
  2. 带着这对情侣去找coffees三方会谈
  3. 最后邀请staff加入群聊(没店员也算)

2.1.6 优化 JOIN 性能------拒绝卡顿的秘技

技巧1:索引黄金三件套
sql 复制代码
-- 为关联字段创建索引  
CREATE INDEX idx_customer ON orders(customer_id);  
CREATE INDEX idx_coffee ON orders(coffee_id);  
技巧2:EXPLAIN 诊断书
sql 复制代码
EXPLAIN  
SELECT * FROM A  
JOIN B ON A.id = B.a_id  
WHERE A.create_time > '2023-01-01';  

关键指标

  • rows: 预估扫描行数(越小越好)
  • Extra: Using index(索引覆盖爽翻天)
技巧3:分阶段JOIN
sql 复制代码
-- 先过滤再JOIN  
SELECT *  
FROM (SELECT * FROM A WHERE create_time > '2023-01-01') AS filtered_A  
JOIN B ON filtered_A.id = B.a_id;  

血泪案例

某程序员用5个表JOIN查询,结果执行时间从0.5秒变成15分钟------后来发现有个表忘记加索引,就像让咖啡师用脚磨咖啡豆!


课后彩蛋:JOIN冷知识

  • 最早的JOIN操作需要手动写嵌套循环(1970年代的程序员头发就是这么没的)
  • 如果《哈利波特》人物表做JOIN:哈利 LEFT JOIN 父母 ON... 结果永远是NULL(泪目)
  • 在分布式数据库中,JOIN可能比霍格沃茨的楼梯还难搞

现在你已经成为"JOIN操作界的社交恐怖分子"!下一章我们将进入《子查询的高级用法------SQL世界的"俄罗斯套娃"艺术》的玄学领域,记得给你的数据库准备护肝片------性能优化是场持久战! 🚀

相关推荐
Channing Lewis40 分钟前
sql server如何创建表导入excel的数据
数据库·oracle·excel
秃头摸鱼侠41 分钟前
MySQL安装与配置
数据库·mysql·adb
UGOTNOSHOT1 小时前
每日八股文6.3
数据库·sql
行云流水行云流水1 小时前
数据库、数据仓库、数据中台、数据湖相关概念
数据库·数据仓库
John Song1 小时前
Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
数据库·redis·哈希算法
IvanCodes1 小时前
七、Sqoop Job:简化与自动化数据迁移任务及免密执行
大数据·数据库·hadoop·sqoop
tonexuan2 小时前
MySQL 8.0 绿色版安装和配置过程
数据库·mysql
JohnYan2 小时前
工作笔记- 记一次MySQL数据移植表空间错误排除
数据库·后端·mysql
我最厉害。,。2 小时前
Windows权限提升篇&数据库篇&MYSQL&MSSQL&ORACLE&自动化项目
数据库·mysql·sqlserver
远方16092 小时前
20-Oracle 23 ai free Database Sharding-特性验证
数据库·人工智能·oracle