
В SQL оператор WHERE позволяет фильтровать записи таблицы, но для сложных запросов часто требуется сочетание нескольких условий. Например, при выборке клиентов из таблицы Customers можно одновременно проверять город и объем покупок: WHERE City = 'Москва' AND TotalOrders > 10. Такое комбинирование повышает точность выборки и снижает нагрузку на сервер, исключая ненужные строки еще на этапе запроса.
Для объединения условий применяются логические операторы AND, OR и NOT. Важно учитывать порядок выполнения и приоритеты: AND выполняется раньше OR, поэтому скобки () часто необходимы для корректной логики. Например, WHERE (City = 'Москва' OR City = 'Санкт-Петербург') AND TotalOrders > 10 гарантирует, что учитываются только клиенты из двух городов с более чем десятью заказами.
Использование нескольких условий также улучшает читаемость и поддержку кода. Разделение проверок на отдельные строки или группировка через скобки облегчает анализ запроса и уменьшает вероятность логических ошибок. При сложных фильтрах рекомендуется проверять каждое условие отдельно, чтобы убедиться в правильности выборки и эффективности индексов на соответствующих полях.
Объединение условий с AND для точного фильтра

В SQL оператор AND позволяет объединять несколько условий в блоке WHERE, чтобы возвращались только строки, удовлетворяющие всем критериям одновременно.
Пример практического применения:
SELECT *
FROM orders
WHERE status = 'Shipped'
AND total_amount > 1000;
В этом запросе выбираются только заказы со статусом Shipped и суммой больше 1000. Любое нарушение одного из условий исключает запись из результата.
Рекомендации по использованию:
- Ставьте более селективные условия первыми для оптимизации чтения и фильтрации больших таблиц.
- Используйте
ANDсBETWEEN,INилиLIKEдля комбинированной фильтрации по диапазонам, спискам или шаблонам. - Объединяйте
ANDсORчерез скобки для точного контроля порядка проверки условий:
SELECT *
FROM products
WHERE (category = 'Electronics' OR category = 'Appliances')
AND stock > 50;
Здесь гарантируется, что учитываются только товары из указанных категорий с запасом больше 50 штук.
Для сложных фильтров полезно проверять план выполнения запроса (EXPLAIN), чтобы убедиться, что порядок условий с AND не замедляет выборку.
Использование AND особенно эффективно при фильтрации по датам, числовым диапазонам и логическим признакам одновременно:
SELECT *
FROM employees
WHERE department_id = 5
AND hire_date >= '2024-01-01'
AND active = 1;
Такой подход сокращает объем возвращаемых данных до строго необходимых записей.
Применение OR для расширения выборки данных

Оператор OR позволяет включить в результат несколько альтернативных условий. Например, запрос SELECT * FROM products WHERE category = 'Электроника' OR category = 'Бытовая техника'; вернёт все товары из обеих категорий без необходимости писать отдельные запросы для каждой.
При использовании OR важно учитывать приоритеты логических операций. Если условие комбинируется с AND, рекомендуется применять скобки: SELECT * FROM orders WHERE (status = 'В обработке' OR status = 'Ожидает оплаты') AND customer_id = 102;. Без скобок результат может отличаться от ожидаемого.
Для числовых диапазонов OR позволяет объединять отдельные значения: SELECT * FROM employees WHERE age = 25 OR age = 30 OR age = 35;. Если список значений длинный, эффективнее использовать IN, но OR остаётся удобным для редких случаев с небольшим числом вариантов.
OR в условиях с NULL требует осторожности. Например, SELECT * FROM clients WHERE region = 'Москва' OR region IS NULL; корректно возвращает строки с указанием региона или отсутствием значения. Прямое сравнение NULL через = не сработает.
Для повышения производительности при использовании OR с индексами стоит проверять планы выполнения. В некоторых СУБД объединение нескольких индексов с OR может замедлять запрос, тогда предпочтительнее разделять запрос на UNION.
Использование OR упрощает гибкую фильтрацию данных, когда несколько условий равнозначны. Это сокращает количество запросов и повышает читаемость кода при правильной расстановке скобок и учёте особенностей NULL.
Использование скобок для управления приоритетом условий

В SQL логические операторы AND и OR имеют разный приоритет: AND выполняется раньше OR. Без скобок это может привести к неожиданным результатам. Например, запрос:
SELECT * FROM orders WHERE status = 'shipped' OR status = 'processing' AND total > 100;
будет интерпретирован как:
status = 'shipped' OR (status = 'processing' AND total > 100')
Если требуется объединить условия иначе, используются скобки для явного управления приоритетом:
SELECT * FROM orders WHERE (status = 'shipped' OR status = 'processing') AND total > 100;
Скобки гарантируют, что фильтр по сумме применяется к обеим статусам одновременно. Рекомендуется всегда использовать скобки, когда AND и OR комбинируются, чтобы избежать логических ошибок и повысить читаемость запроса.
Для сложных условий можно вкладывать скобки несколько уровней, например:
WHERE (region = 'EU' AND (status = 'shipped' OR status = 'processing')) OR (region = 'US' AND total > 200)
Это позволяет точно контролировать, какие группы условий должны выполняться вместе, снижая риск непреднамеренного расширения выборки.
Практика показывает, что использование скобок не только предотвращает ошибки, но и упрощает оптимизацию запросов, так как СУБД однозначно понимает порядок применения фильтров.
Комбинирование AND и OR в одном запросе

Использование AND и OR в одном выражении WHERE позволяет строить точные фильтры для выборки данных. Ключевой момент – порядок выполнения условий. SQL обрабатывает AND с более высоким приоритетом, чем OR. Без скобок результат может отличаться от ожидаемого.
Например, запрос:
SELECT * FROM employees WHERE department_id = 2 OR department_id = 3 AND salary > 50000;
интерпретируется как department_id = 2 OR (department_id = 3 AND salary > 50000). Если целью было выбрать всех сотрудников из отделов 2 и 3 с зарплатой выше 50000, нужно использовать скобки:
SELECT * FROM employees WHERE (department_id = 2 OR department_id = 3) AND salary > 50000;
Рекомендуется всегда группировать OR условия скобками при сочетании с AND для предотвращения логических ошибок. Также полезно выстраивать условия от более узких к более широким: сначала AND, затем OR, если это соответствует логике фильтрации.
Для повышения читаемости можно разбивать длинные выражения на несколько строк и выравнивать скобки, чтобы быстро понимать, какие группы условий соединяются AND или OR.
Пример сложного комбинирования:
SELECT * FROM orders WHERE (status = 'shipped' OR status = 'processing') AND (total_amount > 1000 OR priority = 'high');
Здесь SQL сначала проверяет группы OR, затем объединяет их с помощью AND, обеспечивая точное соответствие заданным критериям.
Фильтрация с NULL и IS NOT NULL вместе с другими условиями

При работе с SQL важно учитывать, что значения NULL требуют специальной обработки. Простейшее сравнение через = или <> не срабатывает. Вместо этого используются IS NULL и IS NOT NULL. Например, для выборки пользователей без адреса электронной почты:
SELECT * FROM users WHERE email IS NULL;
Для комбинирования проверки на NULL с другими условиями применяется логический оператор AND или OR. Важно соблюдать порядок условий и скобки для корректной логики. Например, выборка активных пользователей без телефона:
SELECT * FROM users WHERE status = 'active' AND phone IS NULL;
В случаях с OR следует явно группировать условия скобками, чтобы избежать неожиданных результатов. Например, выборка пользователей с ролью admin или без даты регистрации:
SELECT * FROM users WHERE role = 'admin' OR registration_date IS NULL;
При фильтрации нескольких столбцов на NULL полезно использовать сочетания AND и OR для точного результата:
SELECT * FROM orders WHERE delivery_date IS NOT NULL AND (payment_status = 'paid' OR discount IS NOT NULL);
Пример с таблицей, демонстрирующей различные комбинации условий:
| Условие | Описание | Пример SQL |
|---|---|---|
| IS NULL + AND | Выбирает записи с NULL в одном столбце при выполнении другого условия | SELECT * FROM users WHERE last_login IS NULL AND status = ‘active’; |
| IS NOT NULL + AND | Отбирает только заполненные значения при дополнительном условии | SELECT * FROM orders WHERE delivery_date IS NOT NULL AND payment_status = ‘paid’; |
| IS NULL + OR | Расширяет выборку, включая записи с NULL или соответствующие другому условию | SELECT * FROM users WHERE role = ‘admin’ OR last_login IS NULL; |
| IS NOT NULL + OR | Включает все записи с непустым значением или удовлетворяющие альтернативному условию | SELECT * FROM products WHERE stock IS NOT NULL OR price < 100; |
Рекомендация: всегда тестируйте запросы с NULL на небольшом наборе данных, чтобы убедиться, что логика сочетания условий соответствует ожиданиям и не исключает нужные строки.
Сравнение диапазонов с BETWEEN и несколькими условиями

Оператор BETWEEN позволяет задать диапазон значений в SQL без необходимости прописывать каждое условие отдельно. Например, для выборки заказов с суммой от 1000 до 5000 можно использовать:
SELECT * FROM orders WHERE total_amount BETWEEN 1000 AND 5000;
При использовании нескольких условий важно помнить, что BETWEEN включает границы диапазона. Если необходимо исключить границы, лучше применить логические операторы:
SELECT * FROM orders WHERE total_amount > 1000 AND total_amount < 5000;
Для комбинирования диапазонов по разным колонкам можно соединять BETWEEN с AND/OR. Например, выборка заказов за определённый период с суммой в заданном диапазоне:
SELECT * FROM orders WHERE total_amount BETWEEN 1000 AND 5000 AND order_date BETWEEN ‘2025-01-01’ AND ‘2025-03-31’;
Если диапазонов несколько и они не пересекаются, лучше использовать OR вместо BETWEEN для каждого интервала:
SELECT * FROM orders WHERE total_amount BETWEEN 1000 AND 2000 OR total_amount BETWEEN 3000 AND 5000;
Рекомендуется явно указывать тип данных границ диапазона, особенно для дат и чисел с плавающей запятой, чтобы избежать некорректных выборок. Для повышения читаемости запросов допустимо выносить диапазоны в CTE или переменные.
Использование BETWEEN совместно с другими условиями позволяет минимизировать количество проверок и улучшить производительность при больших таблицах, если индексы покрывают колонки диапазонов.
Вопрос-ответ:
Как правильно использовать несколько условий в операторе WHERE?
В SQL оператор WHERE позволяет фильтровать строки таблицы по определённым критериям. Когда необходимо проверить сразу несколько условий, их можно объединять с помощью логических операторов AND и OR. AND требует, чтобы все условия были истинны, а OR — чтобы хотя бы одно условие было истинно. Для управления приоритетом используется скобочная группировка, например: SELECT * FROM Таблица WHERE (Условие1 AND Условие2) OR Условие3.
Можно ли сочетать AND и OR в одном запросе?
Да, комбинация AND и OR встречается часто. При этом важно правильно расставлять скобки, чтобы избежать непредвиденных результатов. Например, запрос SELECT * FROM Клиенты WHERE Страна=’Россия’ AND (Возраст>25 OR Покупки>10) сначала проверяет условия внутри скобок, а затем объединяет результат с условием Страна=’Россия’. Без скобок SQL может объединять условия по своему приоритету, что приведёт к другим выборкам.
Как использовать несколько условий для фильтрации по диапазону значений?
Для фильтрации по диапазону значений удобно использовать BETWEEN или комбинацию сравнений с AND. Например, SELECT * FROM Продажи WHERE Сумма BETWEEN 1000 AND 5000 вернёт строки, где значение Сумма находится в указанном диапазоне. Альтернатива — написать SELECT * FROM Продажи WHERE Сумма>=1000 AND Сумма<=5000. Оба способа дают одинаковый результат, но BETWEEN делает код более читаемым.
Можно ли использовать несколько условий для разных столбцов одновременно?
Да, SQL позволяет комбинировать фильтры по разным столбцам. Например, запрос SELECT * FROM Заказы WHERE Статус=’Доставлен’ AND Дата>= ‘2025-01-01’ отбирает только те строки, где заказ уже доставлен и дата заказа позже указанной. Это позволяет точно ограничивать выборку, применяя условия к каждому столбцу отдельно.
Как влияют скобки на порядок применения условий в WHERE?
Скобки задают приоритет обработки условий. SQL сначала оценивает выражения в скобках, а затем объединяет результат с другими условиями. Например, в запросе SELECT * FROM Таблица WHERE (Колонка1=’A’ OR Колонка1=’B’) AND Колонка2>10 сначала проверяются значения Колонка1, а потом результат сравнивается с условием Колонка2>10. Без скобок SQL может соединять условия по стандартному приоритету операторов, что изменит конечный результат выборки.
