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

Как отобрать уникальные значения в таблице?

1.3 Junior🔥 231 комментариев
#Базы данных и SQL

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

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

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

Получение уникальных значений в SQL

Получение уникальных (distinct) значений из таблицы - одна из базовых операций в запросах к БД.

1. DISTINCT в SELECT

Базовый синтаксис:

SELECT DISTINCT column_name FROM table_name;

Примеры:

-- Получить все уникальные города
SELECT DISTINCT city FROM users;

-- Результат: Moscow, SPB, Yekaterinburg (без дубликатов)

Несколько столбцов:

-- Уникальные комбинации город и страна
SELECT DISTINCT city, country FROM users;

ДИСТИNCT применяется ко всему SELECT списку, не к одному столбцу.

2. COUNT(DISTINCT)

Подсчёт уникальных значений:

SELECT COUNT(DISTINCT city) FROM users;

Практический пример:

-- Количество уникальных пользователей, оставивших комментарии
SELECT COUNT(DISTINCT user_id) FROM comments;

3. GROUP BY для уникальных значений

Альтернатива DISTINCT:

SELECT city FROM users GROUP BY city;

GROUP BY позволяет добавлять агрегирующие функции:

-- Города и количество пользователей в каждом
SELECT city, COUNT(*) as user_count FROM users GROUP BY city ORDER BY user_count DESC;

ДИСТИNCT это сделать не может.

4. Фильтрация уникальных значений

С условиями:

-- Уникальные города активных пользователей
SELECT DISTINCT city FROM users WHERE status = active;

С группировкой и условиями:

-- Города где есть более 10 пользователей
SELECT city, COUNT(*) as count FROM users GROUP BY city HAVING COUNT(*) > 10;

5. Производительность

На больших таблицах DISTINCT может быть медленным:

Решения:

  1. Добавить индекс на столбец
  2. Использовать WHERE для фильтрации перед DISTINCT
  3. GROUP BY может быть быстрее чем DISTINCT

Проверка плана выполнения:

EXPLAIN SELECT DISTINCT city FROM users;

6. Исключение NULL значений

NULL обрабатывается как отдельное значение:

SELECT DISTINCT phone FROM users;

Исключение NULL:

SELECT DISTINCT phone FROM users WHERE phone IS NOT NULL;

7. Сортировка уникальных значений

DISTINCT с ORDER BY:

SELECT DISTINCT city FROM users ORDER BY city;

При DISTINCT можно ORDER BY только по столбцам из SELECT списка.

8. Практические примеры

Пример 1: Уникальные email адреса покупателей

SELECT DISTINCT email FROM orders WHERE status = completed ORDER BY email;

Пример 2: Категории товаров, купленные в 2024 году

SELECT DISTINCT p.category FROM products p
INNER JOIN order_items oi ON p.id = oi.product_id
INNER JOIN orders o ON oi.order_id = o.id
WHERE YEAR(o.created_at) = 2024;

Пример 3: Статистика уникальных значений

SELECT 
    COUNT(DISTINCT user_id) as unique_users,
    COUNT(DISTINCT product_id) as unique_products,
    COUNT(*) as total_orders
FROM orders;

9. Когда использовать GROUP BY вместо DISTINCT

GROUP BY лучше когда:

  • Нужны агрегирующие функции
  • Нужны условия на агрегаты
  • Нужна более сложная логика
-- Только DISTINCT
SELECT DISTINCT department FROM employees;

-- Нужна статистика - GROUP BY
SELECT department, COUNT(*), AVG(salary) FROM employees GROUP BY department;

10. Производительность и индексы

  • DISTINCT требует сортировку или хеш-агрегацию
  • На больших таблицах может быть медленным
  • Всегда проверяй EXPLAIN план выполнения
  • Добавляй индексы если DISTINCT часто используется
  • GROUP BY иногда работает быстрее

Правильное использование DISTINCT критично для написания эффективных SQL запросов.