一次SQL如何查重及去重的实战记录


Posted in MySQL onMarch 13, 2022

前言

在使用SQL提数的时候,常会遇到表内有重复值的时候,就需要做去重,本文归类了常用方法。

⛳️ 1.distinct

题目:现在运营需要查看用户来自于哪些学校,请从用户信息表中取出学校的去重数据

示例:user_profile

一次SQL如何查重及去重的实战记录

mysql>SELECT DISTINCT university FROM user_profile;
??根据示例,查询返回以下结果

一次SQL如何查重及去重的实战记录

??小贴士:

SQL中关键词distinct去重:
英语中distinct 代表独一无二的意思,
他在SQL表示去重的意思:比如本题中university这一列出现了两次北京大学,
使用distinct进行去重查询后,则北京大学只出现一次。
distinct 通常效率较低
distinct 使用中,放在 select 后边,对后面所有的字段的值统一进行去重

?? 拓展:

题目:现在运营需要查看用户的总数
select count(distinct university) from user_profile;

⛳️ 2.group by

?? 举个栗子,现有这样一张表 task

一次SQL如何查重及去重的实战记录

备注:
task_id: 任务id;
order_id: 订单id;
start_time: 开始时间
注意:一个任务对应多条订单

题目:列出任务总数

????根据示例,查询方法如下:

第1步:列出 task_id 的所有唯一值(去重后的记录,null也是值)

select task_id
from Task
group by task_id;

第二步: 任务总数

select count(task_id) task_num
from (select task_id
from Task
group by task_id) tmp;

⛳️ 3.row_number 窗口函数

?? 举个栗子,现有这样一张表 task

一次SQL如何查重及去重的实战记录

备注:
task_id: 任务id;
order_id: 订单id;
start_time: 开始时间
注意:一个任务对应多条订单

题目:查询整个表重复的数据

??根据示例,查询方法如下:

– 在支持窗口函数的 sql 中使用

select count(case when rn=1 then task_id else null end) task_num
from (select task_id
, row_number() over (partition by task_id order by start_time) rn
from Task) tmp;

??小贴士:

MySQL8.0 中可以利用 ROW_NUMBER(),DENSE_RANK(),RANK() 三个窗口函数来实现排序

需要注意的一点是 as 后的别名,千万不要与前面的函数名重名,否则会报错

下面给出这三种函数实现排名的案例:

–三条语句对于上面三种排名

select xuehao,score, ROW_NUMBER() OVER(order by score desc) as row_r from scores_tb;
select xuehao,score, DENSE_RANK() OVER(order by score desc) as dense_r from scores_tb;
select xuehao,score, RANK() over(order by score desc) as r from scores_tb;

– 一条语句也可以查询出不同排名

SELECT xuehao,score,
ROW_NUMBER() OVER w AS ‘row_r',
DENSE_RANK() OVER w AS ‘dense_r',
RANK() OVER w AS ‘r'
FROM scores_tb
WINDOW w AS (ORDER BY score desc);

⛳️ 4.删除重复数据

创建测试数据

我们创建一个人员信息表并在里面插入一些重复的数据

CREATE TABLE Person(
id int auto_increment primary key comment ‘主键',
Name VARCHAR(20) NULL,
Age INT NULL,
Address VARCHAR(20) NULL,
Sex CHAR(2) NULL
);
INSERT INTO Person(ID,Name,Age,Address,Sex)
VALUES
( 1, ‘张三', 18, ‘北京路18号', ‘男' ),
( 2, ‘李四', 19, ‘北京路29号', ‘男' ),
( 3, ‘王五', 19, ‘南京路11号', ‘女' ),
( 4, ‘张三', 18, ‘北京路18号', ‘男' ),
( 5, ‘李四', 19, ‘北京路29号', ‘男' ),
( 6, ‘张三', 18, ‘北京路18号', ‘男' ),
( 7, ‘王五', 19, ‘南京路11号', ‘女' ),
( 8, ‘马六', 18, ‘南京路19号', ‘女' );

一次SQL如何查重及去重的实战记录

题目:数据库中存在重复记录,删除保留其中一条

我们发现除了自增长ID不同以为,有几条其他字段都重复的数据出现

? 第一步:找出重复的数据

mysql>SELECT MAX(ID) ID,
Name,Age,Address,Sex
FROM Person
GROUP BY Name,Age,Address,Sex
HAVING COUNT(1)>1

一次SQL如何查重及去重的实战记录

??小贴士:

HAVING将分组后统计出来的数量大于1的数据行,就是我们要找的重复数据

上面用Max函数或者Min函数均可,只是为了保证取出来的数据的唯一性。

? 第二步:删除重复的数据

其实我们数据库中最后要保留的结果就是第二步中查询出来的数据,

我们把其他的数据删除即可。

怎么删除呢?我们使用ID来排除。

DELETE FROM Person
WHERE EXISTS
(
SELECT * FROM (
SELECT
MAX(ID) ID,
Name,Age,Address,Sex
FROM Person
GROUP BY Name,Age,Address,Sex
HAVING COUNT(1)>1) T
WHERE Person.Name=T.Name
AND Person.Age=T.Age
AND Person.Address=T.Address
AND Person.Sex=T.Sex
AND Person.ID<T.ID
)

执行完后重新查询Person表结果如下

马六因为只有一条记录,所以没有参与去重,直接显示。

一次SQL如何查重及去重的实战记录

总结

到此这篇关于SQL如何查重及去重的文章就介绍到这了,更多相关SQL查重去重内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL之DML语言
Apr 05 MySQL
MySQL sql_mode修改不生效的原因及解决
May 07 MySQL
MySQL 数据丢失排查案例
May 08 MySQL
MySQL中distinct与group by之间的性能进行比较
May 26 MySQL
MySQL数据库10秒内插入百万条数据的实现
Nov 01 MySQL
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
Jan 22 MySQL
Mysql忘记密码解决方法
Feb 12 MySQL
MySQL如何快速创建800w条测试数据表
Mar 17 MySQL
Mysql调整优化之四种分区方式以及组合分区
Apr 13 MySQL
MySql数据库 查询时间序列间隔
May 11 MySQL
详解Mysql数据库平滑扩容解决高并发和大数据量问题
May 25 MySQL
MySQL数据库配置信息查看与修改方法详解
Jun 25 MySQL
面试提问mysql一张表到底能存多少数据
MySQL的索引你了解吗
面试中老生常谈的MySQL问答集锦夯实基础
浅谈如何保证Mysql主从一致
MySQL数据库如何给表设置约束详解
Mar 13 #MySQL
Mysql外键约束的创建与删除的使用
Mar 03 #MySQL
解决MySQL添加新用户-ERROR 1045 (28000)的问题
Mar 03 #MySQL
You might like
DC四月将推出百页特刊漫画 纪念小丑诞生80周年
2020/04/09 欧美动漫
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
Thinkphp单字母函数使用指南
2016/05/08 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
PHP 对象接口简单实现方法示例
2020/04/13 PHP
在一个form用一个SUBMIT(或button)分别提交到两个处理表单页面的代码
2007/02/15 Javascript
重载toString实现JS HashMap分析
2011/03/13 Javascript
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
关于js数组去重的问题小结
2014/01/24 Javascript
js选项卡的实现方法
2015/02/09 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
Node.js+jade抓取博客所有文章生成静态html文件的实例
2017/09/19 Javascript
移动端效果之Swiper详解
2017/10/09 Javascript
vue-router传递参数的几种方式实例详解
2018/11/13 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
JavaScript实现模态对话框实例
2020/01/13 Javascript
Windows下使Python2.x版本的解释器与3.x共存的方法
2015/10/25 Python
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
python3写的简单本地文件上传服务器实例
2018/06/04 Python
python图像和办公文档处理总结
2019/05/28 Python
python encrypt 实现AES加密的实例详解
2020/02/20 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
2020/02/26 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
详解CSS3 用border写 空心三角箭头 (两种写法)
2017/09/29 HTML / CSS
华为俄罗斯官方网上商城:购买Huawei手机和平板
2017/04/21 全球购物
美国家居装饰店:Pier 1
2019/09/04 全球购物
万户网络JAVA程序员岗位招聘笔试试卷
2013/01/08 面试题
新学期家长寄语
2014/01/19 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
护士医德医风心得体会
2016/01/25 职场文书
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
2022/04/07 Servers
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技