免费教程《图解 SQL 面试题》
  • 图解 SQL 面试题
  • 第 1 章:简单查询
  • 图解面试题:如何查找重复数据?
  • 第 2 章:复杂查询
    • 图解面试题:如何查找第 N 高的数据?
  • 第 3 章 多表查询?
    • 图解面试题:多表如何查询?
    • 图解面试题:如何查找不在表里的数据?
    • 图解面试题:你有多久没涨过工资了?
    • 图解面试题:如何比较日期数据?
    • 图解面试题:如何交换数据?
    • 滴滴 2020 年面试题:如何找出最小的 N 个数?
    • 图解面试题:行列互换问题,怎么办?
    • 图解面试题:找出连续出现 N 次的内容?
    • 链家面试题:如何分析留存率?
  • 第 4 章
    • 拼多多面试题:如何查找前 20% 的数据?
    • 图解面试题:如何查找工资前三高的员工
    • 图解面试题:如何分组比较?
    • 图解面试题:双 11 用户如何分析?
    • 图解面试题:如何分析游戏?
  • 第 5 章:项目实战
    • 图解面试题:滴滴 2020 求职真题
    • 滴滴面试题:打车业务问题如何分析?
    • 电商面试题:如何分析复杂业务?
    • 图解面试题:如何分析用户满意度?
    • 图解面试题:如何分析红包领取情况?
    • 图解面试题:如何分析中位数?
    • 小红书面试题:如何分析用户行为?
    • 教育行业案例:学员续费如何分析?
    • 字节跳动面试题:你的平均薪水是多少?
Powered by GitBook
On this page

Was this helpful?

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

Previous图解 SQL 面试题Next图解面试题:如何查找第 N 高的数据?

Last updated 4 years ago

Was this helpful?

【题目】

编写一个 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;

推荐:

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