Основы SQL в PostgreSQL: SELECT, WHERE и ORDER BY
За 20–30 минут вы научитесь выбирать нужные столбцы из таблицы PostgreSQL, отфильтровывать строки по условиям и сортировать результат. Все примеры можно запускать в PostgreSQL 16.

За 20–30 минут вы научитесь писать запросы к PostgreSQL 16: выбирать столбцы через SELECT, отбирать строки с помощью WHERE и управлять порядком результата через ORDER BY. Для практики достаточно установленного PostgreSQL и любой SQL-консоли, например psql или встроенного редактора в pgAdmin.
Что нужно подготовить
Примеры рассчитаны на PostgreSQL 16. Базовый синтаксис работает и в других популярных СУБД, но детали типов, функций и обработки пустых значений могут отличаться.
- доступ к базе PostgreSQL 16;
- права на создание временной таблицы или отдельная учебная база;
- SQL-клиент:
psql, pgAdmin или редактор в вашей IDE; - понимание, что таблица состоит из строк, а столбцы описывают свойства этих строк.
Сноска. Реляционная СУБД хранит данные в таблицах, связанных между собой отношениями. В этой статье используется одна таблица, поэтому JOIN и объединение данных оставлены за рамками.
SQL-запрос не изменяет порядок строк «сам по себе». Если порядок важен, его нужно явно задать через
ORDER BY.
Шаг 1. Создайте данные для эксперимента
Сначала создадим временную таблицу. Она существует только до закрытия текущего подключения к PostgreSQL, поэтому учебные данные не останутся в рабочей базе.
CREATE TEMP TABLE products (
id integer,
name text,
category text,
price numeric(10, 2),
stock integer
);
INSERT INTO products (id, name, category, price, stock) VALUES
(1, 'Механическая клавиатура', 'Аксессуары', 7490.00, 12),
(2, 'Беспроводная мышь', 'Аксессуары', 3290.00, 0),
(3, 'USB-C монитор', 'Мониторы', 28990.00, 5),
(4, 'Ноутбук 14 дюймов', 'Ноутбуки', 89990.00, 3),
(5, 'Веб-камера', 'Аксессуары', 6490.00, 8),
(6, 'Док-станция', 'Аксессуары', 11990.00, 2);
SELECT COUNT(*) AS product_count
FROM products;
Проверка: последний запрос должен вернуть значение 6. Если таблица уже существует в текущем подключении, закройте соединение и откройте его заново либо выполните DROP TABLE products;, а затем повторите скрипт.
Шаг 2. Выберите столбцы через SELECT
SELECT определяет, какие столбцы попадут в результат. Запрос не обязан возвращать всю строку: можно выбрать только название и цену.
SELECT name, price
FROM products;
Проверка: результат должен содержать две колонки — name и price — и шесть строк.
Звёздочка выбирает все столбцы:
SELECT *
FROM products;
Такой вариант удобен для быстрой проверки структуры, но в приложении лучше перечислять нужные поля. Если в таблицу добавят новый столбец, SELECT * начнёт возвращать другой набор данных, а лишние поля увеличат объём ответа.
Столбцу или вычисляемому выражению можно дать псевдоним через AS:
SELECT
name AS product_name,
price AS price_rubles,
price * 1.20 AS price_with_tax
FROM products;
Проверка: в заголовке результата должны появиться product_name, price_rubles и price_with_tax.
Шаг 3. Отфильтруйте строки через WHERE
WHERE оставляет только строки, для которых условие истинно. Например, найдём товары дороже 10 000 рублей.
SELECT name, price
FROM products
WHERE price > 10000;
Проверка: в результате должны остаться монитор, ноутбук и док-станция.
Операторы сравнения работают так:
=— равно;<>— не равно;>и>=— больше, больше или равно;<и<=— меньше, меньше или равно.
Условия можно объединять. AND требует выполнения обоих условий, а OR — хотя бы одного.
SELECT name, price, stock
FROM products
WHERE category = 'Аксессуары'
AND stock > 0;
Проверка: должны вернуться клавиатура, веб-камера и док-станция. Беспроводная мышь отфильтровывается, потому что её остаток равен нулю.
Для нескольких значений используйте IN, а для диапазона — BETWEEN:
SELECT name, category, price
FROM products
WHERE category IN ('Аксессуары', 'Мониторы')
AND price BETWEEN 3000 AND 15000;
Проверка: в результате должны быть клавиатура, беспроводная мышь, веб-камера и док-станция. Границы BETWEEN включаются: цена 3000 или 15000 тоже попала бы в выборку.
Шаг 4. Отсортируйте результат через ORDER BY
Без ORDER BY PostgreSQL не обещает порядок строк. Даже если несколько запусков показывают одинаковый результат, план выполнения или индекс могут изменить его.
SELECT name, price
FROM products
ORDER BY price ASC;
Проверка: товары должны идти от самой низкой цены к самой высокой. ASC можно не писать: это направление сортировки по умолчанию.
Для обратного порядка используется DESC:
SELECT name, stock
FROM products
ORDER BY stock DESC, name ASC;
Проверка: первой должна быть клавиатура с остатком 12, затем веб-камера с остатком 8. Если значения равны, PostgreSQL дополнительно сортирует строки по названию.
Сначала применяется фильтр, затем сортировка результата. Поэтому запрос можно читать так: взять товары с остатком, а затем расположить их по цене.
SELECT name, price, stock
FROM products
WHERE stock > 0
ORDER BY price DESC;
Проверка: первой должна быть позиция с наибольшей ценой среди товаров в наличии — ноутбук.
Шаг 5. Ограничьте число строк
Для предварительного просмотра результата удобно добавить LIMIT. В PostgreSQL он задаёт максимальное число возвращаемых строк.
SELECT name, price
FROM products
ORDER BY price DESC
LIMIT 3;
Проверка: результат должен содержать ровно три самых дорогих товара. Для пагинации можно использовать OFFSET, но при больших таблицах он может становиться дорогим: базе приходится пропускать предыдущие строки.
Если запрос не сработал
- «relation products does not exist». Вы подключились к другой базе или не выполнили первый скрипт в текущем соединении. Создайте временную таблицу заново.
- «column name does not exist». Проверьте написание столбца и текущую схему. В PostgreSQL имена без кавычек обычно приводятся к нижнему регистру.
- «operator does not exist». Сравниваются несовместимые типы, например число со строкой. Для числового столбца используйте число без кавычек:
price > 10000. - «syntax error at or near». Проверьте запятые между столбцами, кавычки вокруг текстовых значений и порядок частей запроса:
SELECT,FROM,WHERE,ORDER BY. - Результат пустой. Условие может быть слишком строгим. Выполните сначала
SELECT * FROM products;и сравните условие с реальными значениями.
Что важно проверить перед рабочим запросом
Не подставляйте пользовательский текст в SQL через склейку строк. В приложении значения передают параметрами драйвера или ORM: это защищает запрос от SQL-инъекций и корректно обрабатывает кавычки. Названия таблиц и столбцов обычно нельзя передавать как обычные параметры, поэтому их нужно выбирать из заранее разрешённого списка.
Отдельно помните о NULL. Это не ноль и не пустая строка. Условие price = NULL не найдёт пустые значения; для них используют IS NULL или IS NOT NULL. Обработка пропусков — отдельная тема, но ошибка здесь часто превращает неполный отчёт в внешне правдоподобный.
Что делать дальше
Создайте несколько собственных запросов к учебной таблице: найдите товары дешевле заданной суммы, товары без остатка и три самые дорогие позиции в конкретной категории. Затем измерьте, как меняется запрос на реальной таблице с большим числом строк, через план выполнения PostgreSQL. Следующий логичный шаг — изучить GROUP BY и агрегатные функции, а после этого перейти к объединению таблиц через JOIN.
Субтитры и таймкоды: Расшифровка речи и субтитры по правилам читаемости: 42 знака в строке, две строки, минимум секунда на реплику.
Спросить за 40 ₽Источники: PostgreSQL 16 Documentation: Queries, PostgreSQL 16 Documentation: SELECT
Частые вопросы
Можно ли писать SELECT без FROM?
Почему порядок строк меняется, если я не менял запрос?
Чем отличаются WHERE и ORDER BY?
Почему WHERE price = NULL ничего не возвращает?
Работают ли эти запросы в MySQL или SQLite?
Можно ли использовать номер столбца в ORDER BY?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.