Фильтрация в SQL: первые шаги на примере PostgreSQL
За 20–30 минут вы научитесь отбирать строки по одному условию, сочетать несколько фильтров и искать совпадения по тексту. Примеры рассчитаны на PostgreSQL 16 и запускаются в SQL-клиенте.

За 20–30 минут вы сможете отобрать из таблицы нужные строки: например, заказы дороже заданной суммы, записи за период или товары с названием, содержащим слово. Покажем фильтрацию на PostgreSQL 16: создадим временную таблицу с тестовыми данными и проверим каждый запрос в SQL-клиенте.
Что понадобится
Нужна база PostgreSQL 16 и подключение к ней через любой SQL-клиент, например psql или графический интерфейс. Достаточно права выполнять запросы и создавать временные таблицы. Примеры ниже работают в рамках одного подключения: после его закрытия временная таблица исчезнет.
Сначала выполните этот блок целиком. Он создаёт таблицу заказов и добавляет три записи. В рабочей базе не запускайте создание таблицы с таким именем, пока не проверите, что не затронете существующие данные.
CREATE TEMP TABLE orders (
id integer PRIMARY KEY,
customer text NOT NULL,
status text NOT NULL,
amount numeric(10, 2) NOT NULL,
created_at date NOT NULL
);
INSERT INTO orders (id, customer, status, amount, created_at) VALUES
(1, 'Анна', 'paid', 2500.00, DATE '2025-01-10'),
(2, 'Илья', 'new', 900.00, DATE '2025-01-12'),
(3, 'Анна', 'paid', 4200.00, DATE '2025-02-03');
Проверка: запрос SELECT * FROM orders; должен вернуть три строки. Здесь и далее мы используем SQL, определённый для примеров на PostgreSQL 16; при переносе запросов между СУБД проверьте документацию конкретной системы.
Пять шагов к первой выборке
- Выведите нужные столбцы. Запрос
SELECT id, customer, amount FROM orders;показывает только номер заказа, покупателя и сумму. Для проверки должны появиться три строки с этими тремя столбцами. Начинайте с явного перечня полей: так результат легче читать, а изменения таблицы не добавят в него неожиданные столбцы. - Добавьте условие через WHERE. Выполните
SELECT id, status, amount FROM orders WHERE status = 'paid';. Вы должны получить два оплаченных заказа. Текстовые значения записывают в одинарных кавычках; сравнение с учётом регистра зависит от типа данных и правил сравнения в конкретной СУБД. - Отфильтруйте по числу. Запрос
SELECT id, amount FROM orders WHERE amount >= 2000;вернёт заказы на сумму от 2000 включительно. Проверка: в результате должны остаться строки с суммами 2500 и 4200. Операторы>,<,>=и<=задают строгую или включающую границу. - Сочетайте условия. Выполните
SELECT id, status, amount FROM orders WHERE status = 'paid' AND amount > 3000;. Должен остаться заказ номер 3. ОператорANDтребует, чтобы совпали оба условия;ORподходит, если достаточно любого из них. Проверка: заменитеANDнаORи убедитесь, что строк стало больше. - Ищите по дате и части текста. Чтобы выбрать заказы за февраль 2025 года, выполните
SELECT id, created_at FROM orders WHERE created_at >= DATE '2025-02-01' AND created_at < DATE '2025-03-01';. Должна вернуться одна строка. Для поиска фрагмента имени используйтеSELECT id, customer FROM orders WHERE customer LIKE '%Ан%';: результат содержит обе записи Анны. Проверка: в первом запросе одна строка, во втором — две.
Как не потерять строки на границе
Для периода удобно задавать нижнюю границу включительно, а верхнюю — исключительно: >= начало и < начало следующего периода. Так условие подходит и для столбцов с датой и временем, где в последний день могут храниться часы, минуты и секунды. Если столбец имеет тип timestamp, сравнивайте его с подходящими значениями этого типа; не полагайтесь на неявное преобразование строк.
Условия можно группировать скобками. В запросе WHERE status = 'paid' AND (amount > 3000 OR customer = 'Илья') скобки означают: статус должен быть оплачен, а дальше подходит либо большая сумма, либо имя Илья. Без скобок сочетание AND и OR может дать не тот набор строк, который вы ожидали.
Перед тем как использовать выборку для отчёта или массового изменения, сначала проверьте сами строки и только потом полагайтесь на количество результатов.
Если запрос не сработал
- «relation "orders" does not exist». Таблица не найдена в текущем подключении. Для временной таблицы это обычно означает, что вы отключились или запустили запрос в другом окне подключения. Повторите создание таблицы и вставку данных в том же соединении.
- «column ... does not exist». Проверьте имя столбца и таблицу: PostgreSQL не сможет найти поле, которого в схеме нет. Имена без кавычек приводятся к нижнему регистру, поэтому столбцы, созданные с кавычками и заглавными буквами, требуют точного написания.
- «operator does not exist». Часто сравнивают несовместимые типы, например число с текстом. Проверьте тип столбца и не заключайте числовое значение в кавычки без необходимости.
- Запрос вернул 0 строк. Убедитесь, что тестовые данные добавлены, а значение написано точно:
'paid'не совпадает с'Paid'при обычном сравнении текста. Для проверки временно оставьте одно условие и добавляйте остальные по очереди. - Запрос вернул слишком много строк. Проверьте, не использовали ли вы
ORтам, где нужны оба условия, и расставлены ли скобки. Сравните результат с небольшим контрольным набором, для которого заранее знаете ожидаемые строки.
Термины, которые встретятся в примерах
Предикат — условие, которое проверяет строку и определяет, проходит ли она фильтр. Например, amount >= 2000 — предикат: он принимает строки с нужной суммой и исключает остальные.
Особый случай — NULL: это отсутствие значения, а не число ноль и не пустая строка. Поэтому условие column = NULL не проверяет, что поле пустое. Для такой проверки в SQL используют IS NULL, а для обратной — IS NOT NULL.
Что делать дальше
Возьмите одну реальную таблицу и сформулируйте, какие строки должны попасть в результат. Сначала выберите только нужные поля, затем добавьте одно условие и сверяйте выдачу с известными примерами. Когда запрос станет правильным, проверьте его на большем объёме: фильтрация может оказаться дорогой, особенно если условие применяется к столбцу без подходящего индекса. Следующий шаг — разобраться с индексами и планом выполнения; для начала полезно изучить официальное описание WHERE и оператора LIKE в документации PostgreSQL 16.
Создатель презентаций: Структура и текст каждого слайда: заголовки-утверждения, одна мысль на слайд, заметки докладчику.
Спросить за 150 ₽Источники: PostgreSQL 16: SELECT, PostgreSQL 16: Pattern Matching
Частые вопросы
Можно ли применять эти запросы не в PostgreSQL?
Чем отличаются AND и OR?
Как найти строки, где поле пустое?
Почему LIKE '%Ан%' может быть медленным?
Почему запрос с датой не возвращает последнюю дату периода?
Что делать, если временная таблица пропала?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.