Практика: Сложные SELECT-запросы
Онлайн редактор кода для PostgreSQL
Здесь вы можете попробовать свои силы в программировании на языке SQL для работы с PostgreSQL. Для этого мы предоставляем вам онлайн редактор кода, в котором вы можете написать свой код и запустить его.
❗️ При обновлении страницы код пропадёт, по этому, сохраните свой код куда-нибудь, если он важный.
Задание 1 — Простые JOIN + фильтры
Задание 1: Базовые JOIN + WHERE
⏱️ Примерное время: 10-15 минутНапиши запрос, который будет выводить данные из твоего варианта (INNER JOIN + LEFT JOIN). Добавь фильтры по major, status, grade.
Требования:
- используй
students s INNER/LEFT JOIN enrollments e ON ... JOIN courses c ON ... - выводи: имя студента, название курса, оценка, статус
- ORDER BY student_name, course_name
- LIMIT 20 для удобства
Пример:
SELECT
s.first_name || ' ' || s.last_name AS student,
c.course_name,
e.grade,
e.status
FROM students s
INNER JOIN enrollments e ON s.student_id = e.student_id
INNER JOIN courses c ON e.course_id = c.course_id
WHERE e.status = 'active'
ORDER BY student, c.course_name
LIMIT 20;
Задание 2 — Агрегаты + GROUP BY + HAVING
Задание 2: Группировка и агрегаты
⏱️ Примерное время: 20-25 минутНапиши запросы с GROUP BY, COUNT, AVG, MIN/MAX, STRING_AGG, FILTER, HAVING.
Требования:
- GROUP BY major / city / department / year
- агрегаты: COUNT(*), AVG(gpa), ROUND(...,2), STRING_AGG
- HAVING COUNT(*) > 2 / AVG(gpa) > 3.5
- ORDER BY убыванию
Пример:
SELECT
major,
COUNT(*) AS student_count,
ROUND(AVG(gpa), 2) AS avg_gpa,
COUNT(*) FILTER (WHERE gpa >= 3.7) AS excellent
FROM students
GROUP BY major
HAVING COUNT(*) >= 2
ORDER BY avg_gpa DESC;
Задание 3 — Подзапросы + EXISTS / NOT EXISTS
Задание 3: Подзапросы и EXISTS
⏱️ Примерное время: 25-35 минутИспользуй подзапросы (IN, EXISTS, коррелированные) для фильтрации и вычислений.
Требования:
- минимум 3–4 варианта: IN, EXISTS, коррелированный, ANY/ALL
- WHERE EXISTS / NOT EXISTS / > ALL / IN (SELECT ...)
- ROUND(AVG(...), 2) где нужно
Пример:
SELECT
first_name || ' ' || last_name AS student,
major,
gpa
FROM students s
WHERE gpa > (
SELECT AVG(gpa)
FROM students s2
WHERE s2.major = s.major
)
ORDER BY major, gpa DESC;
Задание 4 — LATERAL + DISTINCT ON
Задание 4: LATERAL JOIN + DISTINCT ON
⏱️ Примерное время: 35-45 минутИспользуй LATERAL для топ-N и DISTINCT ON для уникальных записей.
Требования:
- LATERAL + LIMIT 3 / 5
- DISTINCT ON (student_id) ORDER BY ... DESC
- CROSS JOIN LATERAL (...) AS top
Пример:
SELECT
major,
top_student.student_name,
top_student.gpa
FROM (
SELECT DISTINCT ON (major) major
FROM students
) m
CROSS JOIN LATERAL (
SELECT
first_name || ' ' || last_name AS student_name,
gpa
FROM students s
WHERE s.major = m.major
ORDER BY gpa DESC
LIMIT 1
) AS top_student;
Задание 5 — Итоговое: Аналитический отчёт
Задание 5: Полный аналитический отчёт (итоговое)
⏱️ Примерное время: 45-70 минутСоздай 1 большой отчёт + 3–4 отдельных аналитических запроса по базе university.
Требования:
- минимум 3 JOIN (INNER/LEFT)
- GROUP BY + HAVING
- подзапросы / EXISTS / LATERAL
- агрегаты + FILTER / STRING_AGG / JSON_AGG
- оформить красиво: AS student_name, ROUND(...,2)
- ORDER BY + LIMIT 20
Пример структуры отчёта:
-- Успеваемость по специальностям
SELECT
major,
COUNT(*) AS students,
ROUND(AVG(gpa), 3) AS avg_gpa,
COUNT(*) FILTER (WHERE gpa >= 3.7) AS excellent,
ROUND(100.0 * COUNT(*) FILTER (WHERE gpa >= 3.7) / COUNT(*), 1) AS excellent_pct
FROM students
GROUP BY major
HAVING COUNT(*) >= 2
ORDER BY avg_gpa DESC;
Это задание — полноценный аналитический отчёт, который можно показать на собеседовании.
Сложные SELECT — это когда ты начинаешь думать как аналитик, а не просто как разработчик.
JOIN + подзапросы + агрегаты + LATERAL + FILTER — это 90% всех реальных отчётов в PostgreSQL.