この記事では、操作のMySQLの重複データに分割説明表操作するクエリと削除の重複(主キーがないテーブル含むケース)。次のようにデータソースを高めるために、実証するためのケーススタディとして、テーブルで操作し、ここで直感的な、学生の方法を説明するために:
/*建立学生表。*/
CREATE TABLE `student_info` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`student_name` VARCHAR(10) DEFAULT NULL,
`class_no` VARCHAR(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=116 DEFAULT CHARSET=utf8
/*新增数据。*/
INSERT INTO student_info (student_name,class_no)
VALUES
('张三','一班'),
('李四','一班'),
('钱七','二班'),
('王八','二班'),
('王八','二班'),
('王八','一班')
/*查询学生表是否有重复数据,如果有则展示重复项的其中一条。*/
SELECT * FROM student_info GROUP BY student_name,class_no HAVING COUNT(1)>1
/*查询学生表是否有重复数据,如果有则展示所有重复项。*/
SELECT * FROM student_info WHERE (student_name,class_no) IN(
SELECT student_name,class_no FROM student_info GROUP BY student_name,class_no HAVING COUNT(1)>1
)
/*查询学生表并过滤重复项。*/
/*方法一:*/
SELECT * FROM student_info GROUP BY student_name,class_no
/*方法二(DISTINCT前不能有字段):*/
SELECT DISTINCT student_name,class_no FROM student_info
/*删除重复项,保留一条数据(有主键)。*/
/*方法一:*/
DELETE FROM student_info WHERE id NOT IN
(
SELECT a.id FROM (
SELECT id FROM student_info GROUP BY student_name,class_no
)a
)
/*方法二:*/
DELETE FROM student_info WHERE id IN(
SELECT a.id FROM(
SELECT id FROM student_info WHERE (student_name,class_no)IN(
SELECT student_name,class_no FROM student_info GROUP BY student_name,class_no HAVING COUNT(1)>1
)AND id NOT IN(
SELECT id FROM student_info GROUP BY student_name,class_no HAVING COUNT(1)>1)
)a
)
/*删除重复项,保留一条数据(无主键)。*/
/*先删除学生表的主键。*/
ALTER TABLE `student_info` DROP COLUMN id ;
/*第一步:新增主键列(我这里设置的是自增模式)。*/
ALTER TABLE student_info ADD id INT AUTO_INCREMENT PRIMARY KEY FIRST;
/*第二步:同上面的去重方法。*/
/*第三步:删除刚才新增的列。*/
ALTER TABLE `student_info` DROP COLUMN id ;