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

Ответ

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

Пример использования:

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

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

Ключевые особенности:

  • DISTINCT применяется ко всем столбцам в списке SELECT
  • Для поиска дубликатов СУБД обычно выполняет сортировку, что может влиять на производительность на больших таблицах
  • NULL значения считаются равными друг другу, поэтому DISTINCT вернет только один NULL
  • Для агрегирования с подсчетом уникальных значений часто используют COUNT(DISTINCT column):
    -- Подсчитать количество уникальных городов
    SELECT COUNT(DISTINCT city) FROM users;
  • В некоторых случаях альтернативой может быть GROUP BY, но семантика отличается: GROUP BY предназначен для агрегации, а DISTINCT — только для удаления дубликатов.

Ответ 18+ 🔞

А, ну это же про DISTINCT! Давай разжую, как есть, без соплей.

Представь, что у тебя таблица с пользователями, и там в графе «город» сплошной бардак. Один и тот же город вбит десятью разными способами: «Москва», «МСК», «г. Москва», а какой-то долбоёб вообще написал «столица». Или ещё хуже — один город повторяется сотню раз, потому что там столько людей живёт.

Вот чтобы не выгружать эту помойку из тысячи одинаковых записей, ты и пишешь DISTINCT. Это как команда базе: «Слушай, а давай-ка ты мне каждый город покажешь только по одному разу, а? Не нужно мне всю эту простыню, где Москва встречается как последняя шлюха».

Вот смотри, как это в деле:

-- Вытащи мне все города, но так, чтобы они не повторялись. Одна Москва — одна запись.
SELECT DISTINCT city FROM users;

-- А вот это уже посерьёзнее. Уникальные пары: город и страна.
-- Чтобы «Москва, Россия» и «Москва, США» (мало ли, филиал) считались разными записями.
SELECT DISTINCT city, country FROM users;

А теперь про важные детали, о которых часто забывают:

  • DISTINCT — это не волшебная палочка. Он жрёт ресурсы, особенно на больших таблицах. База данных, чтобы найти дубликаты, обычно всё это добро сортирует. А сортировка — операция не из лёгких. Так что если таблица на миллионы строк, думай головой, а не тыкай DISTINCT везде, где попадётся.
  • NULL — это отдельная песня. Все NULL-значения для DISTINCT выглядят одинаково — как пустота. Поэтому из кучи строк с NULL в колонке city он вернёт тебе всего одну строчку с этим самым NULL. Не два, не три — один. Запомни это, а то потом будешь охуевать, куда данные делись.
  • Частый запрос — посчитать, сколько вообще уникальных значений. Тут DISTINCT внутри COUNT — твой лучший друг.
    -- Не «сколько всего записей с городом», а «сколько вообще уникальных городов».
    SELECT COUNT(DISTINCT city) FROM users;
  • И последнее, чтобы не облажаться. DISTINCT и GROUP BY — вроде бы дают похожий результат, но цели у них разные, ёпта! GROUP BY — это для агрегации, чтобы потом к каждой группе SUM(), AVG() применить. А DISTINCT — тупо убрать повторы, и всё. Если тебе нужно просто уникальные значения — бери DISTINCT. Если нужно что-то посчитать по группам — вот тогда уже GROUP BY. Не путай, а то получишь манду с ушами вместо красивого запроса.

Вот и вся магия. Используй с умом, а не как мартышлюшка, которая ко всем столбцам его цепляет.