文档章节

温故知新MySQL--如何在MySQL表中删除重复行

脱脂蛋丁
 脱脂蛋丁
发布于 2017/09/08 10:47
字数 540
阅读 2
收藏 0
点赞 0
评论 0

如何在MySQL表中删除重复行

在实际应用中,会有需要删除重复数据的场景。这里简单介绍下如何删除重复的数据

1. 准备数据

CREATE IF NOT  EXISTS testdb;

USE testdb;

CREATE TABLE contacts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    first_name VARCHAR(50) DEFAULT NULL,
    last_name VARCHAR(50) DEFAULT NULL, 
    email VARCHAR(255) NOT NULL
);

INSERT INTO contacts (first_name,last_name,email) 
VALUES ('Carine ','Schmitt','carine.schmitt@yiibai.com'),
       ('Jean','King','jean.king@gmail.com'),
       ('Peter','Ferguson','peter.ferguson@google.com'),
       ('Janine ','Labrune','janine.labrune@qq.com'),
       ('Jonas ','Bergulfsen','jonas.bergulfsen@mac.com'),
       ('Janine ','Labrune','janine.labrune@qq.com'),
       ('Susan','Nelson','susan.nelson@qq.com'),
       ('Zbyszek ','Piestrzeniewicz','zbyszek.piestrzeniewicz@att.com'),
       ('Roland','Keitel','roland.keitel@yahoo.com'),
       ('Julie','Murphy','julie.murphy@yahoo.com'),
       ('Kwai','Lee','kwai.lee@google.com'),
       ('Jean','King','jean.king@qq.com'),
       ('Susan','Nelson','susan.nelson@qq.com'),
       ('Roland','Keitel','roland.keitel@yahoo.com');

首先可以查询重复的内容,执行以下语句查询返回contacts表中的重复email值:

SELECT 
    email, COUNT(email)
FROM
    contacts
GROUP BY email
HAVING COUNT(email) > 1;

得到结果:

+-------------------------+--------------+
| email                   | COUNT(email) |
+-------------------------+--------------+
| janine.labrune@qq.com   |            2 |
| roland.keitel@yahoo.com |            2 |
| susan.nelson@qq.com     |            2 |
+-------------------------+--------------+
3 rows in set

可以看到,表中有重复的email行记录。

2. DELETE JOIN删除

MySQL提供了可以快速删除重复行的Delete join语句,以下语句删除重复行并保持最高的id:

DELETE t1 FROM contacts t1
        INNER JOIN
    contacts t2 
WHERE
    t1.id < t2.id AND t1.email = t2.email;

Query OK, 3 rows affected

如上所示,三行记录被删除。再次执行查询重复的语句:

SELECT 
    email, COUNT(email)
FROM
    contacts
GROUP BY email
HAVING COUNT(email) > 1;

返回空集,代表重复行已删除。

查询验证contacts表中的数据:

SELECT * 
FROM contacts

ID 为 4,7和9的行记录已被删除。

3. 直接表删除

以下是直接使用表删除重复行的步骤:

  • 创建一个新表,其结构与要删除重复行的原始表相同。
  • 将原始表中的不同行插入直接表。
  • 删除原始表并将直接表重命名为原始表。

步骤1 -

CRAETE TABLE source_copy FROM source;

步骤2 -

INSERT INTO source_copy
SELECT * FROM source
GROUP BY col;    --column that has duplicate value

步骤3 -

DROP TABLE source
ALTER TABLE source_copy RENAME TO source

例如,一下语句从 contacts 表中删除具有重复电子邮件(email)的行记录:

--step 1
CREATE TABLE contacts_temp
LIKE contacts;

--step 2
INSERT INTO contacts_temp(email) SELECT email FROM contacts GROUP BY email;

--step 3
DROP TABLE contacts;

ALTER TABLE contacts_temp
RENAME TO contacts;

 

© 著作权归作者所有

共有 人打赏支持
脱脂蛋丁
粉丝 0
博文 5
码字总数 2710
作品 0
武汉
MySQL Replace语句

在本教程中,您将学习如何使用 MySQL的语句来插入或更新数据库表中的数据。 MySQL REPLACE语句介绍 MySQL的REPLACE语句是一个MySQL扩展于SQL标准的语句。 MySQL REPLACE语句的工作原理如下:...

易百教程 ⋅ 2016/09/20 ⋅ 0

MySQL基础教程

这是一个基础的MySQL教程,通过教程的学习后可以到达一个初级到中级 MySQL应用水平级别 ,主要介绍一些MySQL中基本的SQL语句。如果这是您第一次使用关系数据库管理系统(之前没有学习SQL相关...

易百教程 ⋅ 2016/10/11 ⋅ 0

MySQL常见建表选项及约束

一、CREATE TABLE 选项 1、在定义列的时候,指定列选项 1)DEFAULT :定义列的默认值   当插入一个新行到表中并且没有给该列明确赋值时,如果定义了列的默认值,将自动得到默认值 ;如果没...

jjjyyy66 ⋅ 2017/05/15 ⋅ 0

Mysql中replace into用法详细说明

Replace into是Insert into的增强版。在向表中插入数据时,我们经常会遇到这样的情况:1、首先判断数据是否存在;2、如果不存在,则插入;3、如果存在,则更新。 在SQL Server中可以这样处理...

Junn ⋅ 2013/02/25 ⋅ 0

数据库索引类型和引擎

数据库索引类型和引擎 一、数据库索引 1、 索引的优缺点 优点:能够加快查询速度(相当于书的目录) 缺点:会降低插入、更新表的速度,需要占用磁盘存储空间 2、 索引的类型 INDEX:普通索引...

常楠 ⋅ 2014/05/11 ⋅ 0

MySQL索引的创建、删除和查看

1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成...

大苹果 ⋅ 2012/02/06 ⋅ 0

MySQL索引的创建、删除和查看

1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成...

boco ⋅ 2013/05/28 ⋅ 0

MySQL专题10之MySQL序列使用、MySQL处理重复数据、MySQL以及SQL的注入

1、MySQL序列使用 - MySQL序列是一组整数:1,2,3...,由于一张数据表只能有一个字段自增主键,如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。 - 使用AUTOINCREMENT:MySQL...

极客微信条 ⋅ 2017/11/21 ⋅ 0

MySQL DISTINCT语句去除重复记录数据

MySQL DISTINCT子句概述 当从表中查询数据时,可能会得到重复的行。为了消除这些重复的行,我们可在SELECT语句中使用子句。 DISTINCT子句的语法如下: SELECT DISTINCT FROM WHERE MySQL DIS...

易百教程 ⋅ 2016/09/08 ⋅ 0

MySQL如何建索引以及利用索引优化ORDER BY排序语句

MySQL索引的创建、删除和查看 1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使...

说谎的少年 ⋅ 2014/10/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

LVM

LVM: 硬盘划分分区成物理卷->物理卷组成卷组->卷组划分逻辑分区。 1.磁盘分区: fdisk /dev/sdb 划分几个主分区 输入t更改每个分区类型为8e(LVM) 使用partprobe生成分区的文件:如/dev/sd...

ZHENG-JY ⋅ 25分钟前 ⋅ 0

彻底删除Microsoft Office的方法

参照此链接彻底删除Office https://support.office.com/zh-cn/article/%e4%bb%8e-pc-%e5%8d%b8%e8%bd%bd-office-9dd49b83-264a-477a-8fcc-2fdf5dbf61d8?ui=zh-CN&rs=zh-CN&ad=CN......

Kampfer ⋅ 40分钟前 ⋅ 0

大盘与个股之间关系

大盘走多:积极出手 顺势加码 大盘走空: 少量出手 退场观望 大盘做头:逆势减码 少量操作 大盘做底 : 小量建仓 小量试单

guozenhua ⋅ 42分钟前 ⋅ 0

Day16 LVM(逻辑卷管理)与磁盘故障小案例

lvm详解 简述 LVM的产生是因为传统的分区一旦分区好后就无法在线扩充空间,也存在一些工具能实现在线扩充空间但是还是会面临数据损坏的风险;传统的分区当分区空间不足时,一般的解决办法是再...

杉下 ⋅ 48分钟前 ⋅ 0

rsync实现多台linux服务器的文件同步

一、首先安装rsync,怎样安装都行,rpm,yum,还是你用源码安装都可以。因为我用的是阿里云的ESC,yum install rsync就ok了。 二、配置rsync服务 1.先建立个同步数据的帐号 123 groupadd r...

在下头真的很硬 ⋅ 今天 ⋅ 0

前端基础(三):函数

字数:1685 阅读时间:5分钟 函数定义 在最新的ES规范中,声明函数有4中方法: -函数声明 -函数表达式 -构造函数Function -生成器函数 1.函数声明 语法: function name([param[, param2 [....

老司机带你撸代码 ⋅ 今天 ⋅ 0

Java虚拟机的Heap监狱

在Java虚拟机中,我是一个位高权重的大管家,他们都很怕我,尤其是那些Java 对象,我把他们圈到一个叫做Heap的“监狱”里,严格管理,生杀大权尽在掌握。 中国人把Stack翻译成“栈”,把Hea...

java高级架构牛人 ⋅ 今天 ⋅ 0

Spring MVC基本概念

只写Controller

颖伙虫 ⋅ 今天 ⋅ 0

微软重金收购GitHub的背后逻辑原来是这样的

全球最大的开发者社区GitHub网站花落谁家的问题已经敲定,微软最终以75亿美元迎娶了这位在外界看来无比“神秘”的小家碧玉。尽管此事已过去一些时日,但整个开发者世界,包括全球各地的开源社...

linux-tao ⋅ 今天 ⋅ 0

磁盘管理—逻辑卷lvm

4.10-4.12 lvm 操作流程: 磁盘分区-->创建物理卷-->划分为卷组-->划分成逻辑卷-->格式化、挂载-->扩容。 磁盘分区 注: 创建分区时需要更改其文件类型为lvm(代码8e) 分区 3 已设置为 Linu...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部