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

Сортировка данных Основы SQL

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

Теоретически порядок может поменяться при следующем запросе, или когда количество данных в таблице изменится. Обновление версии базы данных тоже может повлиять на это.

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

Как устроен запрос на сортировку

Допустим, нам нужно отсортировать данные в базе:

Сортировка строк

Сортировка задается с помощью оператора ORDER BY. За ней следует имя поля, по которому происходит сортировка:

SELECT
    id,
    username,
    created_at
FROM users ORDER BY username;
id username

12

Abelardo58

33

Alanna99

58

Alena17

39

Alfonzo_Lehner

44

Amely1

…​

View on DB Fiddle

Такой запрос вернет всю информацию о пользователях, отсортированную по username. Если порядок не указан, то сортировка происходит по возрастанию ASC.

Сортировка подразумевает сравнение значений между собой. По какому принципу база данных сортирует строки username, как в примере выше? Самый распространенный способ — лексикографический порядок, то есть по алфавиту.

База данных знает, как сравнивать не только числа, но и строки, и даты. Сортировка по датам — крайне частая операция, выглядит она идентично любой другой сортировке:

SELECT
    id,
    username,
    created_at
FROM users ORDER BY created_at;
id username created_at

16

Davonte78

2022-06-13T20:45:36.590Z

61

Carmela.Raynor42

2022-06-13T20:49:36.072Z

67

Gertrude_Hand29

2022-06-13T20:49:39.486Z

46

Edd_Harris

2022-06-13T20:58:22.247Z

13

Tina_Huels

2022-06-13T20:59:54.222Z

…​

View on DB Fiddle

Здесь мы отсортировали пользователей по дате создания в прямом порядке, то есть по возрастанию.

Как управлять порядком сортировки

Сортировать данные можно разными способами:

  • В прямом порядке

  • В обратном порядке

  • По нескольким полям

Прямой порядок сортировки

Если ничего дополнительно не указывать, то ORDER BY сортирует в прямом порядке — от меньшего к большему. Запрос выше — это сокращенная версия полного запроса с сортировкой.

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

SELECT
    id,
    username,
    created_at
FROM users ORDER BY created_at ASC;
-- То же самое, что и
SELECT
    id,
    username,
    created_at
FROM users ORDER BY created_at;

View on DB Fiddle

Обратный порядок сортировки

Чтобы выполнить сортировку в обратном порядке, указываем DESC:

SELECT
    id,
    username,
    created_at
FROM users
ORDER BY created_at DESC;
id username created_at

76

Janet.Bernier14

2022-06-14T20:35:08.411Z

30

Jensen_Raynor61

2022-06-14T20:24:34.485Z

78

Tania77

2022-06-14T20:13:38.385Z

59

Sylvan_Nader

2022-06-14T20:07:58.356Z

50

Kareem12

2022-06-14T19:53:15.086Z

…​

View on DB Fiddle

Сортировка по нескольким полям

Иногда нужно отсортировать данные сразу по нескольким полям. Этого можно достичь, если перечислить поля через запятую:

SELECT
    id,
    username,
    created_at
FROM users ORDER BY username, created_at;
id username created_at

12

Abelardo58

2022-06-14T13:10:36.133Z

33

Alanna99

2022-06-14T19:30:46.438Z

58

Alena17

2022-06-14T13:10:08.010Z

39

Alfonzo_Lehner

2022-06-14T07:35:06.735Z

44

Amely1

2022-06-14T18:28:10.986Z

…​

View on DB Fiddle

Порядок сортировки в таком случае задается для каждого поля в отдельности:

SELECT
    first_name,
    created_at
FROM users
ORDER BY first_name ASC, created_at DESC;
first_name created_at

Abe

2022-06-13T20:45:36.590Z

Abigale

2022-06-13T21:38:32.637Z

Alejandrin

2022-06-14T13:18:29.695Z

Alfreda

2022-06-13T20:59:54.222Z

Alfredo

2022-06-14T19:30:46.438Z

…​

View on DB Fiddle

В этой выборке сначала выполняется сортировка по имени в прямом порядке. Затем внутри групп с одинаковым именем данные сортируются по created_at в обратном порядке.

Как сортировать NULL-значения

В языке SQL нет единого стандарта как сортировать данные с NULL, и каждый провайдер, авторы базы данных, решает сам. Поэтому положение NULL-значений может отличаться в разных БД. Например, в MySQL NULL будут впереди при сортировке по возрастанию, тогда как в PostgreSQL в самом конце.

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

  • NULLS FIRST

  • NULLS LAST

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

-- Сортируем по возрастанию даты, то есть поля `created_at`
-- Поля с `NULL` идут последними
SELECT
    id,
    username,
    created_at
FROM users ORDER BY created_at ASC;

-- Сортируем по возрастанию даты
-- Поля с `NULL` идут первыми
SELECT
    id,
    username,
    created_at
FROM users ORDER BY created_at ASC NULLS FIRST;

View on DB Fiddle

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

-- Сортируем по убыванию даты
-- Поля с `NULL` идут первыми
SELECT
    id,
    username,
    created_at
FROM users ORDER BY created_at DESC;

-- Сортируем по убыванию даты
-- Поля с `NULL` идут последними
SELECT
    id,
    username,
    created_at
FROM users ORDER BY created_at DESC NULLS LAST;

View on DB Fiddle

Выводы

В этом уроке мы научились сортировать результаты запроса, потому что результаты не всегда возвращаются в нужном нам порядке.

Для сортировки используется оператор ORDER BY. Он помогает сортировать данные в том порядке, который нам нужен. При этом, можно сортировать как по возрастанию через ASC, так и по убыванию с помощью DESC.


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

  1. Официальная документация

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

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

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

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

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

  • 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 декабря

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

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

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

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