DISTINCT для нескольких столбцов
Уникальность сочетаний значений
«DISTINCT для нескольких столбцов» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Зачем нужны несколько столбцов
Вы уже знаете, что SELECT DISTINCT удаляет дубликаты строк. Но что означает слово «дубликат», когда запрос возвращает несколько столбцов?
Строка считается дубликатом только тогда, когда каждый выбранный столбец содержит то же значение, что и другая строка. Если отличается хотя бы один столбец, сохраняются обе строки.
Пример таблицы: заказы
Давайте создадим небольшую таблицу заказов для экспериментов. В ней хранится информация о том, какой клиент купил товар из какой категории и в какой стране.
CREATE TABLE orders (
id INTEGER,
customer VARCHAR(50),
category VARCHAR(50),
country VARCHAR(50)
);
INSERT INTO orders VALUES
(1, 'Alice', 'Electronics', 'US'),
(2, 'Alice', 'Books', 'US'),
(3, 'Bob', 'Electronics', 'UK'),
(4, 'Alice', 'Electronics', 'US'),
(5, 'Bob', 'Electronics', 'UK'),
(6, 'Carol', 'Clothing', 'CA');DISTINCT для одного столбца
Кратко напомним: применение DISTINCT к одному столбцу возвращает только уникальные значения этого столбца.
Здесь мы получаем все уникальные имена клиентов — всего три строки, хотя заказов шесть.
SELECT DISTINCT customer
FROM orders;DISTINCT для двух столбцов
Теперь добавим второй столбец. Ключевое слово DISTINCT по-прежнему записывается только один раз, сразу после SELECT. База данных рассматривает каждую уникальную пару (клиент, категория) как одну строку.
Alice встречается дважды — один раз для категории «Электроника» и один раз для категории «Книги», поскольку это две разные комбинации.
SELECT DISTINCT customer, category
FROM orders;Как проверяется уникальность
База данных сравнивает полные снимки строк. Чтобы DISTINCT удалил строку, все столбцы в списке SELECT должны в точности совпадать с уже встречавшейся строкой.
В нашей таблице заказов строки 3 и 5 обе содержат (Bob, Электроника, UK) — идеальное совпадение по всем трём столбцам, поэтому одна из них удаляется.
SELECT DISTINCT customer, category, country
FROM orders;
-- Row (Bob, Electronics, UK) appears only once
-- even though it occurs on rows 3 and 5Частичное совпадение не устраняется
У Alice есть две строки со значением категория = Электроника, но в обеих указано страна = US. При выборе всех трёх столбцов эти две исходные строки идентичны, поэтому сохраняется только одна.
Измените выборку — и проверка уникальности также изменится.
-- Select only customer + country
-- (Alice, US) appears twice in the table but DISTINCT keeps it once
SELECT DISTINCT customer, country
FROM orders;
-- Now add category back — uniqueness recalculated
SELECT DISTINCT customer, category, country
FROM orders;Практический пример: уникальные пары
Распространённый приём — находить каждую уникальную комбинацию двух атрибутов — например, определять, какие категории товаров продаются в каких странах, независимо от того, сколько раз продавался каждый товар.
SELECT DISTINCT category, country
FROM orders
ORDER BY category, country;Сочетание DISTINCT и WHERE
Сначала можно отфильтровать строки с помощью WHERE, а затем DISTINCT удалит дубликаты из отфильтрованного результата. Эти два предложения работают независимо — WHERE сужает набор данных, а DISTINCT удаляет дубликаты.
SELECT DISTINCT customer, category
FROM orders
WHERE country = 'US';DISTINCT и GROUP BY
Эквивалентный способ получить уникальные комбинации — использовать GROUP BY. Оба подхода дают один и тот же результат при обычном удалении дубликатов. Разница становится важной, когда нужны агрегаты: GROUP BY позволяет добавить COUNT(*), SUM() и т. д., а DISTINCT — нет.
-- Using DISTINCT
SELECT DISTINCT customer, category
FROM orders;
-- Equivalent using GROUP BY
SELECT customer, category
FROM orders
GROUP BY customer, category;Подсчёт уникальных комбинаций
Если поместить многоколоночный DISTINCT в подзапрос, можно подсчитать, сколько уникальных комбинаций существует. Это удобный способ измерить разнообразие данных.
SELECT COUNT(*) AS unique_customer_category_pairs
FROM (
SELECT DISTINCT customer, category
FROM orders
) AS deduped;Распространённая ошибка: DISTINCT применяется ко всем столбцам
Распространённое заблуждение состоит в том, что DISTINCT применяется только к первому перечисленному столбцу. Это не так. DISTINCT всегда учитывает всю строку, сформированную всеми выбранными столбцами.
Нельзя использовать DISTINCT только для некоторых столбцов, сохранив дубликаты в остальных, — для этого нужны оконные функции, такие как ROW_NUMBER().
-- This does NOT give distinct customers with any category
-- It gives distinct (customer, category) pairs
SELECT DISTINCT customer, category
FROM orders;
-- If you want one row per customer (any category), use:
SELECT customer, MIN(category) AS sample_category
FROM orders
GROUP BY customer;Быстрая проверка
Проверьте, насколько хорошо Вы поняли принцип работы DISTINCT с несколькими столбцами.
Итоги урока
Отличная работа! Вот что Вы узнали об использовании DISTINCT с несколькими столбцами:
- DISTINCT применяется ко всей строке — все выбранные столбцы проверяются вместе.
- Строка исключается только тогда, когда каждый её столбец в точности совпадает с соответствующим столбцом уже встречавшейся строки.
- Добавление или удаление столбцов из списка SELECT меняет представление о том, какие строки считаются дубликатами.
- DISTINCT можно свободно сочетать с WHERE и ORDER BY.
- GROUP BY — эквивалентная альтернатива, необходимая, если Вам также нужны агрегаты.
Освоив DISTINCT для нескольких столбцов, Вы сможете эффективно исследовать уникальные комбинации в любом наборе данных.
Часто задаваемые вопросы
Урок «DISTINCT для нескольких столбцов» бесплатный?
Да — полный текст урока «DISTINCT для нескольких столбцов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «DISTINCT для нескольких столбцов»?
Уникальность сочетаний значений Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «DISTINCT для нескольких столбцов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы SELECT DISTINCT
- DISTINCT для нескольких столбцов
- PostgreSQL DISTINCT ON
- Подсчёт уникальных значений