Вы, наверное, уже знаете о «обычных представлениях», но я уверен, что вы найдете одну или две вещи в этой статье, о которых вы еще не думали таким образом…
Что именно представляют собой 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 . |