SQL统计重复数据怎么查_分组计数实战案例【技巧】

admin 百科 27
用GROUP BY + HAVING查重复值最直接,如SELECT email, COUNT(*) AS cnt FROM users GROUP BY email HAVING cnt > 1;需用子查询或JOIN获取完整重复记录;多字段重复时GROUP BY和匹配条件须一致;可用GROUP_CONCAT等函数合并ID便于处理。

SQL统计重复数据怎么查_分组计数实战案例【技巧】-第1张图片-佛山资讯网

查重复值:用GROUP BY + HAVING是最直接的方式

要找出哪些数据重复了,核心是先按目标字段分组,再统计每组出现几次。关键点在于:HAVING必须跟在GROUP BY后面,用来过滤分组后的结果;WHERE不能用聚合函数,否则会报错

比如查用户表中重复的邮箱:

  • SELECT email, COUNT(*) AS cnt FROM users GROUP BY email HAVING cnt > 1;

这会返回所有出现2次及以上的邮箱,以及对应次数。如果只关心“有哪些邮箱重复”,去掉COUNT(*)也行;如果还要看具体是哪几条记录,就得往下走。

查重复的完整记录:用子查询或JOIN关联原表

上面语句只给出重复值和次数,但业务常需要看到全部重复行(比如确认内容是否真一样、要不要删)。这时得把重复值“拿回去”匹配原表:

  • 子查询写法(兼容性好):
    SELECT * FROM users WHERE email IN (SELECT email FROM users GROUP BY email HAVING COUNT(*) > 1);
  • INNER JOIN写法(性能通常更好,尤其数据量大时):
    SELECT u.* FROM users u INNER JOIN (SELECT email FROM users GROUP BY email HAVING COUNT(*) > 1) dup ON u.email = dup.email;

注意:如果重复依据是多个字段(如name + phone),GROUP BY和IN子句都要写成GROUP BY name, phone,且子查询返回的必须是元组形式(部分数据库支持(name, phone)写法,MySQL 8.0+、PostgreSQL支持,老版本可用CONCAT拼接作临时键)。

标签: mysql oracle ai 邮箱 聚合函数

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~

趣科技 机圈观察员 茄考网 茄录网 海印网 雷鹃网 鹃朝网 互联网观察员 评测官
趣科技 机圈观察员 茄考网 茄录网 海印网 雷鹃网 鹃朝网 互联网观察员 评测官