Зарегистрируйтесь, чтобы продолжить обучение

Уникальные строки Основы SQL

Представим, что мы хотим узнать, на какие курсы онлайн-школы записались студенты. Для этого нам нужно выполнить запрос на выборку из таблицы course_members`:

SELECT course_id FROM course_members ORDER BY course_id;
course_id

2

10

12

12

15

…​

View on DB Fiddle

Мы выбрали идентификаторы всех курсов, на которые записался хотя бы один студент. Видно, что некоторые идентификаторы курсов повторяются — на них записалось по несколько студентов.

Сейчас мы изучаем только сами курсы, не обращая внимания на количество записавшихся студентов. Поэтому нам нужно убрать повторяющиеся идентификаторы и оставить только уникальные.

В этом уроке мы разберемся, как это сделать.

Как убрать повторяющиеся строки

В языке SQL существует специальный оператор DISTINCT, который удаляет повторяющиеся строки запроса и оставляет только уникальные. Запрос будет выглядеть так:

SELECT DISTINCT course_id FROM course_members ORDER BY course_id;
course_id

2

10

12

15

…​

View on DB Fiddle

Теперь из этого запроса исключены все повторяющиеся строки.

Таким образом, чтобы исключить повторяющиеся строки, нужно после оператора SELECT указать DISTINCT и перечислить все нужные столбцы.

Если мы добавим в наш запрос еще одно поле user_id, то это изменит результат запроса. В эту выборку попадут строки с уникальным сочетанием курса и слушателя.

По отдельности курсы и слушатели могут повторяться, но их сочетание будет уникальным:

-- DISTINCT добавляется в запрос только один раз,
-- независимо от того, сколько колонок перечисляется
SELECT DISTINCT
    course_id,
    user_id
FROM course_members ORDER BY course_id;
course_id user_id

2

5

10

19

12

4

12

65

15

31

View on DB Fiddle

Оператор DISTINCT ON

Представим, что мы хотим выбрать уникальные курсы и добавить дату, когда на него записался первый студент.

Напишем запрос, в котором после DISTINCT укажем course_id и created_at. Он вернет нам уникальные сочетания этих двух полей:

SELECT DISTINCT course_id, created_at FROM course_members ORDER BY course_id;
course_id created_at

2

2022-06-14T10:48:45.491Z

10

2022-06-14T06:40:23.565Z

12

2022-06-14T11:36:10.374Z

12

2022-06-13T21:41:33.465Z

15

2022-06-14T13:21:58.235Z

…​

View on DB Fiddle

Есть модификация этого оператора — DISTINCT ON. Такой вариант оператора позволяет указать:

  • Поле, которое должно быть уникальным.

  • Поля, которые нужно вывести.

Так выглядит запрос с DISTINCT ON:

SELECT DISTINCT ON (course_id)
    course_id,
    created_at
FROM course_members
ORDER BY course_id, created_at;

View on DB Fiddle

После DISTINCT ON в круглых скобках мы указываем поле, по которому будет проверяться уникальность. Далее мы перечисляем те поля, которые мы хотим видеть в запросе.

В нашем запросе идентификаторы курсов не повторяются, а в качестве created_at выводится первая дата выбора курса.

В DISTINCT ON можно указывать несколько полей в качестве уникальных:

SELECT DISTINCT ON (course_id, created_at)
    course_id,
    created_at
FROM course_members
ORDER BY course_id;

View on DB Fiddle

Такой запрос будет равносилен первому запросу этого раздела:

SELECT DISTINCT
    course_id,
    created_at
FROM course_members ORDER BY course_id;

Сортировка с оператором DISTINCT ON

При работе с DISTINCT ON важно правильно использовать сортировку. Первыми полями в ORDER BY должны быть те, которые идут после DISTINCT ON.

Для примера напишем еще один запрос — к каждому уникальному курсу выведем дату, в которую записался последний студент.

Для этого нужно после ORDER BY сначала указать поле course_id, как того требует синтаксис. Затем нужно добавить поле created_at с сортировкой по убыванию:

SELECT DISTINCT ON (course_id)
    course_id,
    created_at
FROM course_members
ORDER BY course_id, created_at DESC;

View on DB Fiddle

Этот запрос выведет все уникальные курсы и дату, когда на этот курс в последний раз записывались.

Выводы

В этом уроке мы изучили оператор DISTINCT и научились с помощью него выбирать уникальные строки и удалять дублирующиеся. Кроме того, мы разобрались с модификацией DISTINCT ON, научились задавать уникальные поля и добавлять к ним дополнительную информацию.

В следующих уроках мы научимся некоторым функциям, которые часто используются вместе с оператором DISTINCT.


Дополнительные материалы

  1. DISTINCT

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
Программирование на Python, Разработка веб-приложений и сервисов используя Django, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
Тестирование веб-приложений, чек-листы и тест-кейсы, этапы тестирования, DevTools, Postman, SQL, Git, HTTP/HTTPS, API
4 месяца
с нуля
Старт 26 декабря
профессия
Программирование на Java, Разработка веб-приложений и микросервисов используя Spring Boot, проектирование REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
новый
Google таблицы, SQL, Python, Superset, Tableau, Pandas, визуализация данных, Anaconda, Jupyter Notebook, A/B-тесты, ROI
9 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на PHP, Разработка веб-приложений и сервисов используя Laravel, проектирование и реализация REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на JavaScript в браузере и на сервере (Node.js), разработка бекендов на Fastify и фронтенда на React
16 месяцев
с нуля
Старт 26 декабря
профессия
Программирование на JavaScript, разработка веб-приложений, bff и сервисов используя Fastify, проектирование REST API
10 месяцев
с нуля
Старт 26 декабря
профессия
новый
Git, JavaScript, Playwright, бэкенд-тесты, юнит-тесты, API-тесты, UI-тесты, Github Actions, HTTP/HTTPS, API, Docker, SQL
8 месяцев
c опытом
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»