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

Что делает оператор DISTINCT?

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

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

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

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

Что делает оператор DISTINCT в SQL?

Оператор DISTINCT используется в SQL для возврата только уникальных (различных) значений из столбца или набора столбцов в результате запроса. Он устраняет дублирующиеся строки из результирующего набора данных, оставляя только по одному экземпляру для каждой уникальной комбинации значений.

Ключевые аспекты работы DISTINCT

  1. Устранение дубликатов: Основная задача — фильтрация повторяющихся строк.
  2. Применяется ко всем выбранным столбцам: Когда используется с несколькими столбцами, уникальность определяется комбинацией значений во всех указанных столбцах.
  3. Работа с NULL-значениями: В большинстве СУБД DISTINCT обрабатывает NULL как отдельное значение, и несколько NULL будут считаться дубликатами (останется один NULL).

Синтаксис и примеры

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

SELECT DISTINCT column1, column2 FROM table_name;

Пример 1: Получение уникальных значений одного столбца

-- Таблица employees с дублями в department
SELECT DISTINCT department FROM employees;

Результат: список отделов без повторений.

Пример 2: Уникальные комбинации нескольких столбцов

SELECT DISTINCT city, country FROM addresses;

Результат: уникальные пары "город-страна".

Пример 3: С агрегатными функциями

SELECT COUNT(DISTINCT product_category) FROM orders;

Подсчёт количества уникальных категорий товаров.

Особенности производительности и оптимизации

Использование DISTINCT имеет важные последствия:

  • Влияние на производительность: Оператор требует дополнительных вычислительных ресурсов для сортировки или хеширования данных с целью выявления дубликатов. На больших таблицах это может быть затратно.

  • Альтернативы в некоторых сценариях:

    -- GROUP BY может дать аналогичный результат
    SELECT city FROM addresses GROUP BY city;
    

    Однако семантически GROUP BY предназначен для агрегации, а DISTINCT — именно для удаления дубликатов.

  • Использование с ORDER BY:

    SELECT DISTINCT department FROM employees ORDER BY department DESC;
    

Практические сценарии применения

  1. Анализ уникальных пользователей:

    SELECT DISTINCT user_id FROM site_visits;
    
  2. Построение выпадающих списков в интерфейсах: Получение уникальных значений для фильтров.

  3. Очистка данных перед агрегацией: Устранение дублей для корректных расчётов.

  4. Поиск уникальных комбинаций атрибутов в товарах, заказах или пользовательских сессиях.

Важные нюансы

  • DISTINCT ON в PostgreSQL: Специфичное расширение:

    SELECT DISTINCT ON (department) id, name, department 
    FROM employees 
    ORDER BY department, hire_date DESC;
    

    Возвращает первую строку для каждого отдела согласно ORDER BY.

  • Нельзя использовать с * и отдельными столбцами одновременно:

    -- Неверно
    SELECT DISTINCT column1, * FROM table;
    
  • Влияние на индексы: Если столбцы в DISTINCT индексированы, производительность обычно выше.

Сравнение с аналогичными конструкциями

  • UNION vs DISTINCT: UNION по умолчанию удаляет дубликаты между наборами, аналогично DISTINCT.
  • GROUP BY без агрегатных функций: Часто дает схожий план выполнения, но разную семантику.

Вывод: Оператор DISTINCT — мощный инструмент для работы с уникальными данными, но требует осознанного применения из-за потенциального влияния на производительность. Всегда анализируйте, действительно ли необходимо устранение дубликатов, или лучше использовать другие методы фильтрации.

Что делает оператор DISTINCT? | PrepBro