SQL (7/14)

💻Работа с подзапросами и CTE: как их использовать в SQL (7/14)

Пост с красивой разметкой в тг канале, ссылка в комментах.

В SQL есть несколько способов вложить один запрос в другой, и два самых популярных — это подзапросы (Subqueries) и CTE (Common Table Expressions). Знать, когда и как применять каждый из них — полезный навык для аналитика, который хочет писать чистый и понятный код.

Подзапросы (Subqueries)

Подзапрос — это запрос внутри другого запроса, который может находиться в разных частях: в SELECT, в WHERE или в FROM.

Пример в SELECT:  Допустим, вам нужно вывести список клиентов с их средним чеком:  SELECT    customer_id,    (SELECT AVG(amount) FROM orders WHERE orders.customer_id = customers.customer_id) AS avg_order  FROM customers;

Здесь мы для каждого клиента вычисляем средний чек во вложенном запросе.

Пример в WHERE:  Найти клиентов, у которых средний чек больше 1000:  SELECT customer_id  FROM customers  WHERE (SELECT AVG(amount) FROM orders WHERE orders.customer_id = customers.customer_id) > 1000;

Пример в FROM:  Можно использовать подзапрос как временную таблицу:  SELECT avg_order  FROM (    SELECT customer_id, AVG(amount) AS avg_order    FROM orders    GROUP BY customer_id  ) AS sub  WHERE avg_order > 1000;

CTE (WITH) — Common Table Expressions

CTE - это временная именованная таблица, объявленная прямо внутри запроса, которая упрощает чтение и поддержку кода. Её удобно использовать, когда подзапросы сложные или повторяются.

Пример:  WITH avg_orders AS (    SELECT customer_id, AVG(amount) AS avg_order    FROM orders    GROUP BY customer_id  )  SELECT *  FROM avg_orders  WHERE avg_order > 1000;

CTE особенно полезен, когда нужно делать многоступенчатые преобразования — разбивать большой запрос на логические куски.

В чём отличие?

  • Подзапросы можно использовать прямо внутри SELECT, WHERE и FROM, но если запрос начинает быть сложным, код становится трудно читаемым.
  • CTE позволяет дать имя промежуточному результату и использовать его по нескольку раз в основном запросе, что улучшает структуру и удобство работы.

Советы для практики

🎯Для быстрого решения и небольших задач подойдут подзапросы в WHERE или SELECT.  🎯Для прозрачности и масштабируемости кода лучше использовать CTE, особенно если нужно много логических шагов или повторений.  🎯Всегда проверяйте план выполнения, иногда подзапросы могут работать медленнее, чем CTE или наоборот, в зависимости от СУБД.

Поняв эти 2 подхода, вы значительно расширите ваши возможности в написании эффективных и читабельных SQL-запросов.

Запомните, даже самый спокойный медведь умеет рычать, когда надо. Берегите голову, берегите данные — и пусть в вашем дне будет немного тишины, ясности и добрых переменных.