SQL DISTINCT 如何使用,有哪些实用的去重技巧

来源:AI编程作者:上海GEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《SQL DISTINCT 如何使用,有哪些实用的去重技巧》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《SQL DISTINCT 如何使用,有哪些实用的去重技巧》有用,将其分享出去将是对创作者最好的鼓励。

在数据库日常查询操作中,重复数据是非常常见的问题,比如用户表中同一个用户因为多次注册产生重复记录,订单表中同一笔订单因为关联查询出现多条相同数据,这时候就需要用到SQL的去重能力,其中DISTINCT是最基础也最常用的去重关键字。

SQL DISTINCT 如何使用,有哪些实用的去重技巧

DISTINCT 基础用法

单字段去重

单字段去重是DISTINCT最基础的用法,只需要在查询字段前加上DISTINCT关键字,就可以对指定字段的所有重复值进行去重,返回该字段的唯一值集合。

例如用户表user中有多个相同city的记录,要获取所有不重复的城市列表,查询语句如下:

-- 查询用户表中所有不重复的城市
SELECT DISTINCT city FROM user;

多字段联合去重

当需要对多个字段的组合进行去重时,只需要在DISTINCT后跟上多个字段,数据库会对这些字段的组合值进行判断,只有当所有字段的值都相同时才会被判定为重复数据。

比如要获取用户表中不重复的省份和城市组合,查询语句如下:

-- 查询不重复的省份+城市组合
SELECT DISTINCT province, city FROM user;

实用去重技巧

结合聚合函数去重统计

很多时候我们需要统计去重后的数据量,这时候可以将DISTINCT和COUNT函数结合使用,直接得到去重后的记录数,不需要先查询再去重统计。

例如统计用户表中不重复的城市数量:

-- 统计不重复的城市数量
SELECT COUNT(DISTINCT city) AS unique_city_count FROM user;

子查询中去重后关联

在复杂的多表关联查询中,如果关联表存在重复数据,直接关联会导致结果重复,这时候可以先对关联表用DISTINCT去重,再作为子查询进行关联。

比如订单表order和商品表product关联,商品表同一个商品有多个分类记录,要获取每个订单对应的唯一商品信息:

-- 先对商品表去重再关联订单表
SELECT o.order_id, p.product_name
FROM `order` o
LEFT JOIN (
    SELECT DISTINCT product_id, product_name FROM product
) p ON o.product_id = p.product_id;

结合窗口函数去重

如果需要保留去重后的完整记录,而不仅仅是去重字段,可以结合ROW_NUMBER窗口函数实现,通过给每个分组内的记录排序,取排序第一的记录实现去重。

例如要保留每个用户最新的一条注册记录:

-- 每个用户保留最新的一条注册记录
SELECT user_id, username, register_time
FROM (
    SELECT 
        user_id,
        username,
        register_time,
        ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY register_time DESC) AS rn
    FROM user
) t
WHERE t.rn = 1;

不同去重方案对比

不同的去重方案适用场景不同,性能也有差异,以下是常见方案的对比:

去重方案适用场景性能特点
DISTINCT 单/多字段去重只需要去重后的字段值,不需要保留完整记录逻辑简单,小数据量下性能较好,大数据量多字段去重时性能下降
DISTINCT + 聚合函数需要统计去重后的数量或聚合值比先查询再去重统计更高效,减少数据传输
窗口函数去重需要保留去重后的完整记录大数据量下分区排序的性能开销较大,适合复杂去重逻辑
GROUP BY 去重去重同时需要对其他字段做聚合计算和DISTINCT多字段去重逻辑类似,部分数据库下性能相当

注意事项

  • DISTINCT 关键字会对所有查询字段的组合进行去重,不要误以为只对第一个字段去重
  • 对NULL值进行去重时,所有NULL会被视为相同值,只会保留一个NULL记录
  • 大数据量去重时,建议给去重字段加上索引,提升查询性能
  • 如果只需要判断是否存在重复值,不需要返回具体数据,用EXISTS比DISTINCT更高效

SQLDISTINCT去重技巧数据库查询修改时间:2026-06-21 18:27:24

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。