sql 中 distinct 用法_sql 中 distinct 去重技巧

sql 中 distinct 用法_sql 中 distinct 去重技巧
最新回答
草莓少女自然甜

2026-06-30 08:08:03

SQL 中 DISTINCT 的核心作用是去除查询结果中的重复行,其用法涵盖单列去重、多列组合去重、与聚合函数配合及性能优化等场景,需结合业务逻辑避免误用。

1. 基本用法:单列去重

DISTINCT 最简单的应用是对单列数据去重,返回该列所有唯一值。例如查询用户表中的不同城市:

SELECT DISTINCT city FROM users;
  • 作用范围:DISTINCT 作用于整个结果行,但仅返回指定列的唯一值。
  • NULL 处理:多个 NULL 值会被视为相同,结果中仅保留一个 NULL。

2. 多列组合去重

当需要对多列的组合值去重时,DISTINCT 会检查所有指定列的组合是否重复。例如查询用户表中姓名和年龄的唯一组合:

SELECT DISTINCT name, age FROM users;
  • 注意事项:

    隐藏重复:若数据本身存在重复组合(如两行均为“张三,25”),DISTINCT 会正常去重。

    JOIN 风险:若多列来自多表 JOIN 结果,JOIN 可能放大行数,导致 DISTINCT 未达预期。例如:SELECT DISTINCT u.name, o.order_date FROM users u JOIN orders o ON u.id = o.user_id;若一个用户有多笔订单,结果中会包含该用户与每个订单日期的组合,DISTINCT 仅去除完全相同的组合,而非按用户去重。

3. 与聚合函数配合使用

DISTINCT 常与 COUNT、SUM 等聚合函数结合,统计唯一值的数量或总和。例如统计不同城市的用户数量:

SELECT COUNT(DISTINCT city) FROM users;
  • 对比误用:若省略 DISTINCT,COUNT(city) 仅统计非空值数量,而非不同城市的数量。
  • 其他聚合函数:

    SUM(DISTINCT salary):计算不同薪资的总和。

    AVG(DISTINCT score):计算不同分数的平均值。

  • GROUP BY 限制:在 GROUP BY 查询中混用未聚合字段可能导致 DISTINCT 不生效,需谨慎设计。
4. 性能优化与替代方案

DISTINCT 依赖排序和去重操作,大数据量下可能影响查询效率。以下场景可优化:

  • 使用 GROUP BY 替代:若已按某些字段分组,GROUP BY 本身会去重,无需额外使用 DISTINCT。例如:-- 替代方案:按城市分组后统计SELECT city, COUNT(*) FROM users GROUP BY city;
  • 确认数据无重复:若数据本身无重复,省略 DISTINCT 可提升性能。
  • 避免 JOIN 后滥用:对 JOIN 结果使用 DISTINCT 前,先检查是否有重复来源(如多对多关系),优先优化 JOIN 逻辑。
5. 特殊场景与注意事项
  • NULL 值处理:所有 NULL 被视为相同,结果中仅保留一个。
  • 业务逻辑结合:DISTINCT 仅从技术层面去重,需结合业务需求判断是否需要去重。例如:

    统计用户访问页面次数时,若需按用户去重,需明确“用户”的定义(如用户ID)。

    避免在复杂查询中过度依赖 DISTINCT,可能掩盖数据模型设计问题。

总结
  • 单列去重:直接使用 SELECT DISTINCT column。
  • 多列去重:确保组合逻辑符合预期,警惕 JOIN 放大行数。
  • 聚合函数:优先使用 COUNT(DISTINCT column) 统计唯一值。
  • 性能优化:大数据量下用 GROUP BY 替代或优化数据模型。
  • 业务校验:去重前明确业务需求,避免误删有效数据。

正确使用 DISTINCT 可简化查询逻辑,但需权衡性能与准确性,尤其在复杂场景中需结合数据特点设计。