SQL DISTINCT 去重
学习 DISTINCT 和 COUNT DISTINCT · 难度:入门 · +10XP
SQL DISTINCT 去重
在数据库查询中,经常会遇到重复数据的问题。例如学生表中同一个学生可能被录入多次,或者你想知道班级里有多少个不同的年龄值。SQL 提供了 DISTINCT 关键字来帮助我们去除查询结果中的重复行,只返回唯一值。
DISTINCT 基本语法
DISTINCT 放在 SELECT 之后、列名之前,表示对该列(或多列)进行去重操作:
SELECT DISTINCT 列名 FROM 表名;
SELECT DISTINCT 列1, 列2 FROM 表名;
当指定多个列时,DISTINCT 会对列的组合进行去重,即只有当所有指定列的值都相同时,才视为重复行。
实际示例
假设有一个 students 表,包含 id、name、age 和 score 字段:
-- 查询所有不重复的年龄
SELECT DISTINCT age FROM students;
-- 查询年龄和分数的唯一组合
SELECT DISTINCT age, score FROM students;
-- 查询不同城市的数量
SELECT COUNT(DISTINCT city) FROM students;
COUNT + DISTINCT 组合
DISTINCT 常常与 COUNT 聚合函数搭配使用,用来统计不重复值的个数。这在数据分析中非常有用:
-- 统计有多少个不同的年龄值
SELECT COUNT(DISTINCT age) FROM students;
-- 统计有多少个不同的年龄段
SELECT COUNT(DISTINCT CASE WHEN age<20 THEN '少年' ELSE '青年' END) FROM students;
DISTINCT 与 GROUP BY 的区别
虽然 DISTINCT 和 GROUP BY 都能实现去重,但它们的应用场景不同:
| 特性 | DISTINCT | GROUP BY |
|---|---|---|
| 主要用途 | 仅去除重复行 | 分组 + 聚合计算 |
| 能否使用聚合函数 | 不直接支持 | 支持(COUNT/SUM/AVG等) |
| 执行顺序 | 在 SELECT 之后去重 | 先分组再聚合 |
DISTINCT 与 ORDER BY 配合
你可以在使用 DISTINCT 的同时对结果进行排序:
SELECT DISTINCT age FROM students ORDER BY age DESC;
SELECT DISTINCT city FROM users ORDER BY city;
注意事项
- DISTINCT 会对所有选择的列进行去重,而非仅对第一列
- DISTINCT 关键字必须紧跟在 SELECT 之后
- 在大数据量表上使用 DISTINCT 可能影响查询性能,因为数据库需要排序或哈希来去重
- NULL 值在 DISTINCT 中被视为相同的值,结果中只保留一个 NULL
- DISTINCT 不是函数,不要写成
SELECT DISTINCT(age),正确写法是SELECT DISTINCT age
实战任务
给定 students 表,请完成以下查询:
- 查询所有不重复的分数值
- 统计有多少种不同的年龄
- 按分数降序排列,查询不重复的姓名和分数组合