WHERE: условия отбора

WHERE: условия отбора

Во втором модуле вы освоили SELECT во всех его базовых формах: выбор колонок, псевдонимы, DISTINCT, вычисляемые выражения, форматирование. Все эти запросы объединяло одно: они возвращали все строки таблицы. На практике это редко нужно. Вам нужны заказы только за этот месяц, товары только в наличии, пользователи только с подпиской. Именно для этого существует клауза WHERE — фильтр, который ограничивает набор строк в результате.

Синтаксис WHERE

WHERE ставится после FROM и содержит условие — логическое выражение, которое применяется к каждой строке. Строки, для которых условие истинно (TRUE), попадают в результат. Остальные отбрасываются.

SELECT колонки
FROM   таблица
WHERE  условие;

Простой пример. Есть таблица employees (сотрудники):

id | name    | department   | salary
---+---------+--------------+--------
1  | Анна    | Разработка   | 90000
2  | Борис   | Менеджмент   | 110000
3  | Вера    | Разработка   | 85000
4  | Гриша   | Дизайн       | 75000
5  | Дина    | Разработка   | 95000

Получим только сотрудников из отдела «Разработка»:

SELECT name, salary
FROM   employees
WHERE  department = 'Разработка';

Результат:

name  | salary
------+--------
Анна  | 90000
Вера  | 85000
Дина  | 95000

Борис и Гриша отфильтрованы — их department не равен 'Разработка'.

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

В условии WHERE используются стандартные операторы сравнения:

ОператорСмыслПример
=равноdepartment = 'IT'
<> или !=не равноstatus <> 'deleted'
<меньшеsalary < 50000
>большеsalary > 100000
<=меньше или равноage <= 30
>=больше или равноscore >= 90

Обратите внимание: в SQL для проверки равенства используется один знак =, а не два == как во многих языках программирования. Это типичная путаница в начале.

Пример с числовым условием — сотрудники с зарплатой выше 90000:

SELECT name, department, salary
FROM   employees
WHERE  salary > 90000;

Результат:

name   | department  | salary
-------+-------------+--------
Борис  | Менеджмент  | 110000
Дина   | Разработка  | 95000

Проверь себя: напишите запрос, который вернёт сотрудников с зарплатой ровно 85000.

Условие со строкой: кавычки важны

Строковые значения в WHERE заключаются в одинарные кавычки:

WHERE department = 'Разработка'   -- правильно
WHERE department = "Разработка"   -- ошибка в PostgreSQL
WHERE department = Разработка     -- ошибка: ищет колонку с именем "Разработка"

PostgreSQL чувствителен к регистру в строках. 'Разработка' и 'разработка' — разные значения. Если данные в базе записаны с заглавной буквы, условие = 'разработка' ничего не вернёт.

WHERE с датами

Фильтрация по датам работает так же, как по числам. Даты записываются в одинарных кавычках в формате ISO: 'ГГГГ-ММ-ДД':

SELECT order_id, customer_id, created_at
FROM   orders
WHERE  created_at >= '2024-01-01';

Это вернёт все заказы с 1 января 2024 года и позже. PostgreSQL автоматически интерпретирует строку '2024-01-01' как дату, если тип колонки DATE или TIMESTAMP.

Фильтрация — это не удаление

Важно понять: WHERE не удаляет строки из таблицы. Он лишь ограничивает, какие строки войдут в результат конкретного запроса. Таблица на диске не изменяется. Следующий запрос без WHERE снова вернёт все строки:

SELECT * FROM employees;   -- все 5 строк, независимо от предыдущих запросов

Это базовое свойство SELECT — операция чтения, не изменения данных.

WHERE обрабатывается до SELECT

Помните из урока о структуре запроса: логический порядок выполнения — FROMWHERESELECT. Это означает, что WHERE работает с исходными именами колонок из таблицы, а не с псевдонимами, которые вы задали в SELECT.

Это типичная ошибка:

SELECT salary * 12 AS annual_salary
FROM   employees
WHERE  annual_salary > 1000000;  -- ошибка!

PostgreSQL ответит: ERROR: column "annual_salary" does not exist. В момент применения WHERE псевдоним annual_salary ещё не существует. Нужно повторить выражение:

SELECT salary * 12 AS annual_salary
FROM   employees
WHERE  salary * 12 > 1000000;   -- правильно

Это неудобно, но это стандарт SQL. В PostgreSQL есть CTE (WITH) для обхода этого ограничения, но до них мы доберёмся в модуле 7.

Пустой результат — это не ошибка

Если ни одна строка не удовлетворяет условию WHERE, запрос вернёт пустой результат:

SELECT * FROM employees WHERE department = 'Бухгалтерия';
-- (0 rows)

Это нормально. Пустой результат значит «таких данных нет», а не «что-то пошло не так». Если вы ожидали строки и не получили — проверьте значение в условии: возможно, опечатка или другой регистр.

WHERE с вычисляемыми выражениями

В условии WHERE можно использовать арифметику прямо над колонками:

SELECT name, salary
FROM   employees
WHERE  salary * 12 > 1200000;

Это возвращает сотрудников, чья годовая зарплата (ежемесячная × 12) превышает 1 200 000 рублей. СУБД вычислит salary * 12 для каждой строки и проверит условие.

Пример из реального приложения

В интернет-магазине нужно отобразить только товары, которые есть в наличии:

SELECT name, price, stock
FROM   products
WHERE  stock > 0;

Или только товары в заданном ценовом диапазоне — до 5000 рублей:

SELECT name, price
FROM   products
WHERE  price <= 5000;

В следующем уроке вы научитесь комбинировать несколько условий через AND, OR, NOT — это откроет возможности для сложной фильтрации.

Проверь себя: вы хотите найти товары дешевле 1000 рублей. Какой оператор использовать в WHERE?

WHERE и NULL

Одна из тонкостей SQL — поведение WHERE с NULL. NULL означает «значение неизвестно». Сравнение NULL = NULL не возвращает TRUE — оно возвращает NULL (потому что неизвестно, равны ли два неизвестных значения). Это значит: условие WHERE column = NULL никогда не вернёт строки с NULL.

Для проверки на NULL используются специальные операторы IS NULL и IS NOT NULL:

SELECT name, phone
FROM   customers
WHERE  phone IS NULL;    -- клиенты без телефона
SELECT name, phone
FROM   customers
WHERE  phone IS NOT NULL;  -- клиенты с заполненным телефоном

Детально тему NULL мы разберём в модуле 4. Пока запомните: = NULL не работает, нужен IS NULL.

Проверка условия вручную

Хороший способ отладить условие WHERE — представить себя на месте СУБД и пройтись по каждой строке:

Таблица employees:

namedepartmentsalary
АннаРазработка90000
БорисМенеджмент110000
ВераРазработка85000

Условие: WHERE salary >= 90000

  • Анна: 90000 >= 90000TRUE → попадает
  • Борис: 110000 >= 90000TRUE → попадает
  • Вера: 85000 >= 90000FALSE → отфильтрована

Результат — Анна и Борис. Вот так буквально работает WHERE: проверяет условие для каждой строки и берёт только те, где результат TRUE.

Несколько WHERE в одном сеансе

В одном сеансе можно выполнять сколько угодно запросов с разными условиями WHERE. Каждый запрос независим:

SELECT * FROM employees WHERE department = 'Разработка';
SELECT * FROM employees WHERE salary > 100000;
SELECT * FROM employees WHERE department = 'Дизайн';

Три запроса, три отдельных результата. База данных не «помнит» предыдущий запрос при выполнении следующего. Это важно понять: SQL-запросы — stateless, без состояния между ними.

Краткий итог

  • WHERE фильтрует строки: только строки, где условие TRUE, попадают в результат
  • Синтаксис: SELECT ... FROM ... WHERE условие;
  • Операторы сравнения: =, <>, <, >, <=, >=
  • Для равенства в SQL используется =, не ==
  • Строки в условии — одинарные кавычки; регистр важен
  • WHERE применяется до SELECT, поэтому псевдонимы из SELECT недоступны в WHERE
  • Пустой результат — нормально, не ошибка

Что дальше

Вы умеете фильтровать по одному условию. Но часто нужно несколько условий одновременно: «сотрудники из Разработки с зарплатой выше 90000». В следующем уроке разберём логические операторы AND, OR и NOT, которые позволяют строить сложные составные условия.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике