Урок 2 из 8 · 20 мин · обновлено

Отбор строк: WHERE, AND, OR, IN, BETWEEN и LIKE

Как оставить в результате только нужные строки: условие WHERE, знаки сравнения, несколько условий через AND и OR, скобки, списки IN, диапазоны BETWEEN и поиск по образцу LIKE.

WHERE: только нужные строки

В прошлом уроке запросы возвращали всю таблицу. Но обычно нужна часть: дорогие книги, заказы за июнь, клиенты из одного города. Для этого после FROM пишут WHERE — условие отбора:

SQL
SELECT title, price FROM books WHERE price > 600;
Результат
title                             | price
Краткая история времени           | 720
Гарри Поттер и философский камень | 650
Sapiens                           | 890
Чистый код                        | 1200

База проверяет условие для каждой строки и оставляет только те, где оно верно. Знаки сравнения привычные:

Знак Значение
= равно
<> не равно (во многих базах работает и !=)
>, < больше, меньше
>=, <= больше или равно, меньше или равно

Текст и даты берут в одинарные кавычки, числа пишут как есть:

SQL
SELECT title, author FROM books WHERE genre = 'роман';
Результат
title                    | author
Мастер и Маргарита       | Булгаков
Преступление и наказание | Достоевский
Идиот                    | Достоевский

Даты в нашей базе записаны как текст в виде '2026-06-14': год, месяц, день. В таком виде их можно сравнивать знаками > и < — более поздняя дата всегда окажется «больше».

Несколько условий: AND, OR, NOT

Условия соединяют словами:

  • AND — должны выполняться оба. Каждое новое условие сужает отбор.
  • OR — достаточно одного. Отбор становится шире.
  • NOT — переворачивает условие: NOT genre = 'роман' — всё, кроме романов.
SQL
SELECT title, price FROM books WHERE genre = 'роман' AND price < 500;
Результат
title                    | price
Преступление и наказание | 450
Идиот                    | 480

Здесь есть ловушка. AND выполняется раньше OR, как умножение раньше сложения. Хотим романы и научные книги дороже 800 рублей и пишем:

SQL
SELECT title, genre, price FROM books
WHERE genre = 'роман' OR genre = 'наука' AND price > 800;
Результат
title                    | genre | price
Мастер и Маргарита       | роман | 590
Преступление и наказание | роман | 450
Sapiens                  | наука | 890
Идиот                    | роман | 480

Романы попали все, дешёвые тоже: база прочитала условие как «роман ИЛИ (наука И дороже 800)». Скобки ставят смысл на место:

SQL
SELECT title, genre, price FROM books
WHERE (genre = 'роман' OR genre = 'наука') AND price > 800;
Результат
title   | genre | price
Sapiens | наука | 890

Правило простое: если в условии встречаются и AND, и OR, ставьте скобки — даже если кажется, что и так понятно.

Списки и диапазоны: IN и BETWEEN

Перечислять варианты через OR долго. Для списка есть IN:

SQL
SELECT title, genre FROM books WHERE genre IN ('наука', 'IT');
Результат
title                   | genre
Краткая история времени | наука
Sapiens                 | наука
Чистый код              | IT

Для диапазона — BETWEEN. Обе границы входят в отбор:

SQL
SELECT title, price FROM books WHERE price BETWEEN 500 AND 700;
Результат
title                             | price
Мастер и Маргарита                | 590
Гарри Поттер и философский камень | 650
Хоббит                            | 540

Поиск по образцу: LIKE

Когда точное значение неизвестно, помогает LIKE. В образце работают два знака:

  • % — любое количество любых символов, в том числе ни одного;
  • _ — ровно один любой символ.
SQL
SELECT title, author FROM books WHERE author LIKE 'Д%';
Результат
title                    | author
Преступление и наказание | Достоевский
Идиот                    | Достоевский

Ещё примеры: '%история%' — содержит слово «история», '%ов' — заканчивается на «ов», '_оббит' — шесть букв, последние пять «оббит».

Учитывает ли LIKE заглавные буквы, зависит от базы. В PostgreSQL учитывает, а для поиска без учёта регистра там есть ILIKE. В SQLite без учёта регистра сравниваются только латинские буквы, русские — с учётом. Поэтому образец пишите так, как слово записано в данных.

Попробуйте сами. Ответьте запросами на два вопроса. Какие заказы со статусом «доставлен» сделаны в июне 2026 года — покажите номер, дату и сумму. Какие клиенты живут в Москве или Казани?

Решение

Доставленные заказы за июнь: условие на статус и на дату через AND.

SQL
SELECT id, order_date, amount FROM orders
WHERE status = 'доставлен' AND order_date >= '2026-06-01';
Результат
id | order_date | amount
4  | 2026-06-02 | 650
6  | 2026-06-14 | 450
9  | 2026-06-28 | 650

Заказы в базе только за май и июнь, поэтому верхнюю границу можно не писать. В настоящей базе добавьте её: AND order_date < '2026-07-01'.

Клиенты из двух городов — список через IN:

SQL
SELECT name, city FROM customers WHERE city IN ('Москва', 'Казань');
Результат
name  | city
Анна  | Москва
Борис | Казань
Вера  | Москва
Егор  | Казань

Дины в результате нет: город у неё не заполнен, и ни под одно значение из списка она не подходит.

Мини-тест: проверьте себя

Закрепите урок: несколько вопросов, разбор ответов — в конце.

  1. Как отобрать книги жанра «наука»?

  2. Какие цены подойдут под условие price BETWEEN 500 AND 700?

  3. Что найдёт условие title LIKE '%история%'?

  4. Почему условие genre = 'роман' OR genre = 'наука' AND price > 800 работает не так, как кажется?

  5. Какой запрос покажет заказы со статусом «доставлен» или «в пути»?