图解面试题:如何查找重复数据?
Last updated
Last updated
【题目】
编写一个 SQL 查询,查找学生表中所有重复的学生名。
【解题思路】
看到 “找重复” 的关键字眼,首先要用分组函数(group by),再用聚合函数中的计数函数 count()给姓名列计数。
分组汇总后,生成了一个如下的表。从这个表里选出计数大于 1 的姓名,就是重复的姓名。
【解题步骤】
方法一
1)创建一个辅助表,将姓名列进行行分组汇总
2)选出辅助表中计数大于 1 的姓名
3)结合前两步,将 “创建辅助表” 的步骤放入子查询
结果:
方法二
这时候有的同学可能会想,为什么要这么麻烦创建一个子查询,不能用这个语句(将 count 放到 where 字句中)直接得出答案吗?
如果我们运行下这个 sql 语句,会报下面的错误,问题出在哪里呢?
前面提到聚合函数(count),where 字句无法与聚合函数一起使用。因为 where 子句的运行顺序排在第二,运行到 where 时,表还没有被分组。(如果不清楚,可以系统看下我之前的课程《从零学会 SQL:汇总分析》)
如果要对分组查询的结果进行筛选,可以使用 having 子句。所以,这道题的最优方法如下:
【本题考点】
1)考察思路,有两种解题方法,但是使用 having 语句的方法更高效。
2)考察对 having 语句的掌握,很多人会把聚合函数写到 where 子句中。
3)熟记 SQL 子句的书写顺序和运行顺序。
【举一反三】
本题也可以拓展为:找出重复出现 n 次的数据。只需要改变 having 语句中的条件即可: