2026-06-30 08:08:03
SQL 中 DISTINCT 的核心作用是去除查询结果中的重复行,其用法涵盖单列去重、多列组合去重、与聚合函数配合及性能优化等场景,需结合业务逻辑避免误用。
1. 基本用法:单列去重DISTINCT 最简单的应用是对单列数据去重,返回该列所有唯一值。例如查询用户表中的不同城市:
SELECT DISTINCT city FROM users;
当需要对多列的组合值去重时,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 仅去除完全相同的组合,而非按用户去重。
DISTINCT 常与 COUNT、SUM 等聚合函数结合,统计唯一值的数量或总和。例如统计不同城市的用户数量:
SELECT COUNT(DISTINCT city) FROM users;SUM(DISTINCT salary):计算不同薪资的总和。
AVG(DISTINCT score):计算不同分数的平均值。
DISTINCT 依赖排序和去重操作,大数据量下可能影响查询效率。以下场景可优化:
统计用户访问页面次数时,若需按用户去重,需明确“用户”的定义(如用户ID)。
避免在复杂查询中过度依赖 DISTINCT,可能掩盖数据模型设计问题。
正确使用 DISTINCT 可简化查询逻辑,但需权衡性能与准确性,尤其在复杂场景中需结合数据特点设计。