Уроки модуля (1/3)
Введение в CTE (WITH)
Введение в CTE (WITH)
Рано или поздно это случается со всеми: вам нужно отфильтровать данные на основе результата агрегации, затем взять этот фильтр и ПРИСОЕДИНИТЬ его к другому агрегированному запросу. Вы начинаете писать SELECT внутри SELECT, который, в свою очередь, попадает в FROM еще одного SELECT.
Результат? Спагетти SQL — запрос, который не читается ни одним человеком.
CTE (общие табличные выражения) позволяют распутать этот беспорядок. Вы активируете их с помощью ключевого слова WITH, которое позволяет вам определять временные именованные запросы, а затем повторно использовать их как «виртуальные таблицы» в конечном запросе.
Основной синтаксис
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, как если бы это была настоящая таблица! И это гораздо более читабельно, чем мега-внутреннее соединение с вложенными подзапросами.
Нам нужны очень дорогие продукты. Используйте CTE под названием «luxury_products», чтобы выбрать «id» и «цену» из «продуктов», где «цена > 500». Затем запустите основной запрос к этому CTE и покажите все (*).
Показать подсказку
Начните с With Luxury_products AS (...), затем SELECT * FROM Luxury_products.
Решение доступно после 3 попыток
Мы хотим найти пользователей, которые пишут отзывы. Создайте CTE «рецензенты», который извлекает уникальные (DISTINCT) значения «customer_id» из «отзывов». Затем извлеките «id», «first_name», «last_name» из таблицы «customers» и \`JOIN\` с CTE «reviewers» по идентификатору.
Показать подсказку
С рецензентами КАК (ВЫБЕРИТЕ ОТЛИЧНЫЙ идентификатор клиента ИЗ отзывов) ВЫБЕРИТЕ идентификатор, имя, фамилию ОТ клиентов ПРИСОЕДИНЯЙТЕСЬ к рецензентам НА клиентов.id = reviewers.customer_id;
Решение доступно после 3 попыток