自学内容网 自学内容网

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

第二章:高级查询技巧

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

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


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

-- 找出成功配对的情侣(有共同爱好)  
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——保留所有男生的悲情故事

-- 查看所有男生(即使没匹配到女生)  
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——被遗忘的江湖秘术

-- 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——披萨黑帮的家族关系网

-- 查找同一家族的披萨配方(共享秘制酱料)  
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——咖啡店宇宙的终极联动

-- 查询订单详情(顾客+咖啡+店员)  
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:索引黄金三件套
-- 为关联字段创建索引  
CREATE INDEX idx_customer ON orders(customer_id);  
CREATE INDEX idx_coffee ON orders(coffee_id);  
技巧2:EXPLAIN 诊断书
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
-- 先过滤再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世界的"俄罗斯套娃"艺术》的玄学领域,记得给你的数据库准备护肝片——性能优化是场持久战! 🚀


原文地址:https://blog.csdn.net/jrckkyy/article/details/145311993

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!