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
Помните из урока о структуре запроса: логический порядок выполнения — FROM → WHERE → SELECT. Это означает, что 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:
| name | department | salary |
|---|---|---|
| Анна | Разработка | 90000 |
| Борис | Менеджмент | 110000 |
| Вера | Разработка | 85000 |
Условие: WHERE salary >= 90000
- Анна:
90000 >= 90000→TRUE→ попадает - Борис:
110000 >= 90000→TRUE→ попадает - Вера:
85000 >= 90000→FALSE→ отфильтрована
Результат — Анна и Борис. Вот так буквально работает 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, которые позволяют строить сложные составные условия.