在处理数据库时,我们经常需要对数据进行清洗,去除重复的记录。SQL(结构化查询语言)提供了多种方法来实现这一目标。本文将详细介绍四种常用的SQL去重方法,包括使用DISTINCT关键字,使用GROUP BY子句,使用ROW_NUMBER()函数,以及使用EXISTS子查询。希望这些方法能帮助你更有效地处理数据。
方法一:使用DISTINCT关键字
DISTINCT关键字可以在查询结果中去除重复的行,只保留唯一的行。例如,如果你想查询员工表中不同的部门名称,可以使用以下语句:
SELECT DISTINCT dept_name FROM employees;
方法二:使用GROUP BY子句
GROUP BY子句可以根据一个或多个列对查询结果进行分组,然后可以对每个分组应用聚合函数,如COUNT、SUM、AVG等。如果只想去重,而不需要聚合函数,可以使用GROUP BY子句配合任意一个聚合函数,如MIN、MAX等。例如,如果你想查询员工表中不同的部门名称和部门编号,可以使用以下语句:
SELECT dept_name, dept_no, MIN(emp_no) FROM employees GROUP BY dept_name, dept_no;
方法三:使用ROW_NUMBER()函数
ROW_NUMBER()函数可以为每一行分配一个序号,根据一个或多个列进行排序。如果想去重某些列,可以使用ROW_NUMBER()函数配合一个子查询,只选择序号为1的行。例如,如果你想查询员工表中不同的部门名称和部门编号,可以使用以下语句:
SELECT dept_name, dept_no FROM (
SELECT dept_name, dept_no, ROW_NUMBER() OVER (PARTITION BY dept_name, dept_no ORDER BY emp_no) AS rn FROM employees
) AS t WHERE rn = 1;
方法四:使用EXISTS子查询
EXISTS子查询可以判断一个子查询是否返回至少一行结果。如果想去重某些列,可以使用EXISTS子查询配合一个相关子查询,只选择不存在重复值的行。例如,如果你想查询员工表中不同的部门名称和部门编号,可以使用以下语句:
SELECT dept_name, dept_no FROM employees e1 WHERE NOT EXISTS (
SELECT 1 FROM employees e2 WHERE e2.dept_name = e1.dept_name AND e2.dept_no = e1.dept_no AND e2.emp_no < e1.emp_no
);