😲 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? Знали про разницу? Делитесь в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.

@dima_sqlit


Ссылки