Подреждане, първите N, без повторения
Проблем
Топ 3 за витрината
Собственичката иска на началната страница да са трите най-скъпи продукта. Знаеш как да вземеш името и цената. Но в какъв ред идват редовете и как се взимат само три?
Идеята
ORDER BY
ORDER BY подрежда резултата. По подразбиране от малко към голямо:
DESC обръща реда, от голямо към малко:
Може да подредиш и по няколко колони: първо по първата, а при равенство по втората. Клиентите по град, а в един град по име:
Текстът се подрежда по азбучен ред, датите от вида 2026-10-19 по време.
По-точно, за любопитните
Без ORDER BY редът на редовете не е обещан. Често излиза по id, но това е случайност на начина, по който базата е прочела таблицата. След промяна в таблицата или с нов индекс редът може да се смени. Щом редът е важен за теб, пиши ORDER BY.
Идеята
LIMIT: само първите
LIMIT n връща първите n реда от резултата. Заедно с ORDER BY дава топ N:
LIMIT се изпълнява последен, след подреждането. Затова „трите най-скъпи“ е вярно. Без ORDER BY щяха да са три произволни продукта.
OFFSET прескача редове. Така се правят страници: втората страница от поръчките, по 10 на страница:
Пробвай
Новите клиенти
Покажи името и датата на регистрация на петимата най-нови клиенти, най-новият пръв.
Решение
SELECT name, joined_at FROM customers
ORDER BY joined_at DESC
LIMIT 5;ORDER BY joined_at DESC LIMIT 5. Тук проверката гледа и реда на редовете.
Идеята
DISTINCT: без повторения
От кои градове са клиентите? С SELECT city всеки град се повтаря толкова пъти, колкото клиенти има там. DISTINCT маха повторенията:
Шест града и NULL: Борис е без град, и тази липса също е отделен резултат.
Пробвай
Състоянията на поръчките
Покажи всички различни състояния на поръчките, по азбучен ред.
Решение
SELECT DISTINCT status FROM orders ORDER BY status;SELECT DISTINCT status FROM orders ORDER BY status. Пет състояния: от cancelled до shipped.
Упражнение
Евтините, които ги има
Покажи името, цената и наличността на петте най-евтини продукта, които са в наличност, най-евтиният пръв.
Решение
SELECT name, price, stock FROM products
WHERE stock > 0
ORDER BY price
LIMIT 5;WHERE stock > 0 ORDER BY price LIMIT 5. Редът на частите е важен: WHERE, после ORDER BY, накрая LIMIT. Изчерпаните продукти не влизат, дори да са по-евтини.
По-точно, за любопитните
Къде отиват NULL-ите при подреждане? В SQLite и MySQL при ORDER BY city те са първи, а в PostgreSQL и Oracle са последни. Ако е важно, кажи го изрично: ORDER BY city NULLS LAST. SQLite го разбира от версия 3.30.
Тест