当前位置:首页 > 问答 > 正文

SQL查询 唯一值查找:使用SQL子查询实现查找唯一值

📊 SQL查询小技巧:用子查询揪出唯一值的神操作

场景再现
小张正对着销售数据库抓头发——老板要“每个客户的第一笔订单记录”,但客户ID在订单表里重复了N次,直接SELECT DISTINCT?不行,其他字段也跟着被“去重”了…这时,SQL子查询就该闪亮登场了!✨


🔍 什么是“唯一值查找”?

比如你想找:

  • 每个品类最贵的商品 🛍️
  • 每个学生的最高分成绩 📚
  • 每个IP地址的最新登录记录 💻

这些需求的核心:在重复数据中,按条件筛选唯一代表

SQL查询 唯一值查找:使用SQL子查询实现查找唯一值


🛠️ 实战SQL子查询三招

招式1️⃣:用WHERE+子查询锁定唯一值

SELECT * FROM orders  
WHERE order_id IN (  
    SELECT MIN(order_id)  -- 找每个客户最早的订单ID  
    FROM orders  
    GROUP BY customer_id  -- 按客户分组  
);  

效果:像筛子一样捞出每个客户的“第一条订单”完整记录 ✅


招式2️⃣:EXISTS子查询精准打击

SELECT p.* FROM products p  
WHERE NOT EXISTS (  
    SELECT 1 FROM products p2  
    WHERE p2.category = p.category  -- 同品类  
    AND p2.price > p.price         -- 且价格更高的  
);  

适用场景:找每个品类的价格天花板产品 👑


招式3️⃣:窗口函数+子查询(高级玩法)

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更灵活,能同时保留其他字段 🚀


💡 避坑指南

  • 性能注意:大数据表慎用多层嵌套子查询,试试临时表或CTE
  • 字段歧义:子查询中的别名要和外部查询区分开(比如用t1.t2.
  • NULL值:用NOT EXISTS时,NULL比较会失效,记得加IS NOT NULL条件

🌟 一句话总结

“子查询像SQL的瑞士军刀,分组过滤一气呵成,专治各种重复数据不服!”

SQL查询 唯一值查找:使用SQL子查询实现查找唯一值

下次遇到“找出每个XXX的YYY”类需求,不妨摸出这把利器试试吧~ 🔧

(注:本文示例基于MySQL语法,其他数据库可能需微调)

发表评论