
Оператор WHERE в SQL фильтрует строки таблицы по заданным условиям. Он применяется после указания таблицы в SELECT, UPDATE или DELETE, но до группировки или сортировки данных. Использование WHERE сокращает объем обрабатываемых данных и ускоряет выполнение запросов.
Условия в WHERE могут включать сравнения (=, <>, >, <, >=, <=), проверку диапазона (BETWEEN), совпадение с шаблоном (LIKE), а также проверку в списке значений (IN) или на NULL (IS NULL). Пример: SELECT * FROM orders WHERE order_date > ‘2025-01-01’ AND status = ‘completed’; – вернет только завершенные заказы с датой после 1 января 2025 года.
Сложные условия объединяются через AND и OR, при этом скобки позволяют управлять приоритетом. Например, SELECT * FROM users WHERE (age >= 18 AND country = ‘RU’) OR vip_status = 1; – выбирает совершеннолетних пользователей из России или всех пользователей с VIP-статусом.
Эффективное использование WHERE важно для производительности: индексы на столбцах, участвующих в условиях, сокращают время поиска, а простые выражения и фильтры на ранних этапах уменьшают нагрузку на сервер. Понимание синтаксиса и логики WHERE позволяет строить точные и быстрые запросы к базе данных.
Фильтрация строк по конкретным значениям
Оператор WHERE позволяет выбирать только те строки таблицы, которые соответствуют определённым значениям в колонках. Это критически важно для точного извлечения данных и уменьшения объёма обрабатываемой информации.
Примеры фильтрации по конкретным значениям:
- Фильтрация по числу:
SELECT * FROM products WHERE price = 150;Возвращает все товары с ценой ровно 150 единиц.
- Фильтрация по строке:
SELECT * FROM customers WHERE country = 'Россия';Показывает всех клиентов из России. Обязательно использовать одинарные кавычки для строк.
- Фильтрация по дате:
SELECT * FROM orders WHERE order_date = '2025-01-01';Отбирает заказы, сделанные строго 1 января 2025 года.
- Фильтрация с использованием нескольких значений через
IN:SELECT * FROM employees WHERE department IN ('IT', 'HR');Выбирает сотрудников из отделов IT и HR, упрощая запись нескольких условий.
Рекомендации при фильтрации по конкретным значениям:
- Для числовых полей используйте точные значения без кавычек.
- Для текстовых и дата-полей используйте одинарные кавычки и точный формат даты.
- При проверке на несколько вариантов применяйте
IN, чтобы избежать длинных конструкций сOR. - Следите за регистром текста: в большинстве СУБД сравнение строк чувствительно к регистру.
Фильтрация по конкретным значениям повышает производительность запросов и упрощает анализ данных, позволяя сосредоточиться только на нужной информации.
Использование операторов сравнения в WHERE

Оператор = используется для точного совпадения значения колонки с заданным. Например, SELECT * FROM employees WHERE department_id = 3; вернет все строки, где отдел равен 3.
Оператор <> или != исключает определенные значения. Пример: SELECT * FROM products WHERE price <> 100; выберет все товары, цена которых не равна 100.
Операторы >, <, >=, <= применяются для диапазонных фильтров. Например, SELECT * FROM orders WHERE order_date > ‘2025-01-01’; покажет заказы после 1 января 2025 года.
Для проверки диапазонов удобно использовать BETWEEN … AND …. Пример: SELECT * FROM salaries WHERE amount BETWEEN 50000 AND 100000; выберет зарплаты от 50 000 до 100 000 включительно.
Оператор IN заменяет несколько условий =. Пример: SELECT * FROM employees WHERE department_id IN (1, 3, 5); выберет сотрудников из отделов 1, 3 и 5.
Оператор LIKE используется для частичного совпадения строк с % (любой набор символов) и _ (один символ). Например, SELECT * FROM customers WHERE name LIKE ‘Анд%’; выберет всех клиентов, чьи имена начинаются с «Анд».
Для проверки NULL используется IS NULL или IS NOT NULL. Пример: SELECT * FROM tasks WHERE completed IS NULL; отберет все задачи без даты завершения.
Комбинируя операторы сравнения с AND и OR, можно строить точные условия. Пример: SELECT * FROM orders WHERE status = ‘shipped’ AND total > 1000; покажет отправленные заказы с суммой больше 1000.
Применение логических операторов AND, OR, NOT

Оператор AND возвращает строки, которые удовлетворяют всем условиям одновременно. Пример: SELECT * FROM employees WHERE department = 'IT' AND experience > 5; – выбираются только сотрудники IT с опытом работы более 5 лет.
Оператор OR возвращает строки, если выполняется хотя бы одно условие. Пример: SELECT * FROM products WHERE type = 'Laptop' OR type = 'Tablet'; – выбираются все ноутбуки и планшеты.
Оператор NOT исключает строки, соответствующие условию. Пример: SELECT * FROM orders WHERE NOT status = 'Shipped'; – выбираются все заказы, которые не отправлены.
Для сложных фильтров операторы комбинируются с использованием скобок для управления порядком выполнения. Пример: SELECT * FROM students WHERE (score >= 90 AND attendance >= 95) OR scholarship = 'Yes'; – выбираются студенты с высоким баллом и посещаемостью или получающие стипендию.
Приоритет выполнения: NOT выше AND, AND выше OR. Скобки позволяют точно контролировать последовательность условий и предотвращают ошибки логики.
Фильтрация с использованием шаблонов LIKE
Оператор LIKE позволяет искать строки, соответствующие определённым шаблонам. Основные метасимволы: % – соответствует любой последовательности символов, _ – одному символу. Например, запрос:
SELECT * FROM products WHERE name LIKE 'Телефон%';
вернёт все товары, названия которых начинаются с «Телефон». Использование % в начале шаблона, как в '%Pro', ищет строки, оканчивающиеся на «Pro», но индекс может не применяться, что замедляет поиск.
Для поиска по конкретной позиции символа применяется _. Запрос:
SELECT * FROM users WHERE code LIKE 'A_3';
найдёт все коды, где первый символ «A», третий – «3», а второй может быть любым.
LIKE чувствителен к регистру в большинстве SQL-систем. Чтобы выполнить нечувствительный поиск, используют ILIKE в PostgreSQL или функцию UPPER():
SELECT * FROM clients WHERE UPPER(name) LIKE 'АННА%';
Комбинация нескольких шаблонов с OR позволяет гибко фильтровать данные:
SELECT * FROM files WHERE filename LIKE '%.jpg' OR filename LIKE '%.png';
Для оптимизации стоит минимизировать использование ведущего %, применять индексы и комбинировать LIKE с другими условиями WHERE для точной фильтрации. Это снижает нагрузку на базу при больших объёмах данных.
Работа с NULL в условиях WHERE

В SQL значение NULL обозначает отсутствие данных, и стандартные операторы сравнения (=, <>, >, <) с ним не работают напрямую. Любое сравнение с NULL возвращает неизвестное значение, что влияет на фильтрацию данных.
Для проверки NULL используют специальные конструкции:
IS NULL– проверка на отсутствие значения.IS NOT NULL– проверка на наличие значения.
Примеры использования:
- Выбор всех записей с пустым полем
email:SELECT * FROM users WHERE email IS NULL; - Выбор всех записей, где
phoneуказан:SELECT * FROM users WHERE phone IS NOT NULL;
Важно помнить:
- Сравнение
NULL = NULLвернетFALSE. ИспользуйтеIS NULL. - При использовании логических операторов (
AND,OR) сNULLрезультат может быть неожиданным, поэтому желательно явное указаниеIS NULLилиIS NOT NULL. - Фильтрация с
WHEREиNULLвлияет на агрегатные функции. Например,COUNT(column)игнорируетNULL, аCOUNT(*)считает все строки.
Для более сложных условий с возможными NULL можно использовать COALESCE для подстановки значения по умолчанию:
SELECT *
FROM orders
WHERE COALESCE(delivery_date, '9999-12-31') > CURRENT_DATE;
Эта конструкция позволяет корректно сравнивать даты, заменяя NULL фиктивным значением, чтобы не пропускать строки в выборке.
Фильтрация с подзапросами и EXISTS
Подзапросы в SQL позволяют использовать результат одного запроса для фильтрации данных в другом. Чаще всего применяются в операторе WHERE, когда необходимо проверить наличие или соответствие данных в другой таблице.
Синтаксис подзапроса в WHERE:
SELECT столбцы FROM таблица WHERE столбец [оператор] (SELECT столбец FROM другая_таблица WHERE условие);
Пример: получить список клиентов, у которых есть заказы:
| Клиент | Страна |
|---|---|
| Иванов | Россия |
| Петров | Россия |
SQL-запрос:
SELECT Name, Country FROM Customers WHERE CustomerID IN (SELECT CustomerID FROM Orders);
Оператор EXISTS используется для проверки наличия строк в подзапросе. Он возвращает TRUE, если подзапрос возвращает хотя бы одну строку, и FALSE в противном случае. EXISTS эффективен при работе с большими таблицами, так как проверяет наличие, а не полный набор данных.
Пример: найти товары, которые заказывали хотя бы один раз:
| Товар | Цена |
|---|---|
| Ноутбук | 75000 |
| Смартфон | 35000 |
SQL-запрос с EXISTS:
SELECT ProductName, Price FROM Products p WHERE EXISTS (SELECT 1 FROM Orders o WHERE o.ProductID = p.ProductID);
Рекомендации при использовании подзапросов и EXISTS:
- Используйте
EXISTS, если нужно проверить наличие строк, это повышает производительность. - Для фильтрации по конкретным значениям применяйте
INили=ANY. - Избегайте подзапросов с возвращением большого количества столбцов – выбирайте только необходимые.
- При сложных условиях используйте коррелированные подзапросы, связывая внешние и внутренние таблицы через ключи.
Вопрос-ответ:
Что произойдёт, если в запросе не указать WHERE?
Если WHERE отсутствует, запрос затронет все строки таблицы. Например, SELECT * FROM employees; вернёт все записи без фильтрации. Это полезно для получения полной информации, но при обновлении или удалении данных без WHERE все строки также будут затронуты, что может привести к нежелательным результатам. Поэтому нужно быть внимательным при использовании операций UPDATE и DELETE без условий.
