MySQL查询去重复保留一条
引言
在实际的数据库应用开发中,我们经常需要从数据库中查询数据并展示。有时候我们会遇到查询结果中有重复的记录,而我们只想保留其中的一条。本文将详细介绍如何在MySQL中进行查询去重复并保留一条的操作。
1. 创建表
为了演示,我们首先需要创建一个包含重复记录的表students
。表结构如下:
CREATE TABLE students (
id INT(11) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT(3),
grade VARCHAR(10)
);
然后我们向表中插入一些数据,包括重复记录,用于后续的实例操作。
INSERT INTO students (name, age, grade) VALUES
('Alice', 18, 'A'),
('Bob', 19, 'B'),
('Alice', 18, 'A'),
('Cindy', 19, 'C'),
('Bob', 19, 'B');
2. 查询去重复并保留一条
在MySQL中,我们可以利用DISTINCT
关键字来去除重复记录。下面是一些常用的查询去重复的方法。
2.1 使用DISTINCT关键字
最常见的方法是在查询语句中使用DISTINCT
关键字,通过去重复后返回结果。下面的示例查询了表students
中的姓名,并通过DISTINCT
去重复:
SELECT DISTINCT name FROM students;
运行结果如下:
+-------+
| name |
+-------+
| Alice |
| Bob |
| Cindy |
+-------+
上述查询结果只显示了去重的姓名,但无法保留完整的一条记录。
2.2 使用GROUP BY子句
另一种方法是使用GROUP BY
子句,结合聚合函数来实现。例如,我们可以按照姓名name
进行分组,并选择每个分组的首个记录作为结果:
SELECT name, MIN(age), grade FROM students GROUP BY name;
运行结果如下:
+-------+---------+-------+
| name | MIN(age)| grade |
+-------+---------+-------+
| Alice | 18 | A |
| Bob | 19 | B |
| Cindy | 19 | C |
+-------+---------+-------+
上述查询结果通过MIN(age)
函数选择了每个分组中最小的年龄,保留了完整的一条记录。
2.3 使用子查询
还有一种方法是使用子查询,通过查询内嵌查询来实现。首先我们需要创建一个子查询,去除重复记录,并通过子查询的结果来获取完整的一条记录。
下面的示例中,我们首先查询了去重的姓名name
,然后将去重后的结果和原始表students
进行关联,最后通过子查询的结果来获取完整记录:
SELECT s1.id, s1.name, s1.age, s1.grade
FROM students s1
INNER JOIN (
SELECT MIN(id) AS min_id
FROM students
GROUP BY name
) s2 ON s1.id = s2.min_id;
运行结果如下:
+----+-------+-----+-------+
| id | name | age | grade |
+----+-------+-----+-------+
| 1 | Alice | 18 | A |
| 2 | Bob | 19 | B |
| 4 | Cindy | 19 | C |
+----+-------+-----+-------+
上述查询结果通过子查询的方式,获取了去重后每个分组中最小的id
,并通过关联查询获取了完整的一条记录。
结论
本文介绍了在MySQL中查询去重复并保留一条的操作方法。通过使用DISTINCT
关键字、GROUP BY
子句以及子查询,我们可以灵活地根据实际需求选择合适的方法。根据不同的场景和需求,选择适当的方法可以提高查询效率和准确性。