Статьи

Что такое SQL-представления?

Вы, наверное, уже знаете о «обычных представлениях», но я уверен, что вы найдете одну или две вещи в этой статье, о которых вы еще не думали таким образом…

Что именно представляют собой SQL-представления?

Представления в SQL являются средством обработки сложных запросов так же, как «обычные» таблицы. Фактически, SQL — это все о таблицах (которые являются пакетами записей), так же как реляционная алгебра — это все об отношениях (которые являются наборами кортежей).

Существуют разные типы представлений:

«Обычные» взгляды

Они чаще всего упоминаются как «взгляды». Большинство баз данных позволяют объявлять их, используя этот синтаксис

1
2
3
4
CREATE VIEW my_view AS
SELECT col1, col2
FROM my_table
WHERE ...

Эти сохраненные представления затем становятся частью каталога, и на них можно ссылаться по именам, как таблицы, что отлично подходит для повторного использования. И что еще более важно, вы можете предоставить иной набор привилегий для представлений, чем для таблиц, что позволяет реализовать полный уровень безопасности только с использованием представлений (например, скрытие некоторых столбцов или строк от определенных пользователей).

Некоторые базы данных (включая Oracle, PostgreSQL) даже позволяют обновлять их при определенных обстоятельствах — в основном, когда они однозначны, 1-1 сопоставления одной таблицы, которая не производит никаких вычислений или денормализаций.

Материализованные взгляды

Так же, как и вышеупомянутые «обычные представления», материализованные представления могут использоваться как таблицы Фактически они являются таблицами, поскольку их данные хранятся на диске и обновляются каждый раз, когда обновляется их содержимое. Они полезны для частых, сложных запросов к редко обновляемым данным.

Просто добавьте ключевое слово MATERIALIZED и все готово:

1
2
3
4
CREATE MATERIALIZED VIEW my_view AS
SELECT col1, col2
FROM my_table
WHERE ...

Среди прочего, Oracle и PostgreSQL поддерживают материализованные представления . Другие базы данных, такие как SQL Server, знают об «индексированных представлениях» , которые немного менее эффективны, так как вам необходимо явно «материализовать» данные вашего представления в индексах.

«Снимок» просмотров

Это не совсем представления, а настоящие таблицы. Но в контексте этого поста в блоге вы можете думать о них как о постоянно материализуемом «снимке» представления ваших данных. Вы можете создавать такие представления, используя разные синтаксисы:

Большинство баз данных, например Oracle

1
2
3
4
CREATE TABLE my_view AS
SELECT col1, col2
FROM my_table
WHERE ...

Некоторые базы данных, например, SQL Server

1
2
3
4
SELECT col1, col2
INTO my_view
FROM my_table
WHERE ...

Приятной особенностью этого подхода является тот факт, что, как и материализованные представления, эти «представления» могут быть очень полезны для частых запросов — вам нужно предварительно рассчитать данные только один раз. Но как только вы вычислили эти данные, вы генерируете их «снимок», и данные могут продолжать жить независимо от вашего представления — точно так же, как снимок! (не забудьте добавить соответствующие индексы, хотя)

Обратите внимание, что некоторые базы данных, в том числе DB2 и Oracle, поддерживают реальные «снимки» стандарта SQL: 2011, такие как запросы обратной памяти в Oracle или запросы перемещения во времени в DB2 . Это другая история.

Параметризованные представления

Мало кто называет эти взгляды «взглядами», но если подумать, это то, чем они на самом деле являются. Табличные функции — это хранимые процедуры, которые возвращают таблицы, которые затем могут снова использоваться в SQL. Например (с использованием синтаксиса PostgreSQL):

01
02
03
04
05
06
07
08
09
10
11
12
13
CREATE FUNCTION my_view (arg1 INTEGER, arg2 INTEGER)
RETURNS TABLE (
    col1 INTEGER
    col2 INTEGER
)
AS $$
BEGIN
    RETURN QUERY
    SELECT col1, col2
    FROM my_table
    WHERE v1 = arg2 AND v2 = arg2;
END
$$ LANGUAGE plpgsql;

А потом…

1
2
3
SELECT *
FROM my_view (42, 1337)
WHERE ...

Это довольно мощно, не так ли? Среди прочего, Firebird, HANA, HSQLDB, Oracle, PostgreSQL, SQL Server поддерживают табличные функции.

Общие табличные выражения

Как и обычные представления, эти представления именуются, но они ограничиваются только одним оператором — в основном оператором SELECT, хотя PostgreSQL или SQL Server также допускают использование общих табличных выражений с другими операторами DML. Эти «взгляды» можно записать так:

01
02
03
04
05
06
07
08
09
10
WITH
    my_view_a AS (
        SELECT ...
    ),
    my_view_b AS (
        SELECT ...
    )
-- To be consumed immediately by a statement
SELECT *
FROM my_view_a, my_view_b

Хотя общие табличные выражения очень полезны для структурирования кода (они похожи на «табличные переменные»), они имеют цену в Oracle или PostgreSQL, поскольку представление чаще всего временно материализуется, что предотвращает множество преобразований SQL в оптимизаторе , С другой стороны, обычные табличные выражения могут быть рекурсивными / иерархическими, что отлично подходит для обхода графа / дерева.

Производные таблицы

Наиболее распространенным типом представлений (хотя их редко называют «представлениями») являются производные таблицы, то есть все вложенные операторы выбора, которые помещаются в предложение FROM. Например:

1
2
3
4
5
6
SELECT *
FROM (
    SELECT ...
) my_view_a, (
    SELECT ...
) my_view_b

В отличие от общих табличных выражений, производные таблицы не могут быть легко использованы повторно в операторе, но велика вероятность, что их можно оптимизировать в другой оператор с более высокой производительностью.

Вывод

SQL это все о таблицах и перекомпоновке таблиц в специальных запросах. Наиболее важным предложением любого оператора SQL является предложение FROM . Он определяет набор кортежей, которые вы хотите перекомпоновывать, фильтровать, группировать, проектировать различными способами. Как мы видели выше, вы можете легко передать любое такое преобразование таблицы в еще одно преобразование с помощью одного из вышеуказанных способов создания представлений.

Хотите узнать больше? Прочитайте нашу популярную статью « 10 простых шагов к полному пониманию SQL »

Ссылка: Что такое SQL-представления? от нашего партнера JCG Лукаса Эдера в блоге JAVA, SQL и JOOQ .