SQL 查询中的 DISTINCT
在数据库查询中,DISTINCT
关键字用于从结果集中删除重复的记录,它通常与SELECT
语句一起使用,以确保每个选定的行都是唯一的,这对于数据分析、报告生成和数据清理等场景非常有用,本文将详细介绍DISTINCT
的使用及其相关概念。

基本用法
DISTINCT
最基本的用法是直接放在SELECT
语句后面,用来选择不重复的列值。
SELECT DISTINCT column1, column2 FROM table_name;
这条语句会返回table_name
表中column1
和column2
组合的唯一值。
示例
假设有一个名为employees
的表,包含以下数据:
id | name | department |
1 | Alice | HR |
2 | Bob | IT |
3 | Charlie | HR |
4 | Dave | IT |
5 | Eve | Finance |
如果我们想获取所有不同的部门名称,可以使用以下查询:
SELECT DISTINCT department FROM employees;
这将返回:
department |
HR |
IT |
Finance |

多列组合的唯一性
DISTINCT
也可以用于多个列的组合,要获取每个部门中唯一的员工姓名,可以使用:
SELECT DISTINCT department, name FROM employees;
这将返回:
department | name |
HR | Alice |
IT | Bob |
IT | Dave |
Finance | Eve |
注意,即使两个员工的姓名相同,但只要他们的部门不同,它们仍然会被认为是唯一的组合。
性能考虑
使用DISTINCT
时需要注意性能问题,对于大型数据集,DISTINCT
可能会导致查询变慢,因为它需要对结果进行排序和过滤以消除重复项,如果查询的性能成为问题,可以考虑以下优化方法:
1、索引:确保查询中使用的列上有适当的索引,这可以加快查找速度。

2、子查询:有时使用子查询可以更有效地实现相同的结果,
SELECT department FROM employees GROUP BY department;
这种方法在某些情况下可能比使用DISTINCT
更高效。
结合其他 SQL 功能
DISTINCT
可以与其他 SQL 功能结合使用,如ORDER BY
、LIMIT
等,如果你想按字母顺序获取前五个不同的部门名称,可以使用:
SELECT DISTINCT department FROM employees ORDER BY department LIMIT 5;
这将返回按字母顺序排列的前五个不同的部门名称。
相关问题与解答
问题1:DISTINCT
和GROUP BY
有什么区别?
解答:DISTINCT
用于去除结果集中的重复行,而GROUP BY
用于将结果集分组并允许对每组应用聚合函数(如COUNT()
,SUM()
等),虽然两者都可以用于消除重复项,但它们的用途和应用场景不同。DISTINCT
更简单,适用于不需要聚合的情况;GROUP BY
则提供了更多的灵活性和功能。
问题2: 如何在使用DISTINCT
时指定排序?
解答: 在使用DISTINCT
时指定排序非常简单,只需在DISTINCT
后添加ORDER BY
子句即可,要对不同的部门名称按字母顺序排序,可以使用:
SELECT DISTINCT department FROM employees ORDER BY department;
这将确保结果集中的部门名称是唯一的,并且按照字母顺序排列。