Все очень зависит от запросов.
Самые простые запросы - поиск по конкретному значению, в sql запросе это выглядит select ... from ... where ПОЛЕ = 'значение'
Как частный случай этого, выбор значения справочника (это такой список значений, обычно выделяют в таблицу с полями id,name а в целевой таблице оставляют идентификатор а не значение) в фильтрации where пишешь ПОЛЕ = идентификатор_из_справочника (в интерфейсе же ты можешь показывать не id а значения из справочника)
Чуть по сложнее, это запрос по подстроке, как ни странно sql для этого подходит плохо, но если что есть запросы вида where ПОЛЕ like '%подстрока%', в зависимости от наличии % в начале и выбора типа индекса, такой запрос может перебирать все поля в базе или только те что нужно по индексу.
Сложнее, когда в самой базе, создав соответствующие таблицы и поля, создается собственный 'индекс', некий набор данных, заполняемых либо периодически либо автоматически при обновлении данных (например тригерами), в этом случае ищешь уже не по самим данным а по этим искусственным индексным. Тупой пример - тебе нужен поиск по словам в строке, но база данных это делает плохо (на самом деле есть инструменты чтобы было хорошо но я только ради примера), ты при обновлении базы создаешь записи в соседней таблице на каждое слово с указанием, в какой записи (по id) оно встречается, теперь тебе достаточно искать уже по этим словам а не в исходной таблице.
Само собой есть еще поиск по дате, агрегатные функции (например поиск по сумме), сортировка, постраничная навигация и прочее прочее, на каждый момент есть свои способы реализации.