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

073a66233714935e4636422d1b439210.jpeg

【题目】

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

f5fb6c68101f1a1076409aaa4f88574d.jpeg

【解题思路】

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

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

2286c99e29c757bbed70ca63ff1e6b49.jpeg

【解题步骤】

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

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

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

select 姓名 from 辅助表
where 计数 > 1;
4901490c1694ea70e4b6f651558a0649.jpeg

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

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

结果:

a1f23f66d1490ce32f8522fd8c4d1bfd.jpeg

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

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


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

e3d4fe33c2ab30d98240f2af5907413f.jpeg

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

8cc396e2e9dd54a3b01f19cf0bd8f925.jpeg

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

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

【本题考点】

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

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

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

【举一反三】

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

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


我是猴子,中科院硕士/前IBM高级软件工程师/豆瓣8分《数据分析思维》作者
,我在知乎知学堂上线了一个数据分析课程,结合IBM项目经验和国内互联网大厂一线业务案例,讲解常用模型+逻辑框架,还有常用数据分析工具带练+业务实操带练,数据分析技能和思维两条腿走路,让你成为真正的数据分析师,而不是数据处理工具人。

无论你是想学习个辅助工作的技能,还是想转行数据分析,都可以点击文末阅读原文链接学习:

一张图看懂sql运行顺序

领导让我预测下一年销量,怎么办?

一张图看懂数据分析、机器学习、深度学习、人工智能的关系

带你了解数据分析的日常工作

 ⬇️点击「阅读原文」

 进入 数据分析训练营

相关推荐

  1. 【Flutter 面试如何图片重复堆叠容器?

    2023-12-30 07:22:03       29 阅读
  2. 面试-MySQL如何定位慢查询

    2023-12-30 07:22:03       57 阅读
  3. SQL经典面试

    2023-12-30 07:22:03       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-30 07:22:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-30 07:22:03       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-30 07:22:03       87 阅读
  4. Python语言-面向对象

    2023-12-30 07:22:03       96 阅读

热门阅读

  1. Vuex介绍2

    2023-12-30 07:22:03       61 阅读
  2. 用轻量级ORM--Dapper调用MySQL存储过程

    2023-12-30 07:22:03       74 阅读
  3. Python requests get和post方法发送HTTP请求

    2023-12-30 07:22:03       65 阅读
  4. 建造型设计模式-建造者模式

    2023-12-30 07:22:03       65 阅读
  5. 八股文打卡day14——计算机网络(14)

    2023-12-30 07:22:03       65 阅读
  6. 【DPDK 】dpdk测试发udp包

    2023-12-30 07:22:03       65 阅读
  7. API 安全设计的建议

    2023-12-30 07:22:03       51 阅读
  8. Web常用的编码和解码技术

    2023-12-30 07:22:03       67 阅读
  9. 箭头函数的this指向问题

    2023-12-30 07:22:03       84 阅读
  10. Flutter 三点一: Dart 异步 Future

    2023-12-30 07:22:03       61 阅读
  11. 使用Windi CSS(基于vue-cli)

    2023-12-30 07:22:03       66 阅读