PostgreSQL запросы: задачи и практика онлайн
PostgreSQL запросы лучше изучать на практике: писать SELECT, JOIN и агрегаты, а затем переходить к возможностям самого диалекта. В SQL Arena доступна отдельная PostgreSQL-песочница в браузере, задачи и курс для последовательного обучения.
Обновлено · Команда SQL Arena
Что потренируете
- Писать SELECT, JOIN, GROUP BY и оконные запросы в PostgreSQL 16
- Использовать FILTER для условных агрегатов
- Разбираться с DISTINCT ON и порядком сортировки
- Работать с ::cast, датами и интервалами
- Проверять запросы на отдельных таблицах и скрытых данных
Пример задачи в тренажёре
Так выглядит задача в SQL Arena: условие, редактор, результат и схема базы.
Есть таблица фитнес-клубов и таблица занятий. Для каждого клуба, у которого есть занятия, выведите название клуба в club_name, количество премиальных занятий в premium_sessions и количество обычных занятий в regular_sessions. Отсортируйте результат по id клуба.
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_name | premium_sessions | regular_sessions |
|---|---|---|---|
| 1 | North Studio | 2 | 1 |
| 2 | River Gym | 1 | 1 |
| 3 | Atlas Club | 2 | 1 |
| 4 | Pine Fitness | 0 | 1 |
Есть таблица фитнес-клубов и таблица занятий. Для каждого клуба, у которого есть занятия, выведите название клуба в club_name, количество премиальных занятий в premium_sessions и количество обычных занятий в regular_sessions. Отсортируйте результат по id клуба.
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;
Разбор 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 и видеть поведение выбранного диалекта.
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_name | premium_sessions | regular_sessions |
|---|---|---|
| North Studio | 2 | 1 |
| River Gym | 1 | 1 |
| Atlas Club | 2 | 1 |
| Pine Fitness | 0 | 1 |
Типичные ошибки в PostgreSQL-запросах
Условие ставят в WHERE вместо FILTER
Если написать WHERE s.is_premium перед GROUP BY, из набора исчезнут все обычные занятия. После этого второй счётчик уже не сможет показать их количество. FILTER ограничивает только конкретный агрегат и не удаляет строки, которые нужны соседнему агрегату.
Путают DISTINCT и DISTINCT ON
DISTINCT удаляет полностью одинаковые комбинации выбранных колонок. DISTINCT ON в PostgreSQL работает иначе: он оставляет одну строку на значение указанного выражения, а какая именно строка останется, обычно определяется ORDER BY. Без понимания сортировки в задачах на «последнюю запись по клиенту» легко получить не ту строку.
Переносят синтаксис другой СУБД без проверки
Функции дат, преобразование типов и некоторые способы выбрать одну строку из группы различаются между диалектами. В PostgreSQL часто встречаются ::cast, интервалы вида INTERVAL и generate_series. Запрос, знакомый по MySQL или BigQuery, стоит проверять именно в PostgreSQL-песочнице.
Задачи по теме в тренажёре
Курс «SQL с нуля» идёт на PostgreSQLПосле такого примера можно перейти к задачам по PostgreSQL в тренажёре. На простом уровне есть, например, выборка рок-артистов из фестивальной базы, подсчёт фестивалей за 2024 год и работа с фитнес-клубами в Берлине. Дальше появляются группировки и агрегаты посложнее: поиск крупнейших спонсоров, тренера с максимальным числом занятий или среднего значения по группам. Всего в SQL Arena 1 192 задачи, причём у каждой задачи свои таблицы. Проверка идёт не только по результату на видимых данных: решение сверяется с эталоном и на скрытых данных. Поэтому запрос, который случайно подошёл под пять строк примера, может не пройти проверку. Для бесплатной практики доступны 292 задачи на четырёх диалектах без карты. Если PostgreSQL изучается с нуля, дальше можно открыть курс «SQL с нуля»: он идёт именно на PostgreSQL, а в каждом уроке теория связана с практической задачей. Для разбора запросов также доступны ER-диаграммы, EXPLAIN и AI-ментор с подсказками и объяснениями ошибок.
- EasyбесплатноРок-артисты фестивальной базыpostgresqlmysqlclickhouse
- EasyбесплатноКоличество фестивалей в 2024 годуpostgresqlmysqlclickhouse
- EasyбесплатноФитнес-клубы в Берлинеpostgresqlmysqlclickhouse
- EasyбесплатноКоличество Premium-клиентовpostgresqlmysqlclickhouse
- MediumPremiumКрупнейшие платиновые спонсорыpostgresqlmysqlclickhouse
- MediumPremiumТренер с наибольшим числом занятийpostgresqlmysqlclickhouse
- MediumPremiumСамое посещаемое занятиеpostgresqlmysqlclickhouse
- MediumPremiumСредняя базовая цена номера по отелямpostgresqlmysqlclickhouse
Справочник по теме
Подробные статьи с синтаксисом и примерами в справочнике SQL Arena.
Частые вопросы
Как писать 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