CodeRang
Диалекты

PostgreSQL запросы: задачи и практика онлайн

PostgreSQL запросы лучше изучать на практике: писать SELECT, JOIN и агрегаты, а затем переходить к возможностям самого диалекта. В SQL Arena доступна отдельная PostgreSQL-песочница в браузере, задачи и курс для последовательного обучения.

Обновлено · Команда SQL Arena

Что потренируете

  • Писать SELECT, JOIN, GROUP BY и оконные запросы в PostgreSQL 16
  • Использовать FILTER для условных агрегатов
  • Разбираться с DISTINCT ON и порядком сортировки
  • Работать с ::cast, датами и интервалами
  • Проверять запросы на отдельных таблицах и скрытых данных

Пример задачи в тренажёре

Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.

Пред.След.Случайная
ЗаданиеОтправкиAI Mentor
Посчитайте премиальные и обычные занятия по клубам

Есть таблица фитнес-клубов и таблица занятий. Для каждого клуба, у которого есть занятия, выведите название клуба в club_name, количество премиальных занятий в premium_sessions и количество обычных занятий в regular_sessions. Отсортируйте результат по id клуба.

Запрос 1PostgreSQLv16
SELECT c.name AS club_name,
       COUNT(*) FILTER (WHERE s.is_premium) AS premium_sessions,
       COUNT(*) FILTER (WHERE NOT s.is_premium) AS regular_sessions
FROM fitness_clubs c
JOIN class_sessions s ON s.club_id = c.id
GROUP BY c.id, c.name
ORDER BY c.id;
Отправить
Результатfitness_clubsclass_sessions
Ответ принят

Разбор PostgreSQL-запроса с FILTER и GROUP BY

Начинаем с соединения fitness_clubs и class_sessions. Вторая таблица хранит отдельные занятия, а club_id указывает на конкретный клуб. Здесь нужен обычный JOIN, а не LEFT JOIN: по условию нас интересуют только клубы, у которых есть хотя бы одно занятие. Поэтому Lake Center, для которого строк в class_sessions нет, в результат не попадёт.

После соединения строки группируются по клубу. В PostgreSQL удобно сразу считать несколько показателей внутри одной группы через FILTER. Выражение COUNT(*) FILTER (WHERE s.is_premium) считает только строки, где is_premium равно TRUE. Второй агрегат использует противоположное условие и получает число обычных занятий.

Такой запрос обычно проще читать, чем несколько вложенных CASE внутри агрегатов: условие находится рядом с тем показателем, к которому относится. FILTER особенно полезен, когда из одной группы нужно получить несколько счётчиков: например оплаченные и бесплатные заказы, успешные и отменённые операции или события разных типов.

В GROUP BY указаны c.id и c.name. id нужен ещё и для однозначной финальной сортировки. Если сортировать только по названию, порядок будет алфавитным и уже не будет соответствовать идентификаторам клубов. ORDER BY c.id делает ожидаемый результат стабильным.

На этих данных North Studio получает два премиальных занятия и одно обычное, River Gym — по одному каждого типа, Atlas Club — два премиальных и одно обычное, а Pine Fitness — только одно обычное. Это хороший небольшой пример PostgreSQL-специфичной конструкции: саму агрегацию можно решить и иначе, но FILTER позволяет выразить её напрямую.

PostgreSQL поддерживает как стандартные конструкции SQL, так и собственные возможности. Например, FILTER позволяет задавать отдельное условие для конкретного агрегата: можно в одной группировке посчитать несколько показателей без дополнительных подзапросов. К PostgreSQL-специфичным конструкциям также относятся DISTINCT ON, оператор приведения типов :: и развитая работа с массивами и JSONB. Поэтому при обучении важно не ограничиваться общим SQL, а запускать запросы именно в PostgreSQL и видеть поведение выбранного диалекта.

SQLPostgreSQL v16
SELECT c.name AS club_name,
       COUNT(*) FILTER (WHERE s.is_premium) AS premium_sessions,
       COUNT(*) FILTER (WHERE NOT s.is_premium) AS regular_sessions
FROM fitness_clubs c
JOIN class_sessions s ON s.club_id = c.id
GROUP BY c.id, c.name
ORDER BY c.id;
Результат запроса
club_namepremium_sessionsregular_sessions
North Studio21
River Gym11
Atlas Club21
Pine Fitness01

Типичные ошибки в PostgreSQL-запросах

01

Условие ставят в WHERE вместо FILTER

Если написать WHERE s.is_premium перед GROUP BY, из набора исчезнут все обычные занятия. После этого второй счётчик уже не сможет показать их количество. FILTER ограничивает только конкретный агрегат и не удаляет строки, которые нужны соседнему агрегату.

02

Путают DISTINCT и DISTINCT ON

DISTINCT удаляет полностью одинаковые комбинации выбранных колонок. DISTINCT ON в PostgreSQL работает иначе: он оставляет одну строку на значение указанного выражения, а какая именно строка останется, обычно определяется ORDER BY. Без понимания сортировки в задачах на «последнюю запись по клиенту» легко получить не ту строку.

03

Переносят синтаксис другой СУБД без проверки

Функции дат, преобразование типов и некоторые способы выбрать одну строку из группы различаются между диалектами. В PostgreSQL часто встречаются ::cast, интервалы вида INTERVAL и generate_series. Запрос, знакомый по MySQL или BigQuery, стоит проверять именно в PostgreSQL-песочнице.

Задачи по теме в тренажёре

Курс «SQL с нуля» идёт на PostgreSQL

После такого примера можно перейти к задачам по PostgreSQL в тренажёре. На простом уровне есть, например, выборка рок-артистов из фестивальной базы, подсчёт фестивалей за 2024 год и работа с фитнес-клубами в Берлине. Дальше появляются группировки и агрегаты посложнее: поиск крупнейших спонсоров, тренера с максимальным числом занятий или среднего значения по группам. Всего в SQL Arena 1 192 задачи, причём у каждой задачи свои таблицы. Проверка идёт не только по результату на видимых данных: решение сверяется с эталоном и на скрытых данных. Поэтому запрос, который случайно подошёл под пять строк примера, может не пройти проверку. Для бесплатной практики доступны 292 задачи на четырёх диалектах без карты. Если PostgreSQL изучается с нуля, дальше можно открыть курс «SQL с нуля»: он идёт именно на PostgreSQL, а в каждом уроке теория связана с практической задачей. Для разбора запросов также доступны ER-диаграммы, EXPLAIN и AI-ментор с подсказками и объяснениями ошибок.

Частые вопросы

Как писать PostgreSQL запросы?

Начните с базовых SELECT, WHERE, ORDER BY, JOIN и GROUP BY, а затем переходите к функциям и конструкциям PostgreSQL. Запросы полезно выполнять на реальных таблицах, чтобы сразу видеть результат и ошибки.

Где пройти PostgreSQL курс?

Курс PostgreSQL должен сочетать объяснение синтаксиса с самостоятельным написанием запросов. В SQL Arena доступны курсы и отдельная PostgreSQL-песочница, где запросы выполняются прямо в браузере.

Где практиковать PostgreSQL онлайн?

Для практики нужен редактор, в котором выполняется именно PostgreSQL, а не условный универсальный SQL. В SQL Arena PostgreSQL доступен как отдельный диалект с собственной песочницей.

Какие бывают PostgreSQL задачи?

Практические задачи могут охватывать фильтрацию, JOIN, группировку, подзапросы, оконные функции и особенности PostgreSQL. Полезно решать их самостоятельно и проверять запросы на разных наборах данных.

Как начать обучение PostgreSQL?

Сначала освойте базовый SQL, затем закрепляйте его на PostgreSQL и постепенно добавляйте возможности конкретной СУБД. Практика должна сопровождать изучение каждой новой конструкции.

PostgreSQL задачи и практика онлайн

Откройте PostgreSQL-песочницу и начните с бесплатных Easy-задач. Ничего устанавливать и привязывать карту не нужно.

Решать задачи PostgreSQL