SQL Pro: агрегация, JOIN и оконные функции
SQL: полный разбор от SELECT до оконных функций Этот материал — для тех, кто хочет перейти от базовых запросов к профессиональной работе с данными. Мы разберём структуру запросов, агрегацию, джойны и мощные оконные функции. Структура SQL-запроса SQL-запрос выполняется в следующем логическом порядке, который отличается от порядка написания: 1. FROM / JOIN — определить источник данных 2. WHERE — отфильтровать строки 3. GROUP BY — сгруппировать 4. HAVING — отфильтровать группы 5. SELECT — выбрать столбцы 6. ORDER BY — отсортировать 7. LIMIT / OFFSET — ограничить выдачу
Агрегатные функции SELECT department, COUNT(*) AS employee_count, AVG(salary) AS avg_salary, MAX(salary) AS max_salary FROM employees GROUP BY department HAVING AVG(salary) > 80000 ORDER BY avg_salary DESC; JOIN: виды и когда применять Понимание джойнов — ключевой навык. Вот разбор трёх основных: -- INNER JOIN: только совпадающие строки SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id; -- LEFT JOIN: все строки из левой таблицы SELECT u.name, o.total FROM users u LEFT JOIN orders o ON u.id = o.user_id; -- пользователи без заказов будут с NULL в o.total
Оконные функции (Window Functions) Оконные функции — самая мощная фича SQL для аналитики. Они вычисляют значения через набор строк, связанных с текущей, не сворачивая результат как GROUP BY. SELECT name, department, salary, -- ранг внутри каждого отдела RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank, -- накопительная сумма зарплат SUM(salary) OVER (PARTITION BY department ORDER BY salary) AS running_total, -- зарплата предыдущего сотрудника LAG(salary) OVER (PARTITION BY department ORDER BY salary) AS prev_salary FROM employees; Индексы и производительность Без правильных индексов даже простой запрос на миллионе строк будет работать секунды. Правила: Создавайте индексы по столбцам в WHERE и JOIN условиях Используйте EXPLAIN ANALYZE для анализа плана запроса Составные индексы: порядок столбцов важен (selectivity первым) Избегайте функций в WHERE — они ломают использование индекса