Урок 2 из 8 · 20 мин · обновлено
Отбор строк: WHERE, AND, OR, IN, BETWEEN и LIKE
Как оставить в результате только нужные строки: условие WHERE, знаки сравнения, несколько условий через AND и OR, скобки, списки IN, диапазоны BETWEEN и поиск по образцу LIKE.
WHERE: только нужные строки
В прошлом уроке запросы возвращали всю таблицу. Но обычно нужна часть: дорогие книги, заказы за июнь, клиенты из одного города. Для этого после FROM пишут WHERE — условие отбора:
SELECT title, price FROM books WHERE price > 600;
title | price
Краткая история времени | 720
Гарри Поттер и философский камень | 650
Sapiens | 890
Чистый код | 1200
База проверяет условие для каждой строки и оставляет только те, где оно верно. Знаки сравнения привычные:
| Знак | Значение |
|---|---|
= |
равно |
<> |
не равно (во многих базах работает и !=) |
>, < |
больше, меньше |
>=, <= |
больше или равно, меньше или равно |
Текст и даты берут в одинарные кавычки, числа пишут как есть:
SELECT title, author FROM books WHERE genre = 'роман';
title | author
Мастер и Маргарита | Булгаков
Преступление и наказание | Достоевский
Идиот | Достоевский
Даты в нашей базе записаны как текст в виде '2026-06-14': год, месяц, день. В таком виде их можно сравнивать знаками > и < — более поздняя дата всегда окажется «больше».
Несколько условий: AND, OR, NOT
Условия соединяют словами:
- AND — должны выполняться оба. Каждое новое условие сужает отбор.
- OR — достаточно одного. Отбор становится шире.
- NOT — переворачивает условие:
NOT genre = 'роман'— всё, кроме романов.
SELECT title, price FROM books WHERE genre = 'роман' AND price < 500;
title | price
Преступление и наказание | 450
Идиот | 480
Здесь есть ловушка. AND выполняется раньше OR, как умножение раньше сложения. Хотим романы и научные книги дороже 800 рублей и пишем:
SELECT title, genre, price FROM books
WHERE genre = 'роман' OR genre = 'наука' AND price > 800;
title | genre | price
Мастер и Маргарита | роман | 590
Преступление и наказание | роман | 450
Sapiens | наука | 890
Идиот | роман | 480
Романы попали все, дешёвые тоже: база прочитала условие как «роман ИЛИ (наука И дороже 800)». Скобки ставят смысл на место:
SELECT title, genre, price FROM books
WHERE (genre = 'роман' OR genre = 'наука') AND price > 800;
title | genre | price
Sapiens | наука | 890
Правило простое: если в условии встречаются и AND, и OR, ставьте скобки — даже если кажется, что и так понятно.
Списки и диапазоны: IN и BETWEEN
Перечислять варианты через OR долго. Для списка есть IN:
SELECT title, genre FROM books WHERE genre IN ('наука', 'IT');
title | genre
Краткая история времени | наука
Sapiens | наука
Чистый код | IT
Для диапазона — BETWEEN. Обе границы входят в отбор:
SELECT title, price FROM books WHERE price BETWEEN 500 AND 700;
title | price
Мастер и Маргарита | 590
Гарри Поттер и философский камень | 650
Хоббит | 540
Поиск по образцу: LIKE
Когда точное значение неизвестно, помогает LIKE. В образце работают два знака:
%— любое количество любых символов, в том числе ни одного;_— ровно один любой символ.
SELECT title, author FROM books WHERE author LIKE 'Д%';
title | author
Преступление и наказание | Достоевский
Идиот | Достоевский
Ещё примеры: '%история%' — содержит слово «история», '%ов' — заканчивается на «ов», '_оббит' — шесть букв, последние пять «оббит».
Учитывает ли LIKE заглавные буквы, зависит от базы. В PostgreSQL учитывает, а для поиска без учёта регистра там есть ILIKE. В SQLite без учёта регистра сравниваются только латинские буквы, русские — с учётом. Поэтому образец пишите так, как слово записано в данных.
Попробуйте сами. Ответьте запросами на два вопроса. Какие заказы со статусом «доставлен» сделаны в июне 2026 года — покажите номер, дату и сумму. Какие клиенты живут в Москве или Казани?
Решение
Доставленные заказы за июнь: условие на статус и на дату через AND.
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:
SELECT name, city FROM customers WHERE city IN ('Москва', 'Казань');
name | city
Анна | Москва
Борис | Казань
Вера | Москва
Егор | Казань
Дины в результате нет: город у неё не заполнен, и ни под одно значение из списка она не подходит.
Мини-тест: проверьте себя
Закрепите урок: несколько вопросов, разбор ответов — в конце.
-
Как отобрать книги жанра «наука»?
Текст в условии берут в одинарные кавычки. Без кавычек база решит, что наука — это название столбца, и выдаст ошибку.
-
Какие цены подойдут под условие price BETWEEN 500 AND 700?
BETWEEN включает обе границы: подойдут и 500, и 700, и всё между ними.
-
Что найдёт условие title LIKE '%история%'?
Знак % с обеих сторон означает «сколько угодно символов до и после», поэтому подойдёт любое название, где встречается «история».
-
Почему условие genre = 'роман' OR genre = 'наука' AND price > 800 работает не так, как кажется?
AND связывает сильнее, чем OR. Чтобы цена ограничивала оба жанра, жанры берут в скобки: (genre = 'роман' OR genre = 'наука') AND price > 800.
-
Какой запрос покажет заказы со статусом «доставлен» или «в пути»?
IN проверяет, входит ли значение в список. Через AND условие не выполнится никогда: у заказа не может быть двух статусов сразу.