例1,表中有主键(可唯一标识的字段),且该字段为数字类型

1 测试数据

 /* 表结构 */
DROP TABLE IF EXISTS `t1`;
CREATE TABLE IF NOT EXISTS `t1`(
`id` INT(1) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL,
`add` VARCHAR(20) NOT NULL,
PRIMARY KEY(`id`)
)Engine=InnoDB; /* 插入测试数据 */
INSERT INTO `t1`(`name`,`add`) VALUES
('abc',"123"),
('abc',"123"),
('abc',"321"),
('abc',"123"),
('xzy',"123"),
('xzy',"456"),
('xzy',"456"),
('xzy',"456"),
('xzy',"789"),
('xzy',"987"),
('xzy',"789"),
('ijk',"147"),
('ijk',"147"),
('ijk',"852"),
('opq',"852"),
('opq',"963"),
('opq',"741"),
('tpk',"741"),
('tpk',"963"),
('tpk',"963"),
('wer',"546"),
('wer',"546"),
('once',"546"); SELECT * FROM `t1`;
+----+------+-----+
| id | name | add |
+----+------+-----+
| 1 | abc | 123 |
| 2 | abc | 123 |
| 3 | abc | 321 |
| 4 | abc | 123 |
| 5 | xzy | 123 |
| 6 | xzy | 456 |
| 7 | xzy | 456 |
| 8 | xzy | 456 |
| 9 | xzy | 789 |
| 10 | xzy | 987 |
| 11 | xzy | 789 |
| 12 | ijk | 147 |
| 13 | ijk | 147 |
| 14 | ijk | 852 |
| 15 | opq | 852 |
| 16 | opq | 963 |
| 17 | opq | 741 |
| 18 | tpk | 741 |
| 19 | tpk | 963 |
| 20 | tpk | 963 |
| 21 | wer | 546 |
| 22 | wer | 546 |
| 23 | once | 546 |
+----+------+-----+
rows in set (0.00 sec)

2 查找id最小的重复数据(只查找id字段)

 /* 查找id最小的重复数据(只查找id字段) */

 SELECT DISTINCT
MIN(`id`) AS `id`
FROM
t1
GROUP BY
`name`,
`add`
HAVING
COUNT(1) > 1; +------+
| id |
+------+
| 1 |
| 12 |
| 19 |
| 21 |
| 6 |
| 9 |
+------+
rows in set (0.00 sec)

3 查找所有重复数据

 SELECT `t1`.*
FROM `t1`,(
SELECT `name`,`add`
FROM `t1`
GROUP BY `name`,`add`
HAVING COUNT(1) > 1
) AS `t2`
WHERE `t1`.`name` = `t2`.`name`
AND `t1`.`add` = `t2`.`add`; +----+------+-----+
| id | name | add |
+----+------+-----+
| 1 | abc | 123 |
| 2 | abc | 123 |
| 4 | abc | 123 |
| 6 | xzy | 456 |
| 7 | xzy | 456 |
| 8 | xzy | 456 |
| 9 | xzy | 789 |
| 11 | xzy | 789 |
| 12 | ijk | 147 |
| 13 | ijk | 147 |
| 19 | tpk | 963 |
| 20 | tpk | 963 |
| 21 | wer | 546 |
| 22 | wer | 546 |
+----+------+-----+
rows in set (0.00 sec)

4 查找除id最小的数据外的重复数据

 SELECT `t1`.*
FROM `t1`,(
SELECT DISTINCT MIN(`id`) AS `id`,`name`,`add`
FROM `t1`
GROUP BY `name`,`add`
HAVING COUNT(1) > 1
) AS `t2`
WHERE `t1`.`name` = `t2`.`name`
AND `t1`.`add` = `t2`.`add`
AND `t1`.`id` <> `t2`.`id`;
+----+------+-----+
| id | name | add |
+----+------+-----+
| 2 | abc | 123 |
| 4 | abc | 123 |
| 7 | xzy | 456 |
| 8 | xzy | 456 |
| 11 | xzy | 789 |
| 13 | ijk | 147 |
| 20 | tpk | 963 |
| 22 | wer | 546 |
+----+------+-----+
rows in set (0.00 sec)

5 删除重复数据,只保留一条数据 id最小的

 DELETE FROM t1 USING t1,
(
SELECT
DISTINCT MIN(`id`) AS `id`,`name`,`add`
FROM t1
GROUP BY `name`, `add`
HAVING COUNT(1) > 1
) AS t2 //选中重复记录id最小的
WHERE
t1.`name` = t2.`name`
AND t1.`add` = t2.`add`
AND t1.id <> t2.id; 受影响的行: 8
时间: 0.111s
 6 查看数据库

 SELECT
t1.id,
t1.`name`,
t1.`add`
FROM
t1 1 abc 123
3 abc 321
5 xzy 123
6 xzy 456
9 xzy 789
10 xzy 987
12 ijk 147
14 ijk 852
15 opq 852
16 opq 963
17 opq 741
18 tpk 741
19 tpk 963
21 wer 546
23 once 546

例2,表中没有主键(可唯一标识的字段),或者主键并非数字类型(也可以删除重复数据,但效率上肯定比较慢)

 1 测试数据

 /* 表结构 */
DROP TABLE IF EXISTS `noid`;
CREATE TABLE IF NOT EXISTS `noid`(
`pk` VARCHAR(20) NOT NULL COMMENT '字符串主键',
`name` VARCHAR(20) NOT NULL,
`add` VARCHAR(20) NOT NULL,
PRIMARY KEY(`pk`)
)Engine=InnoDB; /* 测试数据,与上例一样的测试数据,只是主键变为字符串形式 */
INSERT INTO `noid`(`pk`,`name`,`add`) VALUES
('a','abc',"123"),
('b','abc',"123"),
('c','abc',"321"),
('d','abc',"123"),
('e','xzy',"123"),
('f','xzy',"456"),
('g','xzy',"456"),
('h','xzy',"456"),
('i','xzy',"789"),
('j','xzy',"987"),
('k','xzy',"789"),
('l','ijk',"147"),
('m','ijk',"147"),
('n','ijk',"852"),
('o','opq',"852"),
('p','opq',"963"),
('q','opq',"741"),
('r','tpk',"741"),
('s','tpk',"963"),
('t','tpk',"963"),
('u','wer',"546"),
('v','wer',"546"),
('w','once',"546"); SELECT * FROM `noid`;
+----+------+-----+
| pk | name | add |
+----+------+-----+
| a | abc | 123 |
| b | abc | 123 |
| c | abc | 321 |
| d | abc | 123 |
| e | xzy | 123 |
| f | xzy | 456 |
| g | xzy | 456 |
| h | xzy | 456 |
| i | xzy | 789 |
| j | xzy | 987 |
| k | xzy | 789 |
| l | ijk | 147 |
| m | ijk | 147 |
| n | ijk | 852 |
| o | opq | 852 |
| p | opq | 963 |
| q | opq | 741 |
| r | tpk | 741 |
| s | tpk | 963 |
| t | tpk | 963 |
| u | wer | 546 |
| v | wer | 546 |
| w | once | 546 |
+----+------+-----+
rows in set (0.00 sec)

2 为表添加自增长的id字段

 /* 为表添加自增长的id字段 */
ALTER TABLE `noid` ADD `id` INT(1) NOT NULL AUTO_INCREMENT, ADD INDEX `id`(`id`);
Query OK, 23 rows affected (0.16 sec)
Records: 23 Duplicates: 0 Warnings: 0 SELECT * FROM `noid`;
+----+------+-----+----+
| pk | name | add | id |
+----+------+-----+----+
| a | abc | 123 | 1 |
| b | abc | 123 | 2 |
| c | abc | 321 | 3 |
| d | abc | 123 | 4 |
| e | xzy | 123 | 5 |
| f | xzy | 456 | 6 |
| g | xzy | 456 | 7 |
| h | xzy | 456 | 8 |
| i | xzy | 789 | 9 |
| j | xzy | 987 | 10 |
| k | xzy | 789 | 11 |
| l | ijk | 147 | 12 |
| m | ijk | 147 | 13 |
| n | ijk | 852 | 14 |
| o | opq | 852 | 15 |
| p | opq | 963 | 16 |
| q | opq | 741 | 17 |
| r | tpk | 741 | 18 |
| s | tpk | 963 | 19 |
| t | tpk | 963 | 20 |
| u | wer | 546 | 21 |
| v | wer | 546 | 22 |
| w | once | 546 | 23 |
+----+------+-----+----+
rows in set (0.00 sec)

MySQL中必须是有索引的字段才可以使用AUTO_INCREMENT

3 删除重复数据与上例一样,记得删除完数据把id字段也删除了

删除重复数据,只保留一条数据 保留id最小的

 DELETE FROM `noid`
USING `noid`,(
SELECT DISTINCT MIN(`id`) AS `id`,`name`,`add`
FROM `noid`
GROUP BY `name`,`add`
HAVING COUNT(1) > 1
) AS `t2`
WHERE `noid`.`name` = `t2`.`name`
AND `noid`.`add` = `t2`.`add`
AND `noid`.`id` <> `t2`.`id`;
Query OK, 8 rows affected (0.05 sec)
 = 删除id字段 =
ALTER TABLE `noid` DROP `id`;
Query OK, 15 rows affected (0.16 sec)
Records: 15 Duplicates: 0 Warnings: 0 SELECT * FROM `noid`;
+----+------+-----+
| pk | name | add |
+----+------+-----+
| a | abc | 123 |
| c | abc | 321 |
| e | xzy | 123 |
| f | xzy | 456 |
| i | xzy | 789 |
| j | xzy | 987 |
| l | ijk | 147 |
| n | ijk | 852 |
| o | opq | 852 |
| p | opq | 963 |
| q | opq | 741 |
| r | tpk | 741 |
| s | tpk | 963 |
| u | wer | 546 |
| w | once | 546 |
+----+------+-----+
rows in set (0.00 sec)

最新文章

  1. 利用Python进行数据分析(9) pandas基础: 汇总统计和计算
  2. JSP读取My SQL数据乱码问题的解决
  3. 登陆mysql时提示异常的解决方法
  4. NPOI的版本查看
  5. 问题分享:ActiveX component can&#39;t create object: &quot;MSComDlg.CommonDialog&quot;
  6. jquery.placeholder.js的使用
  7. 在Update Panel 控件里面添加 File Upload 控件 上传文件
  8. /home 和 /root
  9. PHP数据访问修改和多条件查询(20161030)
  10. 从零开始理解JAVA事件处理机制(2)
  11. 关于键盘事件对象code值
  12. Aquarium Tank(csu1634+几何+二分)Contest2087 - 湖南多校对抗赛(2015.05.24)-G
  13. Oracle INTERVAL
  14. [SoapUI] 判断工程下某个文件是否存在,存在就删除
  15. 【Linux】好玩的Linux命令(二)
  16. c++ 中的符号与关键字
  17. maven 安装与配置最佳实践
  18. CSS中的height与line-height的区别
  19. Nginx教程(五) Nginx配置文件详解
  20. 深入理解Feign之源码解析

热门文章

  1. Mysql报Packet for query is too large (1040 &gt; 1024)错误
  2. Flink本地环境安装部署
  3. Linux Guard Service - 守护进程再次分裂子进程
  4. makefile文件。批处理文件。
  5. sql 存储过程带有模糊查询条件
  6. [Oracle]Oracle部分函数
  7. .Net Core IFormFile 始终为空的问题
  8. DS博客作业01-日期抽象数据类型的设计与实现
  9. WPF TextCompositionManager 事件说明
  10. CTF web题型解题技巧