码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 如何去除数据库中重复的数据


    去除数据库中重复的数据

    • 准备工作
    • 方法一:用distinct 联合去重
    • 方法二:使用窗口函数限制row_number()=1
    • 方法三:使用窗口函数删除row_number()>1
    • 方法四:group by去重

    准备工作

    原始表users:

    CREATE TABLE users (
        id INT PRIMARY KEY AUTO_INCREMENT,
        first_name VARCHAR(50) NOT NULL,
        last_name VARCHAR(50) NOT NULL,
        email VARCHAR(255) NOT NULL
    );
    
    INSERT INTO users (first_name,last_name,email) 
    VALUES ('Chuan ','Jiang','HiJiangChuan@gmail.com'),
           ('Chuan ','Jiang','HiJiangChuan@gmail.com'),
           ('Ch. ','Jiang','HiJiangChuan@gmail.com'),
           ('Ke','Xie','xieke@sina.com'),
           ('Ke','Xie','xieke@qq.com'),
           ('Amei','Song','amei@163.com');
           
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    默认id为自增主键;

    在这里插入图片描述

    方法一:用distinct 联合去重

    第一步:distinct后面加多个字段,即多个字段联合起来去重,就能只筛选出一条数据!

    select distinct first_name,last_name,email from users;
    
    • 1

    在这里插入图片描述

    第二步:新建一个表tmp,将以上数据导入即可;

    CREATE TABLE tmp (
        id INT PRIMARY KEY AUTO_INCREMENT,
        first_name VARCHAR(50) NOT NULL,
        last_name VARCHAR(50) NOT NULL,
        email VARCHAR(255) NOT NULL
    );
    
    INSERT INTO users_copy (first_name,last_name,email) 
    SELECT DISTINCT first_name,last_name,email FROM users;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    注意:此处使用insert into …select导入,但是指定了后三个字段,并不包括自增的主键;

    方法二:使用窗口函数限制row_number()=1

    思路:
    重复即first_name, last_name,email 三个字段都相等,则对这个三个字段开窗,也就是重复的数据会在一个窗口,
    使用row_number对重复的数据排序,最后用子查询限制row_number只为1,即对重复的数据之筛选出来一条;

    第一步:对重复数据开窗,使用row_number()函数

    select first_name,last_name,email, 
    row_number()over(partition by first_name,last_name,email) r from users;
    
    • 1
    • 2

    在这里插入图片描述

    第二步:限制row_number为1即可;

    SELECT first_name,last_name,email from
          (SELECT first_name,last_name,email, 
            row_number()over(partition by first_name,last_name,email) r from users)as q 
           where r=1;
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    方法三:使用窗口函数删除row_number()>1

    直接在原表上删除数据,条件是对字段联合开窗后,row_number>1 即重复的数据;

    DELETE FROM users
    WHERE id IN (
        SELECT id
        FROM (
            SELECT 
                id, ROW_NUMBER () Over (PARTITION BY first_name,last_name,email ORDER BY id) as r 
            from users
        ) q
        WHERE r > 1
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    结果:
    在这里插入图片描述

    方法四:group by去重

    即对重复的字段联合分组即可,自然就只过滤出一条数据了!
    然后将结果导入临时表;

    INSERT INTO tmp (first_name,last_name,email)  
    SELECT first_name,last_name,email from users group by first_name,last_name,email;
    
    • 1
    • 2
  • 相关阅读:
    C语言经典算法实例3:数组元素排序
    2154. 将找到的值乘以 2
    百万军中取上将首级如探囊取物, 千万行里改关键源码在弹指瞬间。 功能超强的程序编辑器!
    halcon之区域:多种区域(Region)特征(6)
    5.中间件
    【重温设计模式】中介者模式及其Java示例
    29 WEB漏洞-CSRF及SSRF漏洞案例讲解
    【PHP框架 | Laravel8 系列6】 - 控制器
    解决webpack打包、编译、热更新Node内存不足问题
    项目实训-vue(十二)
  • 原文地址:https://blog.csdn.net/Swofford/article/details/126602777
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号