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