mysql去除重复记录案例
例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)
mysql去除重复记录案例的更多相关文章
- SQL Server数据库--》top关键字,order by排序,distinct去除重复记录,sql聚合函数,模糊查询,通配符,空值处理。。。。
top关键字:写在select后面 字段的前面 比如你要显示查询的前5条记录,如下所示: select top 5 * from Student 一般情况下,top是和order by连用的 orde ...
- SQL去除重复记录
SQL去除重复记录 if not object_id('Tempdb..#T') is null drop table #T Go Create table #T([ID] int,[Name ...
- mysql 去除重复 Select中DISTINCT关键字的用法 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是 distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,
在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记 ...
- mysql 删除重复记录语句
mysql 根据条件删除重复记录 只保留最小id的重复数据 DELETEFROM newsWHERE news_id IN ( SELECT a.news_id FROM ( SELECT news_ ...
- MySQL删除重复记录的方法
参考网上的方法,总结了产出重复记录的方法,欢迎交流. 参考:http://www.cnblogs.com/nzbbody/p/4470638.html 方法1:创建一个新表临时储存数据 假设我们有一个 ...
- Mysql删除重复记录,保留id最小的一条
mysql 查询重复字段,及删除重复记录的方法MySQL, 数据库, 数据库, 字段, 服务器数据库中有个大表,需要查找其中的名字有重复的记录id,以便比较.如果仅仅是查找数据库中name不重复的字段 ...
- mysql 去除重复 Select中DISTINCT关键字的用法(查询两列,只去掉重复的一列)
在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的 ...
- mysql删除重复记录语句的方法
例如: id name value 1 a pp 2 a pp 3 b iii 4 b pp 5 b pp 6 c pp 7 c pp 8 c iii id是主键 要求得到这样的结果 id name ...
- sql 去除重复记录
1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select peopleId from ...
随机推荐
- vim出现“E212: Can't open file for writing”的处理办法
在使用vim 对文件或配置进行编辑的时候,在保存时发现当前用户没有写权限.又不想放弃当前编辑的内容,怎么办呢? 来自stackoverflow “For some reason the file yo ...
- [转载]MVC、MVP以及Model2(上)
对于大部分面向最终用户的应用来说,它们都需要具有一个可视化的UI与用户进行交互,我们将这个UI称为视图(View).在早期,我们倾向于将所有与视图相关的逻辑糅合在一起,这些逻辑包括数据的呈现.用户操作 ...
- mysqldump的简单使用
背景 需要搞mysql数据同步,从一台服务器把数据库同步到另外一台服务器上,如果折腾过的话,就知道有个这玩意--mysqldump,其实就是mysql自带的一个命令而已 操作步骤 1. 认识mysql ...
- django:multivaluedictkeyerror错误
查了一下,是因为获取前台数据时,用了request.POST[],改用request.POST.get()之后没有这个报错了 细节: request.POST是用来接受从前端表单中传过来的数据,比如用 ...
- .NET中的异常处理机制(二)
本文我们继续通过另一个例子来讲解在C#中如何捕捉异常并进行处理. 首先,我们新建一个控制台应用和一个Class Library Project.如下图所示. 图1 ConsoleUI应用 图2 Exc ...
- SQL去除重复记录
SQL去除重复记录 if not object_id('Tempdb..#T') is null drop table #T Go Create table #T([ID] int,[Name ...
- 如何让Gogland不过期,一直使用?
Gogland是jetBrains公司出品的GO语言开发IDE,是目前最好的GO语言开发工具!!但是目前Gogland提供的试用版,有一定的使用期限,如何到期还能使用?经过我的测试,如果Gogland ...
- parseInt/类型转换/字符串
1.pa'rseInt整型 1.1parseInt必须以数字开头的 var topVal = parseInt("28px"); console.log(topVal); 1.2非 ...
- Django-DRF-视图的演变
版本一(基于类视图APIView类) views.py: APIView是继承的Django View视图的. from .serializers import UserSerializers #导入 ...
- Leetcode 98 验证二叉搜索树 Python实现
给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...