← Все уроки

SQL с нуля. Часть 6: подзапросы и CTE (WITH)

Часть 6 учебника SQL. Подзапросы во WHERE/FROM/SELECT. CTE через WITH — читаемая альтернатива. Когда что выбирать. Соображения о производительности.

Урок курса «SQL с нуля» — открой бесплатной регистрацией
Ниже — план урока. Зарегистрируйся за 30 секунд, чтобы открыть полную теорию и 9 задач с автопроверкой прямо в браузере (PostgreSQL и SQLite с автопроверкой), сохранять прогресс и пройти все 10 частей бесплатно.
CTE flow: каждая WITH — отдельный шаг сверху вниз, финальный SELECT собирает результат

TL;DR: Подзапрос — это SELECT внутри другого SELECT. Может быть во FROM (подзапрос-таблица), WHERE (фильтр-условие), SELECT (значение колонки). CTE (WITH name AS (SELECT...)) — именованный подзапрос, читается сверху вниз. Для сложных запросов CTE предпочтительнее.

В этой части:

Что разберёшь в этом уроке

Частые вопросы

Что такое подзапрос?

Подзапрос — SELECT внутри другого SELECT, в скобках.

Простой пример: «юзеры с выручкой > среднего»:

Где может быть подзапрос — 3 места?

МестоПримерЧто делает
FROMFROM (SELECT... ) subПодзапрос как таблица
WHEREWHERE col IN (SELECT... )Фильтр-условие
SELECTSELECT (SELECT COUNT(*)...)Значение колонки

Что такое CTE и зачем он?

CTE = Common Table Expression. Это именованный подзапрос в виде WITH name AS (SELECT...). Читается сверху вниз, не вложено.

CTE flow: каждая WITH — отдельный шаг сверху вниз, финальный SELECT собирает результат

Анимация: подзапрос в скобках выполняется первым, его результат подставляется во внешний запрос

Тот же запрос «юзеры с выручкой > среднего» через CTE:

Какие 4 причины брать CTE вместо подзапросов?

Минусы CTE:

Что такое recursive CTE?

Recursive CTE — CTE, которая ссылается на саму себя. Используется для обхода иерархий (организационная структура, BOM, граф ссылок).

Как объединить результаты двух запросов — UNION, INTERSECT, EXCEPT?

Шпаргалка: UNION/UNION ALL/INTERSECT/EXCEPT — что делает каждая операция, требования к колонкам, какую выбрать

Set-операции комбинируют результаты двух SELECT'ов (а не таблицы, как JOIN). Условие: у обоих запросов должно быть одинаковое число колонок одинаковых типов.

Free — после регистрации
0 ₽
  • Все 10 уроков курса + 92 интерактивных задач
  • 5 SQL и 5 Python-задач в тренажёре
  • 5 кейсов · 10 метрик · 1 AI-собеседование
Начать бесплатно →
Pro
1 999 ₽/мес
  • Все 576 SQL + 561 Python-задач
  • 627 кейсов · 420 метрик · 698 заданий
  • Безлимит AI-собеседований с разбором
Оформить Pro →