如何在 SQL 中查找重复值? GROUP BY 和 HAVING 查询示例教程
如果您想知道如何在表中查找重复值,那么您可以在 SQL 中使用 GROUP BY 和 HAVING 子句。 使用 group by 您可以创建组,如果您的组有超过 1 个元素,则意味着它是重复的。 例如,您需要编写一个 SQL 查询来查找名为 Person 的表中的所有重复电子邮件。 这是一个流行的 SQL Query 面试问题以及 Leetcode 问题。 您可以看到电子邮件 a@b.com 是重复的电子邮件,因为它在表格中出现了两次。 您需要编写一个查询来查找所有重复值。
测试数据:
+----+---------+
| Id | Email |
+----+---------+
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
+----+---------+
例如,您的查询应返回上表的以下内容:
+---------+
| Email |
+---------+
| a@b.com |
+---------+
用于查找列中重复值的 SQL 查询
在 SQL 查询中解决这个问题的三种方法,第一种是使用 group by 子句,第二种是使用 self-join,第三种是使用带有 exists 子句的子查询。
使用 GROUP BY 查找重复元素
这个问题最简单的解决方案是使用 GROUP BY 和 HAVING 子句。 使用 GROUP BY 将结果集分组到电子邮件中,这会将所有重复的电子邮件放在一个组中,现在如果特定电子邮件的计数大于 1,则表示它是重复的电子邮件。 这是查找重复电子邮件的 SQL 查询:
SELECT Email FROM Person
GROUP BY Email
HAVING COUNT(Email) > 1
使用self-join在列中查找重复值
还有几种方法可以解决这个问题,一种是使用 Self Join。 如果您还记得,在自联接中,我们连接同一张表的两个实例以比较一条记录与另一条记录。 现在,如果来自表的第一个实例中一条记录的电子邮件与第二个表中另一条记录的电子邮件相同,则表示该电子邮件是重复的。 这是使用自连接的 SQL 查询:
SELECT DISTINCT a.Email FROM Person a
JOIN Person b ON a.Email = b. Email
WHERE a.Id != b.Id
使用带有 EXISTS 的子查询查找重复的电子邮件:
您甚至可以使用相关子查询来解决这个问题。 在相关子查询中,对外部查询中的每条记录执行内部查询。 因此,使用 SQL 中的相关子查询和 EXISTS 子句将一封电子邮件与同一表中的其余电子邮件进行比较,如下所示:
SELECT DISTINCT p1.Email
FROM Person p1
WHERE EXISTS(
SELECT *
FROM Person p2
WHERE p2.Email = p1.Email
AND p2.Id != p1.Id
)
总结
这就是如何使用 GROUP BY 和 HAVING 子句在 SQL 中查找重复项的全部内容。 我还向您展示了如何使用自联接和带有 EXISTS 子句的子查询来解决这个问题。 一旦你熟悉了这个模式,你就可以解决很多这样的问题。
- 点赞
- 收藏
- 关注作者
评论(0)