⼀次SQL如何查重及去重的实战记录⽬录
前⾔
1.distinct
4.删除重复数据
第⼀步:出重复的数据
第⼆步:删除重复的数据
总结
前⾔
在使⽤SQL提数的时候,常会遇到表内有重复值的时候,就需要做去重,本⽂归类了常⽤⽅法。
1.distinct
题⽬:现在运营需要查看⽤户来⾃于哪些学校,请从⽤户信息表中取出学校的去重数据
⽰例:user_profile
mysql>SELECT DISTINCT university FROM user_profile;
根据⽰例,查询返回以下结果
⼩贴⼠:
SQL中关键词distinct去重:
英语中distinct 代表独⼀⽆⼆的意思,
他在SQL表⽰去重的意思:⽐如本题中university这⼀列出现了两次北京⼤学,
使⽤distinct进⾏去重查询后,则北京⼤学只出现⼀次。
distinct 通常效率较低
distinct 使⽤中,放在 select 后边,对后⾯所有的字段的值统⼀进⾏去重
拓展:
题⽬:现在运营需要查看⽤户的总数
select count(distinct university) from user_profile;
举个栗⼦,现有这样⼀张表 task
备注:
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;
举个栗⼦,现有这样⼀张表 task
备注:
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号', ‘⼥' );
题⽬:数据库中存在重复记录,删除保留其中⼀条
我们发现除了⾃增长ID不同以为,有⼏条其他字段都重复的数据出现
第⼀步:出重复的数据
mysql>SELECT MAX(ID) ID,
Name,Age,Address,Sex
FROM Person
GROUP BY Name,Age,Address,Sex
HAVING COUNT(1)>1
⼩贴⼠:
HAVING将分组后统计出来的数量⼤于1的数据⾏,就是我们要的重复数据上⾯⽤Max函数或者Min函数均可,只是为了保证取出来的数据的唯⼀性。 第⼆步:删除重复的数据
其实我们数据库中最后要保留的结果就是第⼆步中查询出来的数据,
我们把其他的数据删除即可。
怎么删除呢?我们使⽤ID来排除。
DELETE FROM Person
WHERE EXISTS
(
SELECT * FROM (
SELECT
MAX(ID) ID,
Name,Age,Address,Sexmysql删除重复的数据保留一条
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查重去重内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论