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

Сортировка (ORDER) Основы реляционных баз данных

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

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

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

Общая схема запроса на сортировку

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

Сортировка данных в таблице

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

SELECT * FROM users ORDER BY username;

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

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

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

SELECT * FROM users ORDER BY created_at;

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

Управление порядком сортировки

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

  • В прямом порядке
  • В обратном порядке
  • По нескольким полям

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

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

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

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

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

SELECT * FROM users ORDER BY created_at DESC;

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

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

SELECT * FROM users ORDER BY first_name, created_at;

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

SELECT * FROM users ORDER BY first_name DESC, created_at DESC;
SELECT first_name, created_at FROM users ORDER BY first_name ASC, created_at DESC;
first_name created_at
Maryse 2019-03-04 13:03:01
Maryse 2018-12-06 10:24:04
Maryse 2018-12-06 10:09:48
Sunny 2019-03-04 13:04:28
Sunny 2018-12-06 06:19:30
Tanya 2018-12-06 07:12:01
Tanya 2018-12-05 23:55:15

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

Еще у сортировки есть один тонкий момент, который связан с полями NULL.

Сортировка NULL-значений

Если поле содержит NULL, и ничего не указано дополнительно, то считается, что NULL больше любого значения. Получается, что при прямой сортировке они окажутся в конце выборки, а при обратной — в начале. Этим поведением можно управлять с помощью фразы NULLS FIRST:

-- сортируем по возрастанию даты (поле "created_at")
-- поведение по умолчанию:
-- поля, которые содержат NULL, идут последними
SELECT * FROM users ORDER BY created_at ASC;

-- сортируем по возрастанию даты (поле "created_at")
-- поля, которые содержат NULL, идут первыми
SELECT * FROM users ORDER BY created_at ASC NULLS FIRST;

и NULLS LAST:

-- сортируем по убыванию даты (поле "created_at")
-- поведение по умолчанию:
-- поля, которые содержат NULL, идут первыми
SELECT * FROM users ORDER BY created_at DESC;

-- сортируем по убыванию даты (поле "created_at")
-- поля, которые содержат NULL, идут последними
SELECT * FROM users ORDER BY created_at DESC NULLS LAST;

Выводы

В этом уроке мы узнали, что данные в выборке можно сортировать в определенном порядке с помощью запроса ORDER. Он позволяет сортировать данные от меньшего к большему, в обратном порядке и сразу по нескольким полям. Также с его помощью можно управлять сортировкой NULL-значений.


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

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

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

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

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

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

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

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

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

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

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

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

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