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

Введення в CTE (З)

Введення в CTE (З)

Рано чи пізно це трапляється з кожним: вам потрібно відфільтрувати дані на основі результатів агрегації, потім взяти цей фільтр і ПРИЄДНАТИ його з іншим агрегованим запитом. Ви починаєте писати SELECT всередині SELECT, який, у свою чергу, потрапляє в FROM ще одного SELECT.

Результат? Spaghetti 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» і «price» із «products», де «price > 500». Потім запустіть основний запит для цього CTE та покажіть усе (*).

Завантаження редактора…
Показати підказку

Почніть із WITH luxury_products AS (...), потім ВИБЕРІТЬ * FROM luxury_products.

Рішення доступне після 3 спроб

вправи#sql.m14.l1.e2
Спроби: 0Завантаження…

Ми хочемо знайти користувачів, які пишуть відгуки. Створіть CTE 'reviewers', який витягує унікальні (DISTINCT) значення 'customer_id' з 'reviews'. Потім витягніть 'id', 'first_name', 'last_name' з таблиці 'customers' і \`ПРИЄДНАЙТЕ\` її з CTE 'reviewers' на id.

Завантаження редактора…
Показати підказку

З рецензентами AS (ВИБЕРІТЬ Окремий customer_id З відгуків) ВИБЕРІТЬ id, first_name, last_name FROM клієнтів ПРИЄДНУЙТЕСЯ до рецензентів ON customers.id = reviewers.customer_id;

Рішення доступне після 3 спроб