数据库查询结果去重

数据库查询结果去重

介绍MySQL中的去重操作方法,并举例说明。

1.1 使用distinct去重

distinct用来查询不重复记录的条数,用count(distinct id)来返回不重复字段的条数。

  • distinct【重复的字段名】,必须放在要去重的重复字段名的开头,即放在第一个参数;
  • 只能在查询语句中使用;
  • distinct表示对查询字段取不重复的记录,即查出的每行记录都是唯一的;
  • 不能与all同时使用,默认情况下,查询时返回的就是所有的结果。

distinct使用:

  • 单列数据
    SELECT DISTINCT id from A//对A表中的id去重
    
  • 多列数据
    SELECT DISTINCT id,name FROM A//对A表中的id和name去重
    
  • 结合count
    SELECT count(DISTINCT name) from A//对A表中不同的名字计数
    

1.2 使用group by去重

group by通常根据一个或多个列对结果集进行分组。

  • GROUP BY 【重复的字段名】
  • 在分组的列上通常与count、sum、Avg等聚合函数一起使用

1.3 例题解析

题目(Leetcode原题)

Views表:
在这里插入图片描述
此表可能会存在重复行(即该表没有主键)此表中的每一行都表示某人在某天浏览了某位作者的某篇文章。请注意,同一人的author_id和viewer_id是相同的。
请查询出所有浏览过自己文章的作者,结果按照id升序排列。
输入的Views表为:
在这里插入图片描述

解题思路
  • 判断何种情况为浏览过自己文章的作者:当author_id=viewer_id时
  • 查询结果后作者的id有重复,需要进行去重操作
    • distinct

      Select DISTINCT(author_id) as id
      FROM Views
      WHERE author_id=viewer_id
      ORDER BY author_id ASC
      执行时间:90ms
      
    • group by

      Select author_id as id
      FROM Views
      WHERE author_id=viewer_id
      GROUP BY author_id
      ORDER BY author_id ASC
      执行时间:206ms
      

    注意:针对distinct和group by关于去重性能的比较:当重复量较多时,group by的处理效率相对更高一点;当重复量低时,distinct的处理效率更快一点。SQL去重用distinct还是group by

  • 按照id进行升序排列: order by 字段名 asc(升序/desc降序)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值