Какой сложности SQL-запросы вам приходилось писать?

«Какой сложности SQL-запросы вам приходилось писать?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Приходилось писать запросы от средней до высокой сложности, включая:

  • Сложные JOIN: INNER, LEFT/RIGHT OUTER, CROSS JOIN для связей между множеством таблиц.
  • Агрегатные функции и группировка: SUM(), COUNT(), AVG() с GROUP BY и HAVING.
  • Подзапросы: Коррелированные и некоррелированные подзапросы в SELECT, FROM, WHERE.
  • Оконные функции (Window Functions): Для аналитики без свёртки строк.
  • Общие табличные выражения (CTE): В том числе рекурсивные CTE для работы с иерархическими данными.
  • Оптимизация: Анализ плана выполнения (EXPLAIN), создание и использование индексов для ускорения запросов.

Пример сложного запроса с оконной функцией и подзапросом:

WITH DepartmentStats AS (
    SELECT 
        department_id,
        AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department_id
)
SELECT 
    e.employee_id,
    e.name,
    e.salary,
    e.department_id,
    ds.avg_salary,
    RANK() OVER (PARTITION BY e.department_id ORDER BY e.salary DESC) as salary_rank_in_dept
FROM employees e
JOIN DepartmentStats ds ON e.department_id = ds.department_id
WHERE e.salary > ds.avg_salary
ORDER BY e.department_id, salary_rank_in_dept;

Этот запрос находит сотрудников, чья зарплата выше средней по их отделу, и ранжирует их внутри отдела.