【趣学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世界的"俄罗斯套娃"艺术》的玄学领域,记得给你的数据库准备护肝片------性能优化是场持久战! 🚀

相关推荐
island13141 小时前
【QT】 控件 -- 显示类
开发语言·数据库·qt
Andya_net2 小时前
网络安全 | F5-Attack Signatures-Set详解
网络·数据库·web安全
码农幻想梦2 小时前
实验二 数据库的附加/分离、导入/导出与备份/还原
数据库·oracle
hillstream33 小时前
Synology 群辉NAS安装(6)安装mssql
数据库·sqlserver
行十万里人生4 小时前
Qt 控件与布局管理
数据库·qt·microsoft·华为od·华为·华为云·harmonyos
betazhou4 小时前
sysbench压力测试工具mysql以及postgresql
数据库·mysql·postgresql
莳花微语4 小时前
OGG 19C 集成模式启用DDL复制
数据库·oracle
潜水的码不二4 小时前
Redis高阶3-缓存双写一致性
数据库·redis·缓存
落霞的思绪4 小时前
Redis实战(黑马点评)——关于缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、Redis工具)
数据库·spring boot·redis·后端·缓存
老苏畅谈运维7 小时前
MySQL性能分析的“秘密武器”,深度剖析SQL问题
数据库·sql·mysql