← Назад к вопросам

SQL запрос для поиска дубликатов

2.0 Middle🔥 161 комментариев
#Базы данных и SQL

Условие

Дана таблица employees с колонками: id, name, email, department. Напишите SQL запрос, который находит все дублирующиеся email адреса.

Ожидаемый результат

Список email адресов, которые встречаются более одного раза.

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Поиск дубликатов в базе данных — частая задача при тестировании, валидации данных и подготовке тест-кейсов. Правильно написанный SQL запрос позволяет быстро выявить проблемы с уникальностью данных.

Основной запрос

SELECT email, COUNT(*) as count
FROM employees
GROUP BY email
HAVING COUNT(*) > 1
ORDER BY count DESC;

Объяснение:

  • SELECT email, COUNT(*) — выбираем email и считаем количество повторений
  • FROM employees — из таблицы employees
  • GROUP BY email — группируем по email адресу
  • HAVING COUNT(*) > 1 — фильтруем группы с дубликатами
  • ORDER BY count DESC — сортируем по количеству повторений

Расширенный запрос

SELECT e.*
FROM employees e
WHERE e.email IN (
  SELECT email
  FROM employees
  GROUP BY email
  HAVING COUNT(*) > 1
)
ORDER BY e.email;

Показывает все записи с дублирующимися email адресами.

С оконной функцией

SELECT *,
       ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) as rn
FROM employees
WHERE email IN (
  SELECT email
  FROM employees
  GROUP BY email
  HAVING COUNT(*) > 1
)
ORDER BY email, id;

Нумерует дубликаты для удаления. Легко удалить: DELETE FROM employees WHERE rn > 1

Best Practices:

  1. Используй HAVING COUNT(*) > 1 для фильтрации
  2. Включай ID в результаты
  3. Сортируй для удобства анализа
  4. Создавай индексы на часто проверяемые колонки
  5. Помни, что NULL != NULL в SQL

Эти запросы работают в PostgreSQL, MySQL, SQL Server и других СУБД.