Сортировка с ORDER BY
На этом уроке вы научитесь упорядочивать строки результата, показывать только некоторые из них и вычислять новые столбцы. До сих пор строки приходили в том порядке, в каком их отдавала база данных. Но магазину обычно нужен определённый порядок: сначала самые дешёвые игры, сверху самые новые заказы, клиенты по алфавиту. Для этого и нужен ORDER BY. Он стоит в конце запроса, после FROM, а за ним идёт столбец, по которому нужно сортировать:
SELECT title, price
FROM games
ORDER BY price;| title | price |
|---|---|
| Cube Logic | 5 |
| Word Quest | 10 |
| Pixel Racer | 15 |
| Ocean Deep | 15 |
| … | … |
Строки отсортированы по возрастанию: от наименьшего значения к наибольшему. Что значит «наименьшее», зависит от того, что хранится в столбце:
- Числа сортируются по значению: 5, 10, 15, 20.
- Текст сортируется по алфавиту, буква за буквой:
Emma Clarkидёт передGrace Hall, аLeo Walker— передLiam Turner. SQLite сравнивает символы по их кодам, а в них все заглавные буквы стоят раньше всех строчных. Поэтому жанрRPGстоит раньшеRacing:P— заглавная буква, аa— нет. - Даты хранятся как текст в формате
YYYY-MM-DD: год, месяц и день, например2024-03-14, причём месяц и день всегда из двух цифр. Текст сравнивается слева направо, поэтому сначала решает год, потом месяц, потом день, и алфавитный порядок совпадает с порядком во времени. Именно поэтому базы данных записывают даты так:14.03.2024отсортировалось бы неправильно. NULLв SQLite считается меньше любого значения, поэтому строки сNULLидут первыми. (В некоторых других базах данных, например в PostgreSQL, они идут последними.)
Без ORDER BY порядок строк не гарантирован. Обычно SQLite отдаёт их в порядке номеров, но не всегда. Выполните SELECT email FROM customers; — адреса почты придут в алфавитном порядке. Дело в том, что SQLite хранит адреса ещё и в отдельном отсортированном списке и по нему проверяет, что у двух клиентов нет одинакового адреса. (Он называется индексом, а об индексах вы узнаете в конце курса.) Когда вы просите только адреса, прочитать этот короткий список быстрее, чем всю таблицу. Попросите и имена (SELECT name, email FROM customers;) — и строки снова пойдут в порядке номеров. База данных всегда выбирает способ, который считает самым быстрым, а он может меняться в зависимости от запроса, от данных или от другой базы данных. Поэтому всякий раз, когда порядок важен, пишите ORDER BY.
Типичная ошибка — ORDER BY не на своём месте. Части запроса идут в строгом порядке: сначала SELECT, потом FROM, а ORDER BY в конце. Если их перепутать, запрос закончится ошибкой:
SELECT title, price
ORDER BY price
FROM games;Error on line 1: near "FROM": syntax errorЗадание
- 1
Покажите имя и город каждого клиента, отсортировав по имени. Результат начинается так:
name city Ava Green NULL Emma Clark London Grace Hall London … … - 2
Ниже добавьте запрос, который показывает название и дату выхода (
released) каждой игры, начиная с самой старой. У двух ещё не вышедших игр тамNULL, поэтому они идут первыми:title released Robot Rebellion NULL Mystery Manor NULL Cube Logic 2020-02-11 Castle Siege 2021-05-20 … …