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

相关推荐
LJianK16 分钟前
关系型数据库和非关系型数据库
sql
巨龙之路14 分钟前
什么是时序数据库?
数据库·时序数据库
蔡蓝19 分钟前
binlog日志以及MySQL的数据同步
数据库·mysql
是店小二呀1 小时前
【金仓数据库征文】金融行业中的国产化数据库替代应用实践
数据库·金融·数据库平替用金仓·金仓数据库2025征文
炒空心菜菜1 小时前
SparkSQL 连接 MySQL 并添加新数据:实战指南
大数据·开发语言·数据库·后端·mysql·spark
多多*2 小时前
算法竞赛相关 Java 二分模版
java·开发语言·数据结构·数据库·sql·算法·oracle
爱喝酸奶的桃酥2 小时前
MYSQL数据库集群高可用和数据监控平台
java·数据库·mysql
数据库幼崽2 小时前
MySQL 8.0 OCP 1Z0-908 61-70题
数据库·mysql·ocp
码农黛兮_463 小时前
SQL 索引优化指南:原理、知识点与实践案例
数据库·sql
爆肝疯学大模型3 小时前
SQL server数据库实现远程跨服务器定时同步传输数据
运维·服务器·数据库