【趣学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;
执行顺序解密:
- 先让
orders
和customers
牵手成功 - 带着这对情侣去找
coffees
三方会谈 - 最后邀请
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)!