去重是指:查询的时候, 不显示重复,并不是删除表中的重复项
数据表:
方法1:distinct去重
作用:只能一列去重,当distinct后跟大于1个参数时,他们之间的关系是&&(逻辑与)关系,只有全部条件相同才会去重
弊端:当查询的字段比较多时,distinct会作用多个字段,导致去重条件增多
代码:
select distinct UserResult from Table1
方法2:group by去重
作用:将重复的行进行分组,相同的数据只显示第一行
弊端:使用group by后,所有查询字段都需要使用聚合函数,比较繁琐
注意点:这样去除之后的数据是保留的第一条重复的数据,如果想保留最后一条数据,将min()改成max(),此为,如果存在null的情况,如果获取最后一条数据中有空字段时,如果想拿空值,数据库会自动拿上一个值填充空值
代码:
select min(UserName)UserName,min(UserSex)UserSex,min(UserSubject)UserSubject,min(UserResult)UserResult from Table1
group by UserResult
方法3:使用函数:row_number() over (parttion by 分组列 order by 排序列)
作用:先根据重复列进行分组,分组后再进行排序,不同的组序号为1,相同的组序号为2,排除为2的就达到了去重效果
缺点:需要8.0以上的数据库才能支持写法
代码:
select *from
(
--查询出重复行
select *,row_number() over (partition by UserResult order by UserResult desc)num from Table1
)A
where A.num=1
方法4:方法3的进阶
代码:一张表a,开始时间是b,用户姓名c
select a.* from a join(select c, max(b) as max b from a group by c ) b
on a.c = b.c and
a.b = b.max b
原理:先根据要去重的字段姓名,和唯一字段时间,拿到最后一个值,然后根据这个值,作为链接查询的关系,自连,从而完成拿到最后一条数据
5.删除重复数据,只保留一条数据的写法:
Oracle数据库的写法:
DELETE
FROM
dept
WHERE
dname IN ( SELECT dname FROM dept GROUP BY dname HAVING count( dname ) > 1 ) -- 过滤出重复的dname
AND deptno NOT IN ( SELECT min( deptno ) AS deptno FROM dept GROUP BY dname HAVING count( dname ) > 1 ) --
过滤出不在需要保留的id之外的所有id
MySQL数据库:
DELETE
FROM
dept
WHERE
dname IN ( SELECT * FROM ( SELECT dname FROM dept GROUP BY dname HAVING count( dname ) > 1 ) a )
AND deptno NOT IN ( SELECT * FROM ( SELECT min( deptno ) AS deptno FROM dept GROUP BY dname HAVING count( dname ) > 1 ) b )