Перейти к основному содержимому
Модуль 14 · Урок 1 из 353/57 в курсе~12 min
Уроки модуля (1/3)

Введение в CTE (WITH)

Введение в CTE (WITH)

Рано или поздно это случается со всеми: вам нужно отфильтровать данные на основе результата агрегации, затем взять этот фильтр и ПРИСОЕДИНИТЬ его к другому агрегированному запросу. Вы начинаете писать SELECT внутри SELECT, который, в свою очередь, попадает в FROM еще одного SELECT.

Результат? Спагетти SQL — запрос, который не читается ни одним человеком.

CTE (общие табличные выражения) позволяют распутать этот беспорядок. Вы активируете их с помощью ключевого слова WITH, которое позволяет вам определять временные именованные запросы, а затем повторно использовать их как «виртуальные таблицы» в конечном запросе.

Основной синтаксис

SQL
WITH premium_customers AS (
  SELECT customer_id, SUM(total_amount) AS total_spent
  FROM orders
  GROUP BY customer_id
  HAVING SUM(total_amount) > 1000
)
SELECT customers.first_name, premium_customers.total_spent
FROM customers
JOIN premium_customers ON customers.id = premium_customers.customer_id;

Как видите, основной запрос внизу читается из premium_customers, как если бы это была настоящая таблица! И это гораздо более читабельно, чем мега-внутреннее соединение с вложенными подзапросами.

Упражнение#sql.m14.l1.e1
Попыток: 0Загрузка…

Нам нужны очень дорогие продукты. Используйте CTE под названием «luxury_products», чтобы выбрать «id» и «цену» из «продуктов», где «цена > 500». Затем запустите основной запрос к этому CTE и покажите все (*).

Загрузка редактора…
Показать подсказку

Начните с With Luxury_products AS (...), затем SELECT * FROM Luxury_products.

Решение доступно после 3 попыток

Упражнение#sql.m14.l1.e2
Попыток: 0Загрузка…

Мы хотим найти пользователей, которые пишут отзывы. Создайте CTE «рецензенты», который извлекает уникальные (DISTINCT) значения «customer_id» из «отзывов». Затем извлеките «id», «first_name», «last_name» из таблицы «customers» и \`JOIN\` с CTE «reviewers» по идентификатору.

Загрузка редактора…
Показать подсказку

С рецензентами КАК (ВЫБЕРИТЕ ОТЛИЧНЫЙ идентификатор клиента ИЗ отзывов) ВЫБЕРИТЕ идентификатор, имя, фамилию ОТ клиентов ПРИСОЕДИНЯЙТЕСЬ к рецензентам НА клиентов.id = reviewers.customer_id;

Решение доступно после 3 попыток