Что такое представление (View) в SQL и как вы его использовали?

«Что такое представление (View) в SQL и как вы его использовали?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Представление (View) — это виртуальная таблица, результат сохраненного SQL-запроса. Данные физически не дублируются, представление обращается к данным базовых таблиц при каждом вызове.

Основные цели использования:

  1. Абстракция и упрощение: Сокрытие сложности многотабличных запросов с JOIN и агрегациями.

    CREATE VIEW order_summary AS
    SELECT 
        o.id, 
        o.order_date,
        c.name as customer_name,
        SUM(oi.quantity * oi.unit_price) as total_amount
    FROM orders o
    JOIN customers c ON o.customer_id = c.id
    JOIN order_items oi ON o.id = oi.order_id
    GROUP BY o.id, o.order_date, c.name;
    
    -- Теперь сложный запрос становится простым
    SELECT * FROM order_summary WHERE total_amount > 1000;
  2. Контроль доступа (безопасность): Можно предоставить пользователю доступ только к определенным столбцам и строкам через View, скрыв чувствительные данные или всю структуру таблиц.

    CREATE VIEW public_employee_info AS
    SELECT id, first_name, last_name, department FROM employees;
    -- Зарплата (salary) и другие поля скрыты.
  3. Обеспечение согласованности: Представление может гарантировать, что все пользователи работают с одними и теми же вычисляемыми полями или условиями отбора.

Важные особенности:

  • Материализованные представления (Materialized Views): В некоторых СУБД (PostgreSQL, Oracle) данные могут кэшироваться физически для повышения производительности, с возможностью периодического обновления (REFRESH MATERIALIZED VIEW).
  • Обновляемые представления: Не все представления допускают операции INSERT/UPDATE/DELETE. Это возможно, обычно, только для простых представлений, основанных на одной таблице.
  • Производительность: Неоптимизированное представление с тяжелыми JOIN и агрегациями может снижать производительность. Важно индексировать базовые таблицы.