😲 CTE vs Представления (VIEW - вьюхи) в SQL — простое объяснение: что это такое и в чём разница? Часть 1.
Многие путают CTE (Common Table Expressions) и представления (VIEW), потому что оба позволяют создавать “временные таблички” из запросов. Но под капотом они работают по-разному: CTE — для одного запроса, а представления — как сохранённые ярлыки. Давайте разберёмся на простых примерах.
Представим что у нас в базе данных есть таблица sales (продажи в магазине:
id | user_id | product | amount | date
1 | 101 | Кофе | 500 | 2025-01-15
2 | 102 | Чай | 300 | 2025-01-16
3 | 101 | Печенье | 200 | 2025-01-17
4 | 103 | Кофе | 500 | 2025-01-18
1️⃣ Что такое представления (VIEW)?
Представление — это просто сохранённый SQL-запрос, который выглядит и работает как обычная таблица. Оно не хранит данные физически — каждый раз при обращении запрос выполняется заново, показывая свежие данные. Есть два типа: постоянные (живут пока не удалишь) и временные (исчезают с закрытием сеанса).
Сеанс — это период времени от подключения к базе данных до отключения от неё. Представьте: вы открываете DBeaver или другой SQL-клиент, подключаетесь к серверу — начинается сеанс. Вы выполняете запросы, создаёте временные объекты. Закрываете программу, отваливается соединение или истекает таймаут — сеанс заканчивается.
Пример постоянного представления:
-- Создаём постоянное VIEW
CREATE VIEW user_summary AS
SELECT user_id, COUNT(*) as order_count, SUM(amount) as total_spent
FROM sales GROUP BY user_id;
-- Используем как таблицу
SELECT * FROM user_summary WHERE total_spent > 400; -- ✅ Работает даже через неделю
Пример временного представления:
-- Создаём временное VIEW
CREATE TEMP VIEW temp_summary AS
SELECT user_id, COUNT(*) as order_count, SUM(amount) as total_spent
FROM sales GROUP BY user_id;
-- Работает в текущем сеансе
SELECT * FROM temp_summary; -- ✅
-- Новый сеанс (закрыли/открыли клиент) — исчезло
SELECT * FROM temp_summary; -- ❌ Ошибка!
2️⃣ Что такое CTE (Common Table Expressions)?
CTE — это обобщённое табличное выражение, временный результат запроса, который существует только в рамках одного SQL-запроса. Оно определяется с помощью WITH и исчезает сразу после выполнения. CTE удобно для разбиения сложных запросов на части, улучшая читаемость.
Простой пример CTE:
-- CTE для расчёта сумм по пользователям
WITH user_totals AS (
SELECT user_id, SUM(amount) as total_spent
FROM sales GROUP BY user_id
)
SELECT * FROM user_totals WHERE total_spent > 500; -- ✅ Работает в этом запросе
-- В следующем запросе CTE уже нет
SELECT * FROM user_totals; -- ❌ Ошибка!
3️⃣В чём разница между CTE и представлениями?
• Область видимости: CTE — только в одном запросе, представления — в сеансе (временные) или постоянно.
• Создание: CTE с WITH внутри запроса, представления с CREATE VIEW или CREATE TEMP VIEW.
Итог:
CTE и VIEW — это похожие инструменты, только с разным “сроком хранения”. CTE — для быстрых фишек внутри одного запроса, типа “собрал данные на лету и сразу использовал”. А представления — как готовые шаблоны, которые можно дёргать когда угодно, чтобы не писать одно и то же по сто раз.
🍸 Если вы нашли пост для себя полезным, то накидывайте реакций, чтобы я понимал, что вам эта тема интересна!
❤️Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)
❓ А вы в каких задачах используете CTE и VIEW? Знали про разницу? Делитесь в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.