Как отсортировать результат запроса по возрастанию и убыванию (ORDER BY)?
Вывожу список товаров, но они идут в каком-то случайном порядке. Как отсортировать результат SQL-запроса по цене — сначала по возрастанию, потом по убыванию? Где вообще писать сортировку?
2 ответа
Сортировка задаётся через ORDER BY в самом конце запроса:
SELECT name, price
FROM products
ORDER BY price ASC;
ASC— по возрастанию (от меньшего к большему). Это значение по умолчанию, его можно не писать.DESC— по убыванию (от большего к меньшему).
Чтобы дорогие товары были сверху:
SELECT name, price
FROM products
ORDER BY price DESC;
Можно сортировать по нескольким столбцам — они применяются по очереди. Сначала по категории, а внутри категории по цене вниз:
SELECT name, category, price
FROM products
ORDER BY category ASC, price DESC;
Частая путаница: ORDER BY всегда идёт после WHERE и GROUP BY, но перед LIMIT. Если поставить его не туда, СУБД выдаст ошибку синтаксиса.
Ещё можно сортировать по номеру столбца (ORDER BY 2 — по второму столбцу из SELECT), но это считается плохим стилем: при изменении списка полей сортировка «поедет».
Полезно помнить, что текст сортируется по алфавиту (точнее, по правилам сравнения — collation), а не по смыслу. Поэтому строка '10' окажется раньше '2', если столбец текстовый, потому что сравнение идёт посимвольно: '1' < '2'. Если нужна числовая сортировка — храните числа в числовом типе или приводите тип явно через CAST.