Научный руководитель: Вильданов Алмаз Нафкатович
к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал
Введение
Современные информационные системы хранят огромные объемы данных. В таблице учебной базы может быть несколько сотен или даже тысяч записей студентов. Выводить их все одновременно не имеет практического смысла — пользователю нужны только те данные, которые соответствуют определенным критериям. Например, преподавателю может потребоваться список студентов конкретной группы, а сотруднику деканата — все студенты из определенного города [1, с. 45].
Именно для решения таких задач в SQL существует оператор WHERE, который позволяет фильтровать строки таблицы по заданным условиям [2, с. 178]. В рамках выполнения практических заданий на тренажере SQL (задания №5–33) мы последовательно изучили все основные возможности фильтрации — от простейшего равенства до сложных логических выражений с использованием AND, OR, LIKE и IN.
Данная статья представляет собой систематизированный обзор этих заданий с подробным разбором каждого запроса. Все примеры взяты из реальных задач, которые были успешно решены на тренажере.
Теоретические основы оператора WHERE
Оператор WHERE является неотъемлемой частью оператора SELECT и служит для ограничения множества строк, возвращаемых запросом [3, с. 89]. Синтаксически WHERE располагается после оператора FROM и перед ORDER BY, если сортировка присутствует. Общий вид запроса с фильтрацией выглядит следующим образом: выбираются необходимые поля из указанной таблицы, затем задаётся условие отбора строк, и при необходимости результат упорядочивается.
Важно понимать логический порядок обработки запроса, поскольку он определяет, какие данные участвуют в каждой последующей операции. Сначала определяется источник данных с помощью FROM. Затем, на втором этапе, применяется WHERE, который отсеивает строки, не удовлетворяющие условию. Только после этого выполняются группировка, агрегация, выборка полей и сортировка [1, с. 245]. Такая последовательность делает WHERE эффективным инструментом для сокращения объёма данных на самом раннем этапе обработки.
Условия, задаваемые в WHERE, могут быть различных типов. Это могут быть операции сравнения, такие как равенство, неравенство, больше или меньше; логические операции, объединяющие несколько условий; поиск по шаблону с помощью оператора LIKE; проверка вхождения в множество через IN; а также специальные проверки на неопределённое значение NULL [4, с. 112]. Каждый из этих подходов имеет свою область применения, синтаксические особенности и влияние на производительность.
При работе с несколькими условиями важно учитывать приоритет логических операторов. Оператор NOT имеет наивысший приоритет, затем следует AND, и самым низким приоритетом обладает OR. Для изменения порядка вычислений и обеспечения однозначности интерпретации используются круглые скобки [5, с. 34]. Например, условие, записанное как city = ‘Москва’ AND gender = ‘M’ OR age > 30, будет интерпретировано как выборка мужчин из Москвы или всех людей старше тридцати лет независимо от города. Если же требуется найти мужчин, которые либо живут в Москве, либо старше тридцати лет, необходимо явно указать это с помощью скобок: city = ‘Москва’ AND (gender = ‘M’ OR age > 30). Использование скобок не только меняет логику, но и делает запрос более читаемым для других разработчиков.
Отдельного внимания заслуживает работа с NULL-значениями. В реляционных базах данных NULL обозначает отсутствие информации или неизвестность. Ключевая особенность заключается в том, что NULL не равен никакому значению, включая другой NULL [2, с. 203] . Поэтому для проверки на NULL используются специальные операторы IS NULL и IS NOT NULL. Попытка сравнить поле с NULL через обычные операторы сравнения, такие как =, <> или >, всегда возвращает логическое значение UNKNOWN, а не TRUE или FALSE. Это означает, что такие строки не будут включены в результат запроса. Данное поведение является одной из самых частых причин ошибок у начинающих разработчиков, которые ожидают, что условие address = NULL сработает аналогично сравнению с обычным значением.
Вопрос производительности запросов с WHERE напрямую связан с наличием индексов на полях, участвующих в фильтрации. Индексы позволяют СУБД находить нужные строки без полного сканирования всей таблицы [1, с. 312]. Оператор точного равенства = при наличии индекса работает максимально эффективно, выполняя поиск по ключу. Операторы диапазонного поиска, такие как <, > и BETWEEN, также могут использовать индекс. Что касается оператора LIKE, то индекс может быть задействован только в том случае, если шаблон начинается с фиксированного префикса, например ‘Петр%’. Если же шаблон начинается с символа %, например ‘%ов’, индекс не используется, и СУБД вынуждена сканировать всю таблицу. Поэтому при проектировании баз данных рекомендуется создавать индексы на поля, которые часто участвуют в условиях WHERE, но при этом помнить, что каждый дополнительный индекс замедляет операции вставки и обновления данных [4, с. 156] .
Простейшая фильтрация: точное равенство (=)
Наиболее фундаментальной и интуитивно понятной операцией фильтрации является проверка на точное равенство. Данная конструкция используется в тех случаях, когда необходимо отобрать записи, в которых значение определённого поля в точности совпадает с заданным эталоном. Это может быть поиск конкретного студента по фамилии, клиента по идентификатору, товара по артикулу или любого другого объекта по уникальному или полууникальному признаку [3, с. 67] .
При фильтрации по строковым полям важно помнить, что строковые литералы в SQL всегда записываются в одинарных кавычках. Использование двойных кавычек может привести к синтаксической ошибке или быть интерпретировано как имя объекта базы данных. Кроме того, сравнение строк в большинстве реляционных СУБД является регистрозависимым, если иное не задано настройками сопоставления. Это означает, что значения ‘Петров’ и ‘петров’ будут восприниматься как совершенно разные строки. Если требуется регистронезависимый поиск, необходимо использовать специальные функции, такие как LOWER() для приведения к нижнему регистру.
Для числовых полей оператор равенства работает стандартным образом, сравнивая численные значения. Числовые литералы записываются без кавычек. Важно помнить, что попытка сравнения числового поля со строковым значением может привести к неявному преобразованию типов, что снижает производительность запроса и может стать источником трудноуловимых ошибок.
Проиллюстрируем работу оператора (=) на практическом примере (рисунок 1). В данном случае из таблицы student выбираются поля name, lastname и address, а в условии WHERE задаётся, что поле lastname должно в точности равняться строке «Петров». При выполнении этого запроса СУБД сканирует таблицу и для каждой строки сравнивает значение поля lastname с эталоном. В результат включаются только те записи, где это условие истинно. Важно отметить, что если в таблице присутствуют студенты с фамилией, записанной в другом регистре, например «петров», они не попадут в результат. Также на результат может повлиять наличие лишних пробелов в начале или конце строки. Для устранения этих проблем рекомендуется использовать функции LOWER() и TRIM() соответственно.

Рисунок 1. Пример фильтрации по точному равенству
Числовые сравнения: больше, меньше, диапазоны
Для полей числового типа данных применяются операторы сравнения, позволяющие отбирать записи по диапазонам значений. Это особенно актуально при решении задач, связанных с количественными критериями: поиск студентов с массой тела ниже определённого порога, товаров в заданном ценовом диапазоне, заказов за определённый период времени или сотрудников с определённым стажем работы [1, с. 278]. Операторы < и > используются для строгих неравенств, а <= и >= – для нестрогих. Кроме того, существует оператор BETWEEN, который проверяет принадлежность значения диапазону включительно. Все эти операторы эффективно работают с числовыми полями и при наличии индекса на соответствующем поле позволяют СУБД быстро находить нужные строки без полного сканирования таблицы.
Обратимся к примеру, демонстрирующему использование числового сравнения (рисунок 2). В запросе из таблицы student выбираются поля massa, lastname и name, а в условии WHERE задаётся, что поле massa должно быть строго меньше числа 70. При выполнении запроса СУБД сравнивает числовое значение в каждой строке с пороговым значением и включает в результат только те записи, где масса меньше указанного числа. Числовые сравнения выполняются значительно быстрее строковых операций, поскольку числа сравниваются на уровне машинных инструкций без необходимости учёта регистра, кодировки и других текстовых особенностей. Кроме того, для числовых полей легко создаются индексы, которые эффективно поддерживают как точные, так и диапазонные запросы.

Рисунок 2. Пример числового сравнения
Поиск по шаблону: оператор LIKE
В реальных условиях редко можно полагаться на точное совпадение строк. Пользователи могут вводить фамилии с ошибками, имена с уменьшительно-ласкательными формами или требуется найти все записи, начинающиеся на определённый префикс. Для таких случаев предназначен оператор LIKE, который поддерживает поиск по шаблону с использованием двух специальных символов [5, с. 56]. Символ процента % обозначает любое количество любых символов, включая ноль. Например, шаблон ‘Петр%’ найдёт все строки, начинающиеся с «Петр», такие как «Петров», «Петрова», «Петренко» и даже просто «Петр». Символ подчёркивания _ обозначает ровно один любой символ. Например, шаблон ‘_а%’ найдёт все строки, где вторым символом является «а». При использовании LIKE важно помнить, что если шаблон начинается с символа %, то индекс на соответствующем поле не может быть использован, и СУБД вынуждена сканировать всю таблицу. Поэтому при работе с большими объёмами данных рекомендуется формулировать шаблоны так, чтобы они начинались с фиксированного префикса.
Рассмотрим применение оператора LIKE на конкретном примере (рисунок 3). В запросе из таблицы student выбираются поля name, lastname и massa, а в условии WHERE задаётся lastname LIKE ‘Петр%’. Это условие отбирает все фамилии, начинающиеся с указанного префикса. Такой подход широко используется в поисковых формах и системах автодополнения, когда пользователь вводит начало фамилии и получает список всех подходящих вариантов.

Рисунок 3. Пример поиска по шаблону LIKE
Логические операторы: AND и OR
Часто бывает необходимо задать несколько условий одновременно. Например, может потребоваться найти студентов из конкретного города и при этом только мужского пола. Или, наоборот, студентов с одной из нескольких фамилий. Для этих целей используются логические операторы AND и OR [3, с. 112]. Оператор AND требует выполнения всех перечисленных условий одновременно. Если хотя бы одно условие ложно, вся строка исключается из результата. Оператор OR, напротив, возвращает строку, если истинно хотя бы одно из условий. Понимание различий между этими операторами и правильный выбор между ними является ключевым навыком при построении сложных фильтров [2, с. 215] .
В качестве первого примера рассмотрим ситуацию, когда необходимо применить оператор AND (рисунок 4). В запросе из таблицы student выбираются все поля при условии, что адрес равен «Нефтекамск» и пол равен «M». В результате останутся только мужчины из указанного города. Если бы вместо AND использовался OR, запрос вернул бы всех студентов из Нефтекамска, а также всех мужчин независимо от их места проживания, что совершенно иначе интерпретировало бы поставленную задачу.

Рисунок 4. Пример использования оператора AND
Другой пример демонстрирует работу оператора OR (рисунок 5). В запросе из таблицы student выбираются поля name, lastname и massa при условии, что фамилия равна «Васильев» или равна «Иванова». Результат дополнительно упорядочивается по фамилии для удобства восприятия. При комбинировании AND и OR в одном условии необходимо помнить о приоритете операторов и использовать скобки для явного указания логики [4, с. 89]. Это делает запрос не только корректным, но и понятным для других разработчиков, которые могут работать с этим кодом в будущем.

Рисунок 5. Пример использования оператора OR
Множественный фильтр: оператор IN
Когда требуется проверить значение на вхождение в список из нескольких элементов, использование цепочки OR становится громоздким и менее читаемым. Для этих целей существует оператор IN, который позволяет компактно записать проверку принадлежности множеству значений [5, с. 78]. Оператор IN принимает список значений, разделённых запятыми и заключённых в круглые скобки. Запрос с IN возвращает все строки, где значение поля совпадает с любым из перечисленных элементов. Этот оператор эквивалентен цепочке OR, но при этом является более наглядным и удобным для восприятия, особенно когда список значений длинный.
Последний пример посвящён использованию оператора IN (рисунок 6). В запросе из таблицы student выбираются все поля, где адрес входит в множество значений «Нефтекамск» и «Агидель», и результат упорядочивается по фамилии в возрастающем порядке. Оператор IN особенно полезен при программной генерации запросов, когда список значений формируется динамически. Кроме того, IN поддерживает использование подзапросов, что позволяет, например, найти всех студентов, обучающихся в группах с определённым названием, без необходимости явного перечисления идентификаторов групп.

Рисунок 6. Пример использования оператора IN
Заключение
Оператор WHERE является фундаментальным инструментом языка SQL, позволяющим эффективно фильтровать данные в реляционных базах данных [1, с. 400]. В ходе рассмотрения материала были изучены все основные конструкции фильтрации, каждая из которых имеет свою область применения и особенности использования. Точное равенство является основой для работы с конкретными значениями и используется в большинстве поисковых запросов. Числовые сравнения позволяют отбирать данные по количественным критериям, что особенно важно в аналитических системах и системах мониторинга. Поиск по шаблону с помощью LIKE даёт возможность работать с текстовыми данными в условиях неполной информации, когда точное значение неизвестно. Логические операторы AND и OR позволяют строить сложные условия, комбинируя несколько критериев отбора. Оператор IN упрощает множественную фильтрацию, делая запросы более компактными и читаемыми [2, с. 512] .
Понимание семантики каждого оператора, его влияния на производительность и областей применения позволяет разработчику и аналитику формулировать корректные и эффективные запросы, что напрямую влияет на качество работы информационных систем. Важно помнить о возможности использования индексов для ускорения фильтрации, избегать операций, которые приводят к полному сканированию таблицы, и всегда проверять планы выполнения сложных запросов. Полученные знания являются базой для изучения более сложных тем: объединения таблиц с помощью JOIN, группировки данных через GROUP BY, работы с подзапросами и оконными функциями, где фильтрация также играет ключевую роль на различных этапах обработки данных [3, с. 201].
Библиографический список
-
Гарсиа-Молина Г., Ульман Д., Уидом Д. Системы баз данных. Полный курс. М.: Вильямс, 2021. 1088 с.
-
Дейт К. Дж. Введение в системы баз данных. М.: Вильямс, 2020. 1328 с.
-
Волк В. К. Базы данных. Проектирование, программирование, управление и администрирование: учебник для вузов. 2-е изд., стер. Санкт-Петербург: Лань, 2021. 244 с. URL: https://e.lanbook.com/book/176670
-
Нестеров С. А. Базы данных: учебник и практикум для вузов. Москва: Издательство Юрайт, 2020. 230 с. URL: https://urait.ru/bcode/450772 (дата обращения: 24.06.2026).
-
Дьяков И. А. Базы данных. Язык SQL: учебное пособие. Тамбов: Тамбовский государственный технический университет (ТГТУ), 2012. 82 с. URL: https://biblioclub.ru/index.php?page=book&id=277628.
