上一篇
场景再现:
小张正对着销售数据库抓头发——老板要“每个客户的第一笔订单记录”,但客户ID在订单表里重复了N次,直接SELECT DISTINCT
?不行,其他字段也跟着被“去重”了…这时,SQL子查询就该闪亮登场了!✨
比如你想找:
这些需求的核心:在重复数据中,按条件筛选唯一代表。
WHERE
+子查询锁定唯一值SELECT * FROM orders WHERE order_id IN ( SELECT MIN(order_id) -- 找每个客户最早的订单ID FROM orders GROUP BY customer_id -- 按客户分组 );
效果:像筛子一样捞出每个客户的“第一条订单”完整记录 ✅
EXISTS
子查询精准打击SELECT p.* FROM products p WHERE NOT EXISTS ( SELECT 1 FROM products p2 WHERE p2.category = p.category -- 同品类 AND p2.price > p.price -- 且价格更高的 );
适用场景:找每个品类的价格天花板产品 👑
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY department_id -- 按部门分组 ORDER BY salary DESC -- 工资排序 ) AS rn FROM employees ) AS ranked WHERE rn = 1; -- 只取每组第一名
优势:比GROUP BY
更灵活,能同时保留其他字段 🚀
t1.
、t2.
) NOT EXISTS
时,NULL比较会失效,记得加IS NOT NULL
条件 “子查询像SQL的瑞士军刀,分组过滤一气呵成,专治各种重复数据不服!”
下次遇到“找出每个XXX的YYY”类需求,不妨摸出这把利器试试吧~ 🔧
(注:本文示例基于MySQL语法,其他数据库可能需微调)
本文由 澹台韵 于2025-08-07发表在【云服务器提供商】,文中图片由(澹台韵)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/560403.html
发表评论