С какими типами сложных SQL-запросов вы работали?

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

Ответ

Работал с запросами различной степени сложности, от базовых операций до продвинутых конструкций.

Основные категории сложных запросов:

  1. JOIN-запросы: INNER JOIN, LEFT/RIGHT OUTER JOIN, CROSS JOIN, SELF JOIN.
  2. Агрегация и группировка: GROUP BY с агрегатными функциями (COUNT, SUM, AVG, MAX, MIN) и фильтрацией результатов через HAVING.
  3. Подзапросы: Коррелированные и некоррелированные подзапросы в SELECT, FROM, WHERE.
  4. Оконные функции (Window Functions): ROW_NUMBER(), RANK(), SUM(...) OVER (PARTITION BY ... ORDER BY ...) для аналитики без группировки итоговых строк.
  5. Общие табличные выражения (CTE): WITH ... AS для структурирования сложных запросов и рекурсивных выборок.

Пример сложного запроса с JOIN, агрегацией и HAVING:

SELECT
    u.id,
    u.name,
    COUNT(o.id) AS total_orders,
    SUM(o.amount) AS total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.registration_date >= '2024-01-01'
GROUP BY u.id, u.name
HAVING COUNT(o.id) > 3 AND SUM(o.amount) > 1000
ORDER BY total_spent DESC;

Сопутствующие задачи оптимизации:

  • Анализ планов выполнения (EXPLAIN ANALYZE).
  • Проектирование и создание эффективных индексов.
  • Написание и оптимизация хранимых процедур и триггеров.
  • Работа с транзакциями для обеспечения ACID-свойств.