ORDER BY - это как уборка в шкафу. Вещи можно разложить по цвету, по размеру или просто свалить все в кучу
ORDER BY — штука вроде бы простая («отсортируй строки»), но там есть много нюансов, про которые мы просто не помним или не пользуемся.
Вообще мы даже своими смартфонами не всегда (да, что уж - никогда) не пользуемся на полную мощность.
В своем канале На связи: SQL рассказываю про некоторые забытые нюансы языка SQL, особенности и необходимую теорию, чтобы любой начинающий мог свободно познакомиться с этим языком и применить его в дальнейшем для своих задач. Канал создан недавно, с 0 подписчиков, но уже активно наполняется контентом. Подписывайся!
Блок с ORDER BY предназначен для сортировки результата выборки.
По умолчанию сортировка ASC (по возрастанию). Можно явно писать:
ORDER BY age ASC -- от младших к старшим
ORDER BY age DESC -- от старших к младшим
2. Можно сортировать сразу по нескольким столбцам:
ORDER BY country, city
Сначала сортируются страны, внутри них — города.
3. Можно писать не имя, а номер колонки в SELECT:
SELECT name, age
FROM users
ORDER BY 2 DESC; -- сортируем по age
Но это считается «плохим тоном» — лучше явно указывать названия. Хотя мне очень нравится это использовать, особенно, когда в селекте не просто имя столбца, а вычисление.
4. NULL в ORDER BY требует особого внимание.
NULL в разных БД обрабатывается по-разному.
В PostgreSQL:
ASC → NULL идут в конце
DESC → NULL идут в начале
можно явно писать:
ORDER BY age ASC NULLS FIRST;
ORDER BY age DESC NULLS LAST;
В MySQL и SQL Server правила отличаются:
в MySQL NULL всегда считаются «меньше всего» (т.е. идут первыми в ASC).
в SQL Server можно управлять через ISNULL()/COALESCE().
В MySQL и SQL Server нельзя использовать NULLS FIRST или NULLS LAST при сортировке,
Для SQL Server используем:
ORDER BY ISNULL(age, 9999) ASC;
ORDER BY COALESCE(age, 9999) ASC;
Здесь NULL мы заменяем на большое число (9999), и оно уходит в конец сортировки по возрастанию.
А если хотим NULL в начало — ставим что-то маленькое, например -1.
Для MySQL есть поведение по умолчанию:
При ASC → NULL идут первые
При DESC → NULL идут последние
А если нужно наоборот, то делаем хитрость с IS NULL:
ORDER BY age IS NULL, age ASC;
Здесь age IS NULL вернёт 1 для NULL и 0 для обычных значений.
SQL сначала отсортирует по этому условию (0 → 1), а потом уже по age.
5. Можно сортировать не только по полям, но и по функциям.
ORDER BY LENGTH(name) DESC;
ORDER BY purchase_amount * discount;
6. Случайная сортировка - имеет место быть. Но очень "дорога" в использовании на больших объемах.
-- PostgreSQL / SQLite
ORDER BY RANDOM()-- MySQL
ORDER BY RAND()
Часто случайная сортировка используется при тестировании на небольших объемах.
- хотим показать пользователю случайный товар в магазине
- хотим проверить, как работает приложение, не завися от конкретного порядка записей
- рекомендательные системы: в выдачу добавляем случайный товар, чтобы не зацикливать пользователя только на "популярных" товарах.
- игры или викторины: рандомная выдача вопросов.
7. Есть еще такое понятие как COLLATION (сравнение строк).
ORDER BY учитывает локаль (collation). Поэтому, например, русские буквы могут сортироваться по-разному в разных СУБД:
А может идти перед а, или наоборот.
Можно явно указать сортировку:
ORDER BY name COLLATE "C" -- по байтовому значению
ORDER BY name COLLATE "ru_RU" -- по русскому алфавиту
Представь, что у тебя есть список имён:
['Елена', 'елена', 'Жанна', 'Анна']
Когда ты пишешь в SQL:
SELECT * FROM users ORDER BY name;
база должна решить:
считать ли «Елена» и «елена» одинаковыми?
что идёт раньше: «Ж» или «А»?
как сравнивать буквы с диакритикой: «é» vs «e»?
Вот именно на эти вопросы отвечает collation.
То есть COLLATION — это как правило сортировки в библиотеке: от него зависит, где именно окажется твоя книга.
То есть, ORDER BY — это не просто «отсортировать», а ещё и про то:
куда денутся NULL
как сортируются строки (с учётом локали)
можно ли сортировать по выражениям или случайно
В моем ТГ канале На связи: SQL я знакомлю новичков с языком SQL и хочу, чтобы те, кто желает познакомиться с анализом данных с легкостью шли в это направление. Присоединяйся!