ITPub博客

首页 > 数据库 > 数据库开发技术 > 图解面试题:如何查找重复数据?

图解面试题:如何查找重复数据?

原创 数据库开发技术 作者:猴子数据分析 时间:2019-10-24 21:00:00 0 删除 编辑


【题目】

编写一个SQL查询,查找学生表中所有重复的学生名。


【解题思路】

1.看到“找重复”的关键字眼,首先要用分组函数(group by),再用聚合函数中的计数函数count()给姓名列计数。


2. 分组汇总后,生成了一个如下的表。从这个表里选出计数大于1的姓名,就是重复的姓名。



【解题步骤】

  • 方法一


1)创建一个辅助表,将姓名列进行行分组汇总


select 姓名, count(姓名) as 计数from 学生表group by 姓名;



2)选出辅助表中计数大于1的姓名


select 姓名 from 辅助表where 计数 > 1;



3)结合前两步,将“创建辅助表”的步骤放入子查询


select 姓名 from( select 姓名, count(姓名) as 计数 from 学生表 group by 姓名) as 辅助表where 计数 > 1;



结果:


  • 方法二


这时候有的同学可能会想,为什么要这么麻烦创建一个子查询,不能用这个语句(将count放到where字句中)直接得出答案吗?


select 姓名from 学生表group by 姓名where count(姓名) > 1;



如果我们运行下这个sql语句,会报下面的错误,问题出在哪里呢?


前面提到聚合函数(count),where字句无法与聚合函数一起使用。因为where子句的运行顺序排在第二,运行到where时,表还没有被分组。(如果不清楚,可以系统看下我之前的课程《从零学会SQL:汇总分析》)



如果要对分组查询的结果进行筛选,可以使用having子句。所以,这道题的最优方法如下:


select 姓名from 学生表group by 姓名having count(姓名) > 1;


【本题考点】

1)考察思路,有两种解题方法,但是使用having语句的方法更高效。

2)考察对having语句的掌握,很多人会把聚合函数写到where子句中。

3)熟记SQL子句的书写顺序和运行顺序。


【举一反三】

本题也可以拓展为:找出重复出现n次的数据。只需要改变having语句中的条件即可:

select 列名from 表名group by 列名having count(列名) > n;


推荐:如何提升你的分析技能,实现升职加薪?


原文作者:猴子数据分析;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2017-01-16

  • 博文量
    865
  • 访问量
    345496