У выборки данных из базы нет определенного порядка. Точнее порядок есть, но он логически не обоснован. По умолчанию база возвращает данные в том порядке, в котором ей удобнее. По счастливому стечению обстоятельств этот порядок может совпасть с желаемым, но рассчитывать на это нельзя.
Теоретически порядок может поменяться при следующем запросе, или когда количество данных в таблице изменится. Обновление версии базы данных тоже может повлиять на это.
В этом уроке мы разберем, как сортировать данные в базе в том порядке, который нам нужен. Для этого используется запрос 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-значений.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты