Что делает модификатор DISTINCT в SQL?

Ответ

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

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

SELECT DISTINCT column1, column2 FROM table_name;

Примеры:

-- Получить все уникальные должности в компании
SELECT DISTINCT job_title FROM employees;

-- Получить уникальные комбинации отдела и должности
SELECT DISTINCT department, job_title FROM employees;

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

Важные особенности:

  1. Применяется ко всем столбцам: SELECT DISTINCT a, b возвращает уникальные пары значений (a, b).
  2. С NULL: DISTINCT считает все значения NULL одинаковыми, поэтому в результате будет только одна строка с NULL.
  3. Производительность: Использование DISTINCT часто требует сортировки и сравнения всех строк, что может быть ресурсоёмким на больших таблицах. Перед применением убедитесь, что он действительно необходим.
  4. Альтернативы: Иногда дубликаты можно исключить с помощью GROUP BY:
    -- Эквивалентные запросы
    SELECT DISTINCT department FROM employees;
    SELECT department FROM employees GROUP BY department;

Распространённая ошибка: Нельзя использовать DISTINCT с агрегатными функциями (кроме COUNT). Для этого есть отдельные конструкции:

-- Правильно: подсчёт уникальных значений
SELECT COUNT(DISTINCT department) FROM employees;

-- Неправильно: так писать нельзя
SELECT SUM(DISTINCT salary) FROM employees; -- Обычно бессмысленно

Ответ 18+ 🔞

А, слушай, про этот ваш DISTINCT! Ну, классика жанра, блядь. Вроде простая штука, а столько народу на ней обжигается, как дурак на сковородке.

Вот смотри, представь себе таблицу с сотрудниками. Там у тебя этот Иван Сидоров, бухгалтер, сидит. И эта Мария Петрова, тоже бухгалтер. И ещё пятнадцать таких же бухгалтеров. А тебе, допустим, начальству отчёт подать надо: "А какие у нас, блядь, должности вообще есть?" Ты что, будешь пятнадцать раз "бухгалтер" выписывать? Нет, ты ж не идиот. Вот тут-то DISTINCT и выручает, как верный друг, блядь.

Пишешь:

SELECT DISTINCT job_title FROM employees;

И вуаля, ёпта! Тебе вывалит список: бухгалтер, менеджер, уборщица, директор... Каждая должность по одному разу, без этих дурацких повторов. Красота!

А теперь главный подвох, на котором все ебут мозги, как дурни. Смотри сюда:

SELECT DISTINCT department, job_title FROM employees;

Что ты думаешь, он сделает? Правильно, он ищет уникальные пары, блядь! То есть если в отделе "Бухгалтерия" есть "главбух" и "бухгалтер" — это две разные строки. А если в отделе "IT" тоже есть "бухгалтер" — это уже третья строка, потому что комбинация (IT, бухгалтер) — это не то же самое, что (Бухгалтерия, бухгалтер). Голова не закипела ещё? То-то же.

А ещё есть этот ёбаный NULL. Вот засада! DISTINCT считает все NULL'ы за одного уродца. Сколько бы у тебя там записей с пустым полем ни было — на выходе будет один, единый, блядь, NULL. Как будто они все сговорились.

И самое главное — производительность, сука! Эта операция — она ж не просто так. Ей надо всё прочитать, отсортировать, сравнить, дубликаты выкинуть. На маленькой таблице — похуй, чих-пых. А представь, у тебя там миллион записей, и ты туда DISTINCT суёшь по всем полям. Это ж пиздец будет, комп загнётся, как последний оловянный солдатик. Перед тем как юзать, спроси себя: "А оно мне точно надо? Может, GROUP BY тут логичнее?"

Кстати, про GROUP BY. Да, иногда они как близнецы-братья:

SELECT department FROM employees GROUP BY department;

Сделает почти то же самое, что и DISTINCT. Но GROUP BY — он мощнее, он для группировки, с ним агрегатные функции дружат. А DISTINCT — он просто скромный санитар, который мусор (дубликаты) убирает.

И запомни раз и навсегда, чтобы не выглядеть как полупидор на собеседовании: DISTINCT внутрь агрегатных функций (типа SUM, AVG) пихать — это обычно полная хуйня и бессмыслица. Ну, кроме одного случая — COUNT(DISTINCT column). Вот это — святое. Это подсчёт уникальных значений. Очень полезная штука, ядрёна вошь.

SELECT COUNT(DISTINCT city) FROM offices; -- вот так, бля, правильно!

А SUM(DISTINCT salary) — это уже из разряда "а давайте сложим все разные зарплаты, а одинаковые проигнорируем". Зачем? Кому это надо? Никому, вот и не надо так делать.

Короче, DISTINCT — инструмент простой, но острый. Бери в руки, когда надо почистить результат от мусора. Но не тычь им куда попало, а то сам потом удивляться будешь, почему запрос выполняется полчаса.