文档章节

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

脱脂蛋丁
 脱脂蛋丁
发布于 2017/09/08 10:47
字数 540
阅读 2
收藏 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
12
0
MySQL基础教程

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

易百教程
2016/10/11
37
0
MySQL常见建表选项及约束

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

jjjyyy66
2017/05/15
0
0
数据库索引类型和引擎

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

常楠
2014/05/11
0
0
Mysql中replace into用法详细说明

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

Junn
2013/02/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开发者和架构师之间最大的区别是什么?

1、开发者和架构师之间最大的区别是什么? 架构师和开发者一样,也经常写代码,简单的说,开发者和架构师之间最大的区别就是技术领导力。 软件架构师的角色需要理解最重要的架构驱动力是什么...

James-
12分钟前
0
0
java框架学习日志-4

补充一些spring配置文件的方法。 设置别名: <!--通过name直接设置别名--> <bean name="user2" class="cn.sxt.factory.UserDynamicFactory"> </bean> <!--有id的情况下也可以设置......

白话
14分钟前
0
0
20181213 上课截图

小丑鱼00
30分钟前
1
0
nginx+php-fpm配置后页面显示空白的解决方法以及用nginx和php-fpm解决“502 Bad Gateway”问题

https://stackoverflow.com/questions/15423500/nginx-showing-blank-php-pages For reference, I am attaching my location block for catching files with the .php extension: location ~......

Yao--靠自己
38分钟前
2
0
mac 没声音

somehow不时就会出现这种情况。之前都得重启。 其实可以直接在terminal里打以下命令: sudo kextunload /System/Library/Extensions/AppleHDA.kext sudo kextload /System/Library/Extension...

dubox
53分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部