一、查询不重复数据
MySQL有distinct、group by和having等实现查询不重复数据的方法,但实际上它们的实现机制并不完全一致,需根据实际场景选择最优解。
1. Distinct方法
SELECT DISTINCT column FROM table;
该方法适用于筛选单个字段不重复数据的场景,例如:
SELECT DISTINCT name FROM students;
这将返回去重后所有不同的名字。
2. Group By方法
SELECT column1, column2, ... FROM table GROUP BY column1, column2, ...;
该方法适用于筛选多个字段不重复数据的场景,例如:
SELECT name, age FROM students GROUP BY name, age;
这将返回去重后所有不同的姓名和对应年龄。
3. Having方法
SELECT column1, column2, ... FROM table GROUP BY column1, column2, ... HAVING condition;
该方法适用于筛选多个字段不重复数据并需要指定条件的场景,例如:
SELECT name, age FROM students GROUP BY name, age HAVING COUNT(*) > 1;
这将返回去重后所有重复的姓名和对应年龄。
二、删除重复数据
MySQL可以使用三种方法实现删除重复数据:去重查询+临时表、子查询和自联接。
1. 去重查询+临时表
首先使用去重查询构建一个临时表,再根据临时表的唯一键删除重复行:
CREATE TABLE temp_table SELECT DISTINCT * FROM table; ALTER TABLE temp_table ADD UNIQUE INDEX unique_index (column1, column2, ...); DELETE t1 FROM table t1, temp_table t2 WHERE t1.column1=t2.column1 AND t1.column2=t2.column2 ...;
2. 子查询
使用子查询筛选出重复行的主键值,再根据主键值删除重复行:
DELETE FROM table WHERE id IN (SELECT id FROM (SELECT id, column1, column2, ... FROM table GROUP BY column1, column2, ... HAVING COUNT(*) > 1) as temp_table);
3. 自联接
使用自联接查找重复数据的主键值,并根据主键值删除重复行:
DELETE t1 FROM table t1, table t2 WHERE t1.id > t2.id AND t1.column1=t2.column1 AND t1.column2=t2.column2 ...;
三、保留一条重复数据
MySQL中可以使用多种方法保留一条重复数据:使用子查询、临时表、内联接等,具体需根据数据特征和查询效率选取。
1. 子查询
使用子查询筛选出重复行中的最小/最大ID值,并将其余ID值删除:
DELETE FROM table WHERE id NOT IN (SELECT MIN(id) FROM table GROUP BY column1, column2 ...);
2. 临时表
使用临时表构建一份保留一条数据的副本,并将其余数据删除:
CREATE TABLE temp_table SELECT MIN(id) as id, column1, column2, ... FROM table GROUP BY column1, column2 ...; DELETE t1 FROM table t1 LEFT JOIN temp_table on t1.id=temp_table.id WHERE temp_table.id IS NULL;
3. 内联接
使用内联接查询保留一条数据:
DELETE t1 FROM table t1 INNER JOIN table t2 ON t1.column1=t2.column1 AND t1.column2=t2.column2 ... WHERE t1.id > t2.id;
四、小结
MySQL去重复保留一条数据,常用的方法有查询不重复数据、删除重复数据和保留一条重复数据三种,每种方法有多种实现方式,需根据具体场景选取最优解。
原创文章,作者:JDDR,如若转载,请注明出处:https://www.506064.com/n/136575.html