Ответ
Ключевое слово 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;
Важные особенности:
- Применяется ко всем столбцам:
SELECT DISTINCT a, bвозвращает уникальные пары значений (a, b). - С NULL:
DISTINCTсчитает все значенияNULLодинаковыми, поэтому в результате будет только одна строка сNULL. - Производительность: Использование
DISTINCTчасто требует сортировки и сравнения всех строк, что может быть ресурсоёмким на больших таблицах. Перед применением убедитесь, что он действительно необходим. - Альтернативы: Иногда дубликаты можно исключить с помощью
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 — инструмент простой, но острый. Бери в руки, когда надо почистить результат от мусора. Но не тычь им куда попало, а то сам потом удивляться будешь, почему запрос выполняется полчаса.