经常要对数据库中的数据进行去重,有时还需要使用外部表填冲数据,本文档记录数据去重与外表填充数据。

date:2016/8/17

author:wangxl

1 需求

对user_info1表去重,并添加age项。

2 表数据

user_info1:

+----+----------+------+------+

| id | name | sex | age |

+----+----------+------+------+

| 1 | xiaolong | 1 | NULL |

| 2 | xiaoyun | 1 | NULL |

| 3 | xiaoqin | 2 | NULL |

| 4 | xiaolong | 1 | NULL |

| 5 | xiaodong | 1 | NULL |

| 6 | xiaokai | 1 | NULL |

| 7 | xiaohong | 2 | NULL |

| 8 | xiaolong | 1 | NULL |

| 9 | xiaohong | 2 | NULL |

| 10 | xiaofen | 2 | NULL |

+----+----------+------+------+

user_info2:

+----------+------+

| name | age |

+----------+------+

| xiaolong | 26 |

| xiaoyun | 28 |

| xiaoqin | 27 |

| xiaodong | 27 |

| xiaokai | 27 |

| xiaohong | 24 |

| xiaofen | 22 |

+----------+------+

3 实战

3.1 去重

(1) 找出有重复字段

select * from user_info1 where name in (select name from user_info1 group by name having count(name) > 1);

(2) 找出要删除的记录,重复记录是根据单个字段(name)来判断,只留有id最小的记录

select * from user_info1 where name in (select name from user_info1 group by name having count(name) > 1) and id not in (select min(id) from user_info1 group by name having count(name) > 1);

(3) 删除表中多余的重复记录

delete from user_info1 where name in (select name from user_info1 group by name having count(name) > 1) and id not in (select min(id) from user_info1 group by name having count(name) > 1);

报错:ERROR 1093 (HY000): You can't specify target table 'user_info1' for update in FROM clause

更换思路:找出每组中非最小id并删除,如下:

(4) 找出每组最小id

select min(id) from user_info1 group by name

(5) 找出每组非最小id

select * from user_info1 where id not in (select min(id) from user_info1 group by name);

(6) 删除每组中非最小id所在行

delete from user_info1 where id not in (select id from select min(id) from user_info1 group by name);

ERROR 1093 (HY000): You can't specify target table 'user_info1' for update in FROM clause

更正:

delete from user_info1 where id not in (select minid from (select min(id) as minid from user_info1 group by name) a);、

结果展示:

+----+----------+------+------+

| id | name | sex | age |

+----+----------+------+------+

| 1 | xiaolong | 1 | NULL |

| 2 | xiaoyun | 1 | NULL |

| 3 | xiaoqin | 2 | NULL |

| 5 | xiaodong | 1 | NULL |

| 6 | xiaokai | 1 | NULL |

| 7 | xiaohong | 2 | NULL |

| 10 | xiaofen | 2 | NULL |

+----+----------+------+------+

对于没有primary key的话,怎么去重呢?

(7) 创建表test

(8) insert into test select distinct(name),sex,age from user_info1 group by name;

暂时没想出一句话解决方案.

3.2 外表插入

update user_info1 t set age=(select age from user_info2 where name=t.name);

结果如下:

+----+----------+------+------+

| id | name | sex | age |

+----+----------+------+------+

| 1 | xiaolong | 1 | 26 |

| 2 | xiaoyun | 1 | 28 |

| 3 | xiaoqin | 2 | 27 |

| 5 | xiaodong | 1 | 27 |

| 6 | xiaokai | 1 | 27 |

| 7 | xiaohong | 2 | 24 |

| 10 | xiaofen | 2 | 22 |

+----+----------+------+------+

mysql怎么创建外表_MYSQL数据去重与外表填充相关推荐

  1. c mysql如何获取照片_MYSQL数据库存取图片等文件(C语言)

    直接把文件放入数据库中比较适合小文件,方便管理,比如头像图片和声音,如果是较大型的文件建议不要直接存进数据库,而是放在服务器,把文件索引放在数据库. MYSQL 中有个数据对象是 BLOB,即 Bin ...

  2. mysql批量创建数据库 导数据

    由于近来需要从其它机器拉一堆数据到一台机器上做数据分析,由于涉及到数据库比较,数据也不大不小的,要手工一个一倒腾真是累的半死,于是弄了个脚本 实现功能,根据指定文件下的数据库文件命令格式, str=1 ...

  3. mysql 无法创建视图_mysql无法创建视图怎么办

    mysql无法创建视图的解决办法: 基本语法 可以使用 CREATE VIEW 语句来创建视图. 语法格式如下: CREATE VIEW AS 语法说明如下. :指定视图的名称.该名称在数据库中必须是 ...

  4. MySQL:创建数据库,数据表,主键和外键

    目录 前言: 安装MySQL: 打开MySQL: 创建数据库: 查看已建数据库: 查看数据库引擎: 创建数据表: 主键约束: 单字段主键: 多字段联合主键: 外键约束: 前言: MySQL数据库安装了 ...

  5. mysql怎样创建索引_mysql如何创建索引?

    mysql创建索引的方法:1.使用CREATE TABLE语句配合INDEX或UNIQUE关键字在创建表的时候直接创建索引:2.使用ALTER TABLE语句来直接创建索引:3.使用CREATE IN ...

  6. mysql数据去重_mysql 数据去重

    数据库版本mysql5.5.10  操作工具navicate for mysql 插入数据重复了   用mysql语句去重 --  查询数量是否大于1 大于1  表示有重复数据 SELECT  cou ...

  7. mysql去重查询数量_mysql 数据去重

    数据库版本mysql5.5.10  操作工具navicate for mysql 插入数据重复了   用mysql语句去重 --  查询数量是否大于1 大于1  表示有重复数据 SELECT  cou ...

  8. mysql count if 去重_MYSQL数据去重

    我们用的数据库是mysql,偶尔会因为程序处理上的方便或者sql未优化而增加了一些重复数据,最后需要对这些重复的数据进行删除 对于数据量不大的时候我一般用not in的方式来处理,或者删全表,导出不重 ...

  9. mysql快捷创建数据库_mysql数据库快速入门(1)

    1.数据库操作 1.1.连接mysql服务器 mysql -u root( 用户名 ) -p 1.2.退出mysql命令提示窗 exit 1.3.查看版本 SELECT VERSION(); 1.4. ...

  10. mysql数据驱动的作用_MySQL数据优化

    很多企业,可能每天应对的数据量达百万,千万,甚至上亿的访问量,这样的量已经超过普通配置的mysql所承受的量,所以为了应对日益增长的访问量,我们需要对mysql做出相应的对策,进一步优化mysql以达 ...

最新文章

  1. 伊利诺伊大学厄巴纳-香槟分校
  2. 5年後、10年後の自分のイメージ
  3. 将格式化的日期字符串转换为Unix时间戳(php)
  4. 如何解决failed to push some refs to git
  5. .bash_profile和.bashrc的区别(如何设置生效)
  6. PHP获取用户地址方法
  7. java 去掉 t_关于Java:在LocalDateTime中不能删除“ T”
  8. mac地址漂移flapping的前因后果
  9. lua 和 c交互详解(一)
  10. mybatis 自动生成integer_通过mybatis-generator-core工具自动关联表生成对应model、mappers及dao层代码类完整教程...
  11. UIView方法,属性的集合
  12. 描述个人品质常用英语单词一览 常用赞誉之辞语
  13. Python IDE: 10个最好用的python集成开发环境(IDE)
  14. 移动脱机 Outlook 数据文件 (.ost)
  15. ansys中模态扩展是什么意思_ansys模态分析步骤
  16. springboot+爱心捐赠小程序 毕业设计-附源码211711
  17. mysql实现跨服务器查询数据
  18. 群晖Docker百度网盘套件一直灰界面
  19. mysql8远程连接报错_远程连接MYSQL8.0服务器问题
  20. Android Automotive车载嵌入式系统

热门文章

  1. jQuery练习t188,从0到1
  2. 史上最全金融产品架构分析一:银行理财产品
  3. 有文化的人吟了一句诗
  4. onenote同步问题
  5. html表格圣杯布局页面,Css圣杯布局
  6. 用Watir测试QTP的Demo程序Mercury Tours
  7. 扫雷小游戏 纯C语言/C++开发分享成果和记录
  8. 区块链Baas平台纳管实战
  9. Operator学习笔记
  10. 微云直链解析php,用微云做直链