
Фильтрация данных в SQL редко ограничивается одним критерием. На практике запросы почти всегда содержат несколько условий в WHERE: проверку значений полей, диапазонов, соответствие спискам или шаблонам. Понимание синтаксиса таких выражений напрямую влияет на корректность выборки и предсказуемость результата.
Операторы AND и OR задают логику объединения условий, но их совместное использование без скобок часто приводит к ошибкам. SQL обрабатывает логические выражения по строгим правилам приоритета, и даже небольшое отклонение в записи может изменить набор возвращаемых строк. Поэтому важно не просто знать операторы, а понимать порядок их выполнения.
Помимо базовых сравнений через =, <>, > и <, WHERE поддерживает конструкции IN, BETWEEN и LIKE, которые нередко комбинируются между собой. Такие сочетания позволяют точно описать условия отбора, не перегружая запрос вложенными подзапросами.
В статье рассматриваются практические примеры записи нескольких условий в WHERE, типовые схемы комбинирования логических операторов и распространённые ошибки. Материал ориентирован на реальные запросы к таблицам, где важна читаемость SQL-кода и однозначность интерпретации условий.
Несколько условий в WHERE SQL: примеры и синтаксис

В SQL блок WHERE поддерживает одновременную проверку нескольких условий с помощью логических операторов AND и OR. При использовании AND строка попадает в результат только при выполнении всех указанных проверок. Например, запрос может отбирать записи по совпадению значения в одном столбце и диапазону значений в другом.
Оператор OR работает по противоположному принципу: строка возвращается, если выполнено хотя бы одно условие. Это часто применяется при фильтрации по альтернативным значениям, например по нескольким статусам или типам записей. При этом важно учитывать, что AND имеет более высокий приоритет выполнения, чем OR.
Для управления порядком вычислений используются круглые скобки. Они позволяют явно задать, какие условия должны проверяться совместно. Без скобок запрос вида WHERE a = 1 OR b = 2 AND c = 3 будет интерпретирован иначе, чем WHERE (a = 1 OR b = 2) AND c = 3, и вернёт другой набор строк.
В сложных фильтрах часто комбинируют логические операторы с конструкциями IN, BETWEEN и LIKE. Например, можно одновременно ограничить выборку по дате через BETWEEN и проверить принадлежность значения списку через IN. Такой подход сокращает количество условий и делает запрос более наглядным.
При записи нескольких условий рекомендуется явно группировать логические блоки скобками, даже если приоритет операторов кажется очевидным. Это снижает риск логических ошибок при доработке запроса и упрощает чтение SQL-кода при повторном использовании или передаче другому разработчику.
Использование оператора AND для объединения условий в WHERE

Оператор AND в WHERE применяется для одновременной проверки нескольких условий, каждое из которых должно быть истинным. Строка попадает в результат только при полном совпадении всех заданных критериев, что удобно при фильтрации по нескольким столбцам одной таблицы.
Типовой случай – отбор записей по значению поля и дополнительному ограничению. Например, проверка категории товара и его наличия на складе описывается как category = ‘electronics’ AND stock > 0. Если хотя бы одно из условий не выполняется, запись исключается.
AND часто комбинируют с операторами сравнения =, <>, >, <, а также с BETWEEN для диапазонов. Проверка даты заказа и суммы может выглядеть как order_date BETWEEN ‘2024-01-01’ AND ‘2024-01-31’ AND total > 1000, что позволяет точно задать границы выборки.
При большом количестве условий рекомендуется располагать их в логическом порядке: от наиболее общих к более детальным. Это упрощает чтение запроса и снижает риск пропустить лишнее ограничение при дальнейшем редактировании SQL-кода.
Если в WHERE используются только операторы AND, скобки не требуются, так как все условия обрабатываются последовательно. Однако при добавлении OR группировка становится обязательной, иначе логика объединения условий изменится и результат запроса будет иным.
Применение оператора OR при альтернативных условиях отбора
Оператор OR позволяет описывать альтернативные сценарии отбора, при которых строка подходит по одному из условий. Такой синтаксис применяют, когда допустимы разные значения одного столбца или независимые проверки по разным полям.
Простой пример – выборка пользователей с разными ролями: role = ‘manager’ OR role = ‘operator’. В результате возвращаются строки, где значение role совпадает хотя бы с одним вариантом. При увеличении числа альтернатив запись через OR быстро разрастается, поэтому для одного столбца предпочтительно использовать IN.
При проверке разных полей OR часто комбинируется с дополнительными ограничениями. Запрос вида (city = ‘Berlin’ OR city = ‘Paris’) AND active = 1 отбирает записи только с нужными городами и заданным признаком активности. Скобки здесь обязательны, иначе условие active будет применено не ко всем вариантам.
Отдельного внимания требует работа с NULL. Условие field = ‘value’ OR field IS NULL используется для включения строк без значения в поле. Попытка заменить IS NULL обычным сравнением приведёт к пропуску таких записей из результата.
Если альтернативные условия логически не связаны, иногда разумнее использовать несколько запросов с UNION ALL. Это упрощает контроль логики отбора и снижает риск непреднамеренного расширения выборки из-за сложной комбинации OR.
Комбинирование AND и OR с приоритетом выполнения
В SQL логический оператор AND имеет более высокий приоритет, чем OR. Это означает, что условия, связанные через AND, вычисляются раньше, даже если в выражении они записаны после OR. Игнорирование этого правила часто приводит к получению некорректного набора строк.
Запрос status = ‘new’ OR status = ‘pending’ AND paid = 1 будет обработан как status = ‘new’ OR (status = ‘pending’ AND paid = 1). В результате все записи со статусом new попадут в выборку независимо от значения paid.
Для наглядного управления логикой отбора используются скобки. Они позволяют явно задать порядок проверки условий и избежать двусмысленного чтения запроса. При совместном использовании AND и OR скобки рекомендуется применять всегда.
| Условие WHERE | Фактический порядок проверки |
|---|---|
| a = 1 OR b = 2 AND c = 3 | a = 1 OR (b = 2 AND c = 3) |
| (a = 1 OR b = 2) AND c = 3 | (a = 1 OR b = 2) AND c = 3 |
При сложных фильтрах полезно проверять логику условия на небольшом наборе данных или временно выносить части выражения в отдельные запросы. Это позволяет убедиться, что приоритет выполнения операторов соответствует ожидаемому поведению выборки.
Группировка условий в WHERE с помощью скобок

Скобки в WHERE позволяют явно определить порядок выполнения логических операций, предотвращая двусмысленность при сочетании AND и OR. Без скобок SQL применяет стандартный приоритет операторов: AND вычисляется раньше OR, что может привести к неожиданным результатам.
Пример: category = ‘books’ OR category = ‘magazines’ AND stock > 0. Без скобок строки с category = ‘books’ попадут в выборку независимо от наличия на складе. Чтобы выбрать только товары с наличием, необходимо использовать скобки: (category = ‘books’ OR category = ‘magazines’) AND stock > 0.
Скобки полезны и при комбинировании нескольких условий по разным столбцам. Например, фильтрация по дате и статусу может быть оформлена как (order_date >= ‘2025-01-01’ AND order_date <= ‘2025-01-31’) AND (status = ‘paid’ OR status = ‘shipped’). Такая запись гарантирует точный отбор нужных строк.
Рекомендуется группировать логические блоки даже в коротких запросах, если используется больше одного оператора. Это повышает читаемость кода, облегчает внесение изменений и снижает риск ошибок при добавлении новых условий.
Фильтрация данных через WHERE с операторами сравнения

В SQL оператор WHERE позволяет отбирать строки по точному или диапазонному совпадению значений с помощью операторов сравнения. Они применяются для числовых, текстовых и временных данных, обеспечивая точный контроль над выборкой.
- = – проверка на точное совпадение. Например, status = ‘active’ вернёт только строки с указанным статусом.
- <> – исключение конкретного значения. Например, category <> ‘books’ исключает товары категории «books».
- > и < – проверка на больше или меньше. Например, price > 100 отбирает все товары дороже 100 единиц.
- >= и <= – включение границ диапазона. Например, order_date >= ‘2025-01-01’ AND order_date <= ‘2025-01-31’ отбирает заказы за январь.
Для сложной фильтрации сравнения часто комбинируют с AND и OR. Пример:
- Выбор товаров с ценой от 500 до 1000 и в наличии: price >= 500 AND price <= 1000 AND stock > 0.
- Выбор пользователей с определённой ролью или активностью: role = ‘admin’ OR last_login >= ‘2025-12-01’.
При работе с операторами сравнения важно учитывать тип данных столбца. Сравнение текстовых и числовых значений в одной колонке может привести к неожиданным результатам, поэтому рекомендуется заранее привести данные к подходящему типу или использовать явное приведение через CAST или CONVERT.
Примеры WHERE с IN, BETWEEN и LIKE при нескольких условиях

Конструкции IN, BETWEEN и LIKE позволяют упростить запись нескольких условий в WHERE и сделать запросы более наглядными.
- IN используется для проверки принадлежности значения списку. Пример: category IN (‘books’, ‘magazines’, ‘comics’) возвращает строки, где category совпадает с любым элементом списка.
- BETWEEN проверяет попадание значения в диапазон. Пример: price BETWEEN 100 AND 500 выбирает товары с ценой от 100 до 500 включительно.
- LIKE применяют для поиска по шаблону. Пример: name LIKE ‘A%’ возвращает все строки, где имя начинается с буквы A.
Эти конструкции удобно комбинировать с другими условиями через AND и OR. Примеры практического использования:
- Выбор книг и журналов стоимостью до 300 единиц: category IN (‘books’, ‘magazines’) AND price <= 300.
- Отбор заказов, оформленных в декабре 2025 года, и сумма которых превышает 1000: order_date BETWEEN ‘2025-12-01’ AND ‘2025-12-31’ AND total > 1000.
- Поиск клиентов, чьи фамилии начинаются на «Sm» и проживают в определённых городах: last_name LIKE ‘Sm%’ AND city IN (‘London’, ‘Berlin’).
Использование этих операторов сокращает количество условий в WHERE и делает запросы более читаемыми, особенно при фильтрации по множеству вариантов одного столбца или по диапазонам значений.
Типовые ошибки при указании нескольких условий в WHERE

Частая ошибка при работе с несколькими условиями – игнорирование приоритета операторов AND и OR. Запрос a = 1 OR b = 2 AND c = 3 будет обработан как a = 1 OR (b = 2 AND c = 3), что часто не соответствует задуманной логике.
Другой тип ошибки – отсутствие скобок при комбинировании альтернативных условий. Без них выборка может включить лишние строки или пропустить нужные. Например, (status = ‘new’ OR status = ‘pending’) AND paid = 1 отличается от status = ‘new’ OR status = ‘pending’ AND paid = 1.
Некорректное использование IN, BETWEEN и LIKE также приводит к ошибкам. Часто встречается ситуация, когда BETWEEN включает границы неверно из-за неправильного формата даты или числа, а LIKE не учитывает регистр символов.
Неявное сравнение с NULL – ещё одна распространённая ошибка. Обычное выражение field = NULL не работает, нужно использовать field IS NULL или field IS NOT NULL для корректной фильтрации.
Для снижения рисков рекомендуется:
- Явно группировать условия скобками.
- Проверять типы данных при сравнении.
- Использовать IN и BETWEEN вместо длинных цепочек OR или AND там, где это возможно.
- Тестировать запросы на небольших выборках перед запуском на всех данных.
Вопрос-ответ:
Как использовать несколько условий в WHERE для фильтрации данных по разным столбцам?
Для фильтрации по разным столбцам используют логические операторы AND и OR. AND объединяет условия так, что запись попадёт в результат только при выполнении всех проверок. Например: WHERE category = ‘books’ AND stock > 0 вернёт только книги, которые есть в наличии. OR используется, если достаточно выполнения одного из условий, например: WHERE status = ‘new’ OR status = ‘pending’ вернёт все новые и ожидающие обработки записи.
В чём разница между использованием IN и цепочкой условий с OR?
Оператор IN позволяет записать несколько альтернатив в одной конструкции вместо длинной цепочки OR. Например, WHERE category IN (‘books’, ‘magazines’, ‘comics’) эквивалентно WHERE category = ‘books’ OR category = ‘magazines’ OR category = ‘comics’. Такой подход сокращает код и улучшает читаемость, особенно при работе с большим количеством значений.
Как правильно комбинировать AND и OR в одном WHERE, чтобы избежать ошибок?
При сочетании AND и OR важно учитывать порядок выполнения. SQL вычисляет AND раньше OR, поэтому скобки часто необходимы. Например: (status = ‘new’ OR status = ‘pending’) AND paid = 1 вернёт строки с нужными статусами и оплатой, а status = ‘new’ OR status = ‘pending’ AND paid = 1 даст другой результат. Скобки делают логику выборки однозначной.
Можно ли использовать BETWEEN и LIKE одновременно в одном WHERE?
Да, эти конструкции можно комбинировать через AND или OR. Например, запрос WHERE order_date BETWEEN ‘2025-12-01’ AND ‘2025-12-31’ AND customer_name LIKE ‘A%’ вернёт все заказы за декабрь 2025 года с именами клиентов, начинающимися на «A». Такой подход позволяет точно фильтровать данные по диапазону и шаблону одновременно.
Какие типовые ошибки встречаются при использовании нескольких условий в WHERE?
Чаще всего встречаются следующие ошибки: неправильный порядок выполнения AND и OR без скобок, сравнение с NULL через = вместо IS NULL, некорректный формат даты или числа в BETWEEN, а также слишком длинные цепочки OR без использования IN. Для предотвращения ошибок рекомендуется группировать условия скобками, проверять типы данных и тестировать запрос на небольшой выборке.
