最近面试有家公司问了个mysql的数据去重,自己对于mysql一般多用于增删改查,所以私下来尝试了mysql数据的去重总结

DISTINCT

在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段。如下:
表student

SELECT DISTINCT s_name FROM student;

SELECT COUNT(DISTINCT s_name) AS scounts FROM student;

GROUP BY

group by 字句把一个表按照某一指定列或者一些列上的值相等的原则分组。然后再对每组数据进行规定的操作

SELECT * FROM student GROUP BY s_name;

如果出现this is incompatible with sql_mode=only_full_group_by
一、原理层面
这个错误发生在mysql 5.7 版本及以上版本会出现的问题:
mysql 5.7版本默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了"SQL92标准"。
很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。

二、sql层面
在sql执行时,出现该原因:
简单来说就是:输出的结果是叫target list,就是select后面跟着的字段,还有一个地方group by column,就是
group by后面跟着的字段。由于开启了ONLY_FULL_GROUP_BY的设置,所以如果一个字段没有在target list
和group by字段中同时出现,或者是聚合函数的值的话,那么这条sql查询是被mysql认为非法的,会报错误。

解决方案:
先查看sql_mode
select @@GLOBAL.sql_mode;

执行:
set@@GLOBAL.sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

或修改mysql的配置文件
windows中为my.ini
linux为my.cnf
具体操作请自行搜索

删除重复数据保留其中一条

我们首先执行
DELETE FROM student WHERE s_name IN (SELECT s_name FROM student GROUP BY s_name HAVING COUNT() >1) AND s_name NOT IN (SELECT MIN(s_id) FROM student GROUP BY s_name HAVING COUNT() >1);

发现出现了错误:

原因是:更新这个表的同时又查询了这个表,查询这个表的同时又去更新了这个表,可以理解为死锁。mysql不支持这种更新查询同一张表的操作

解决办法:把要更新的几列数据查询出来做为一个第三方表,然后筛选更新。

DELETE FROM student WHERE s_id NOT IN (SELECT dt.mins_id FROM (SELECT MIN(s_id) AS mins_id FROM student GROUP BY s_name) dt);

已经将重复的完成了删除

mysql中对数据的去重相关推荐

  1. android json mysql_Android通过json向MySQL中读写数据的方法详解【写入篇】

    本文实例讲述了Android通过json向MySQL中写入数据的方法.,具体如下: 先说一下如何通过json将Android程序中的数据上传到MySQL中: 首先定义一个类JSONParser.Jav ...

  2. 利用Ajax实现数据的同步传输,从mysql中提取数据,通过echarts可视化

    如何将mysql数据库中的方式通过echarts可视化呢,以下面这个简单的例子向大家进行演示:   步骤一:mysql的创表和插入数据,当然这些数据也可以是你通过爬虫抓取的.     步骤二:   创 ...

  3. python向数据库写入数据_如何用Python向Mysql中插入数据

    我们使用Python经常会和Postgresql进行搭配,很少将python和mysql进行搭配.下面小编给大家分享如何用Python向Mysql中插入数据. 工具/原料 Pycharm 方法/步骤 ...

  4. android json mysql_Android通过json向MySQL中读写数据的方法详解【读取篇】

    本文实例讲述了Android通过json向MySQL中读取数据的方法.分享给大家供大家参考,具体如下: 首先 要定义几个解析json的方法parseJsonMulti,代码如下: private vo ...

  5. PHP如何批量更新MYSQL中的数据

    最近项目需要用到批量更新数据库里的数据,在网上找了一下这方面的例子,觉得这个还不错,分享给大家. 在这个业务里里面涉及到了更新两张数据表,那么大家是不是会想到非常简单,马上上代码 $sql = &qu ...

  6. 使用logstash将Mysql中的数据导入到ElasticSearch中(详细步骤,win_Elasticsearch)

    在之前转载的一腾讯高级工程师<一文彻底了解Logstash>对logstach有这详细的介绍,这里我只说明一下,将mysql中的数据使用logstash导入到es中,如何操作,具体步骤见下 ...

  7. python 数据导入mysql_用python批量向数据库(MySQL)中导入数据

    用python批量向数据库(MySQL)中导入数据 现有数十万条数据,如下的经过打乱处理过的数据进行导入 数据库内部的表格的数据格式如下与下面的表格结构相同Current database: pyth ...

  8. mysql中的dump,从mysql中dump数据到本地

    方法一:使用mysqldump命令,如: mysqldump -h10.90.6.237 -uf_insplat2car_r -P3306 -pxxxxxxxxx nbmp tb_tag_log -- ...

  9. MySQL_(Java)分页查询MySQL中的数据

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL_(Java)使用preparestatement ...

最新文章

  1. forkjoin rxjs_如何通过吃披萨来理解RxJS运算符:zip,forkJoin和Combine
  2. 8500WN流畅高速上网高端卡 12核心不锁倍频
  3. 解析jsonarra_使用JSONReader或JSONObject / JSONArray解析JSON数据
  4. Git命令,合并分支到master,并提交远程仓库,将本地分支推送到远程仓库
  5. Celex Update CodeForces - 1358C(打表找规律)
  6. 安卓设置Activity切换动画无效的问题
  7. 文件下载时,文件名乱码问题
  8. oracle schema_了解Oracle备份恢复的知识
  9. MapXtreme 使用技巧10例
  10. c语言调整图片分辨率,如何不改变图片分辨率,并且缩小图片质量-电脑自学网...
  11. 变量可以存储在堆中,栈中,方法区中。哪里都可以啊。对象只能存储在堆中...
  12. javascrip执行字符串里面的函数
  13. Prometheus 监控linux服务器
  14. 网上图书商城Web页面
  15. 产品认证之IP防护等级
  16. 每日作业-品优购详情页
  17. 如何将PDF转化成Word格式
  18. 苹果的胜利:Adobe宣布Flash Media服务支持iOS设备运行Flash
  19. androbench测存储速率
  20. 单片机开发,口袋秤单片机芯片的开发流程

热门文章

  1. python dataframe是什么_什么是Pandas的DataFrame?
  2. 打开ps提示计算机中丢失,ps打开出现dll文件丢失怎么解决
  3. nnunet入门之一 (CT图像分割)
  4. Android studio修改标题菜单栏增加功能图标(navigation bar toolbar)
  5. php dsa 签名,openssl使用DSA算法生成签名实例详解_PHP教程
  6. 多线程高并发,spring整合kafka消费
  7. Md5工具包加密之MD5Util
  8. Vscode好用的快捷键:批量文字修改快捷键选中相同内容快捷键
  9. 張潮《幽夢影》:「讀史宜夏」
  10. Python——from collections import namedtuple