Уникальные записи в SQL: выборка без дубликатов в column2
Быстрый ответ
Для отбора уникальных записей в SQL примените ключевое слово DISTINCT
в вашем запросе SELECT
. Чтобы выбрать уникальные значения одного столбца, например email
, отправьте следующий запрос:
SELECT DISTINCT email FROM customers;
Если вам требуется выбрать уникальные комбинации из нескольких столбцов, наподобие first_name
и last_name
, вот как это сделать:
SELECT DISTINCT first_name, last_name FROM customers;
Эти два запроса исключают повторяющиеся значения. Во втором запросе достигается уникальность за счёт комбинирования значений двух столбцов.
Погружаемся в DISTINCT
Применение DISTINCT
простое в основных ситуациях. Рассмотрим, как справиться с объединениями и несколькими столбцами, чтобы не столкнуться с нежелательными дубликатами:
-- "Уровень уникальности: Джон Уик"
SELECT DISTINCT c.customer_id, o.order_id
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id;
Этот запрос обеспечивает уникальность объединённых данных, сохраняя чистоту и аккуратность информации.
Знакомство с командой GROUP BY
Когда речь идёт о агрегатных функциях или больших массивах данных, команда GROUP BY
становится актуальной, действуя как главный стратег:
-- "Группируемся, словно пятничный вечер!"
SELECT city, COUNT(*) as population
FROM customers
GROUP BY city;
Этот запрос отображает количество жителей по городам среди клиентов. GROUP BY
группирует данные по одинаковым значениям указанного столбца.
ROW_NUMBER(): секретный ингредиент
Потребуется особый подход к уникальности? Оконные функции в связке с ROW_NUMBER()
в рамках Общего Табличного Выражения (CTE) смогут предложить решение:
-- "Властелин строк – Возвращение Row_Number"
WITH ranked_customers AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY signup_date DESC) AS rn
FROM customers
)
SELECT * FROM ranked_customers WHERE rn = 1;
Такой запрос отсортировывает клиентов по дате регистрации, выбирая только тех, кто зарегистрировался позже всех, с уникальной электронной почтой.
Визуализация
Представим библиотеку книг (📚), где каждая книга — это запись в базе данных:
📚📚📚📚📚📚📚📚📚
📘📗📕📘📗📕📗📘📕
🔍 Это — наша задача: отыскать все уникальные экземпляры, исключая дубликаты.
SELECT DISTINCT title FROM books;
Таким образом, перед нами отображаются аккуратно организованные выбранные данные:
📚📚📚
📘📗📕
Без дубликатов! Вот именно так SELECT DISTINCT
обеспечивает уникальные значения в нашем запросе.
Особенности SQL
Каждый диалект SQL преподносит свои уникальности. В PostgreSQL есть операция DISTINCT ON
, которая помогает отобрать уникальные события по местоположению:
-- "Идеальное DISTINCT-ционирование"
SELECT DISTINCT ON (location) location, event_date FROM events ORDER BY location, event_date DESC;
При возникновении сомнений всегда советуйтесь с синтаксисом SQL истины, с которой вы работаете.
Решение проблем производительности
При выборке из больших наборов данных размер имеет значение. Сравните эффективность DISTINCT
с GROUP BY
или подзапросами:
-- "Быстрые и DISTINCTные: SQL Дрифт"
SELECT DISTINCT title FROM books;
Индексированный столбец обычно ускоряет DISTINCT
, однако экспериментирование — ключ к выбору между DISTINCT
, GROUP BY
и подзапросами.
Реальность
В практике в конкретных сценариях определяются, какие столбцы следует выбирать для DISTINCT
:
-- "Когда жизнь дарит тебе адреса, сделай из них DISTINCT-ые адреса."
SELECT DISTINCT addresses FROM customers;
Если разные клиенты используют один и тот же адрес, применение DISTINCT
поможет связать их. Тщательно изучите свою модель данных.
Работа с несколькими столбцами
Когда речь идёт о составных ключах — наборах столбцов, которые в совокупности уникальны — DISTINCT
всё ещё актуален:
-- "Ослепительно DISTINCT"
SELECT DISTINCT country, city FROM addresses;
Этот запрос выведет уникальные сочетания городов для каждой страны.