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-запросов.
Запомните, даже самый спокойный медведь умеет рычать, когда надо. Берегите голову, берегите данные — и пусть в вашем дне будет немного тишины, ясности и добрых переменных.
· 11.09.2025
https://t.me/BearsMind/143
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён