Перейти к содержанию
Educora
Начальный15 мин3 / 22

WHERE: фильтрация строк

Выбирай с помощью WHERE только нужные строки: операторы сравнения, AND, OR, NOT и роль скобок.

Проверь себя
В этом уроке ты узнаешь
  • Фильтровать строки по условию с помощью WHERE
  • Применять операторы сравнения к числам, тексту и датам
  • Строить сложные условия с AND, OR, NOT и правильно расставлять скобки

Когда в интернет-магазине ты выбираешь фильтры «цена до 50», «только электроника», «есть в наличии», сайт незаметно отправляет запрос в базу данных. Каждый фильтр в SQL — это условие, а условия записывают в части WHERE. В этом уроке ты научишься отбирать из тысяч строк только нужные.

Как работает WHERE

Часть WHERE пишется после FROM. СУБД проверяет условие для каждой строки таблицы: если оно истинно, строка попадает в результат, если ложно — отбрасывается. Текстовые значения пишут в одинарных кавычках, числа — без кавычек.

SQL
SELECT first_name, last_name, age
FROM students
WHERE city = 'Bakı'
ORDER BY id;
▸ Ожидаемый результат
first_name | last_name | age
Aysel | Məmmədova | 15
Leyla | Hüseynova | 14
Rəşad | Kərimov | 16
Kamran | Həsənov | 15
Ученики, которые живут в Баку.

Операторы сравнения

ОператорЗначениеПример
=равноgrade = 11
<> , !=не равноsubject <> 'Math'
<меньшеprice < 50
>большеage > 15
<=меньше или равноstock <= 20
>=больше или равноscore >= 90
<> — оператор стандарта SQL; != тоже работает во всех популярных СУБД.
SQL
SELECT name, price
FROM products
WHERE price < 50
ORDER BY price;
▸ Ожидаемый результат
name | price
Notebook | 3.2
Pen set | 7.9
Water bottle | 12
Desk lamp | 34.99
Chess set | 42

Сравнение работает и для текста, и для дат. Для текста = сравнивает символ за символом, поэтому 'bakı' и 'Bakı' — разные значения. В нашей учебной базе даты хранятся как текст в формате YYYY-MM-DD: в этом формате алфавитный порядок совпадает с календарным. Поэтому заказы за апрель–июнь можно найти обычными >= и <.

SQL
SELECT id, product_id, quantity, order_date
FROM orders
WHERE order_date >= '2025-04-01'
  AND order_date <  '2025-07-01'
ORDER BY id;
▸ Ожидаемый результат
id | product_id | quantity | order_date
7 | 2 | 1 | 2025-04-09
8 | 8 | 3 | 2025-04-09
9 | 10 | 1 | 2025-05-21
10 | 5 | 4 | 2025-06-12
11 | 3 | 1 | 2025-06-30

Логические операторы: AND, OR, NOT

  • A AND B — должны выполняться оба условия. Каждый новый AND сужает результат.
  • A OR B — должно выполняться хотя бы одно условие. Каждый новый OR расширяет результат.
  • NOT A — меняет условие на противоположное: истина становится ложью, и наоборот.
SQL
SELECT first_name, age, city
FROM students
WHERE city = 'Bakı' AND age >= 15
ORDER BY id;
▸ Ожидаемый результат
first_name | age | city
Aysel | 15 | Bakı
Rəşad | 16 | Bakı
Kamran | 15 | Bakı
AND: ученики из Баку, которым при этом не меньше 15 лет.
SQL
SELECT name, category, price
FROM products
WHERE category = 'Games' OR price > 800
ORDER BY id;
▸ Ожидаемый результат
name | category | price
Laptop | Electronics | 1450
Smartphone | Electronics | 899.99
Chess set | Games | 42
OR: товары из категории игр или дороже 800.
SQL
SELECT first_name, last_name, age, grade
FROM students
WHERE age > 15 AND NOT city = 'Bakı'
ORDER BY id;
▸ Ожидаемый результат
first_name | last_name | age | grade
Murad | Əliyev | 16 | 10
Elvin | Quliyev | 17 | 11
Tural | İsmayılov | 17 | 11
Səbinə | Nəsirova | 16 | 10
Fidan | Cəfərova | 17 | 11
NOT: ученики старше 15 лет, которые живут не в Баку.

Приоритет операторов и скобки

Как в математике умножение выполняется раньше сложения, так и в SQL AND вычисляется раньше OR. Допустим, нам нужны электроника и аксессуары дешевле 150. Без скобок СУБД понимает условие совсем иначе: «вся электроника или аксессуары дешевле 150».

SQL
-- without parentheses: AND is applied first
SELECT name, category, price
FROM products
WHERE category = 'Electronics'
   OR category = 'Accessories' AND price < 150
ORDER BY id;
▸ Ожидаемый результат
name | category | price
Laptop | Electronics | 1450
Smartphone | Electronics | 899.99
Headphones | Electronics | 120.5
Backpack | Accessories | 55
Water bottle | Accessories | 12
Monitor | Electronics | 310
Ноутбук стоит 1450, но всё равно попал в результат — условие составлено неверно.
SQL
-- with parentheses: OR is applied first
SELECT name, category, price
FROM products
WHERE (category = 'Electronics' OR category = 'Accessories')
  AND price < 150
ORDER BY id;
▸ Ожидаемый результат
name | category | price
Headphones | Electronics | 120.5
Backpack | Accessories | 55
Water bottle | Accessories | 12
Пример задачи

Найди товары, у которых стоимость всего запаса (price * stock) больше 3000.

Показать решение
В условии можно использовать выражения так же, как столбцы: WHERE price * stock > 3000.
Результат: Laptop, Smartphone, Headphones и Backpack.
Обрати внимание: выражение повторяется в WHERE, потому что СУБД выполняет WHERE раньше SELECT, и псевдонимов ещё не существует.
SQL
SELECT name, price, stock
FROM products
WHERE price * stock > 3000
ORDER BY id;
▸ Ожидаемый результат
name | price | stock
Laptop | 1450 | 8
Smartphone | 899.99 | 15
Headphones | 120.5 | 40
Backpack | 55 | 60
Задание

Выбери из students имя (first_name) и возраст (age) учеников из Баку (Bakı). Отсортируй по возрасту, а при равном возрасте — по имени.

Задание · SQL
SELECT first_name, age
FROM students
-- add WHERE and ORDER BY
▸ Ожидаемый результат
first_name | age
Leyla | 14
Aysel | 15
Kamran | 15
Rəşad | 16

Главное

  • WHERE проверяет условие для каждой строки и оставляет только подходящие.
  • Операторы сравнения: =, <> (!=), <, >, <=, >=.
  • Текст и даты пишут в одинарных кавычках; даты в формате YYYY-MM-DD можно сравнивать обычными операторами.
  • AND сужает результат, OR расширяет, а NOT меняет условие на противоположное.
  • AND вычисляется раньше OR — при их сочетании ставь скобки.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Какой оператор в стандарте SQL означает «не равно»?