Списъци, граници и шаблони
Проблем
Три града, три OR-а
Куриерската фирма за Североизтока и морето обслужва Варна, Бургас и Русе. Трябват ти клиентите от тези градове:
Работи, но при десет града условието става ред от OR-ове, в който лесно се пропуска нещо.
Идеята
IN: един от списъка
IN проверява дали стойността е в списък:
Същият резултат, а списъкът се чете наведнъж. NOT IN е обратното: всичко освен изброеното.
Идеята
BETWEEN: между две граници
BETWEEN a AND b значи „от a до b“, заедно с a и b:
Датите в базата са текст във вида 2026-03-31. Такъв текст се подрежда като датите, затова BETWEEN работи и за тях. Поръчките от първото тримесечие на 2026 г.:
По-точно, за любопитните
Ако датата има и час (2026-03-31 18:20), BETWEEN '2026-01-01' AND '2026-03-31' ще изпусне 31 март след полунощ, защото '2026-03-31 18:20' е след '2026-03-31'. Тогава по-сигурно е ordered_at >= '2026-01-01' AND ordered_at < '2026-04-01'.
Пробвай
Неприключените поръчки
Покажи номера, датата и състоянието на поръчките, които не са нито доставени (delivered), нито отказани (cancelled).
Решение
SELECT id, ordered_at, status FROM orders
WHERE status NOT IN ('delivered', 'cancelled');WHERE status NOT IN ('delivered', 'cancelled'). 32 поръчки чакат: нови, платени или изпратени.
Идеята
LIKE: по част от текста
LIKE сравнява с шаблон. В шаблона % значи „какъвто и да е текст, и празен“, а _ значи „точно един знак“.
'%хляб%' намира всяко име, в което някъде пише „хляб“. 'хляб%' би търсил имена, които започват с „хляб“, а '%хляб' такива, които свършват с него.
Виж го
Главни и малки букви
Кои продукти започват с „б“? Пусни:
Нищо. А „Бял хляб“, „Баница“ и „Банани“ са там. SQLite не различава главни и малки букви при LIKE, но само при латиницата. За него „Б“ и „б“ са два различни знака. Смени шаблона на 'Б%' и пусни пак.
По-точно, за любопитните
Различните бази правят различно. В PostgreSQL LIKE винаги различава главни и малки, а ILIKE не ги различава, и то за всяка азбука. В MySQL зависи от настройката за сравняване на текста (collation) и обикновено не ги различава. Ако търсенето трябва да работи за всяка азбука, в SQLite се ползва разширение (ICU) или се пази отделна колона с текста в малки букви.
Пробвай
Млечните
Покажи името и цената на продуктите, в чието име има „мляко“.
Решение
SELECT name, price FROM products WHERE name LIKE '%мляко%';WHERE name LIKE '%мляко%': прясното и киселото мляко.
Упражнение
Две задачи
1. Поръчките от лятото на 2026 г. (юни, юли, август): номер, клиент и дата.
Поръчките между 1 юни и 31 август 2026 г.:
Решение
SELECT id, customer_id, ordered_at FROM orders
WHERE ordered_at BETWEEN '2026-06-01' AND '2026-08-31';WHERE ordered_at BETWEEN '2026-06-01' AND '2026-08-31'. Става и с >= и <=.
2. Клиентите, чието име започва с „М“: име и град.
Клиентите с име, започващо с „М“:
Решение
SELECT name, city FROM customers WHERE name LIKE 'М%';WHERE name LIKE 'М%', с главно „М“. Мария и Мартин.
Тест