适用于: Databricks SQL
Databricks Runtime
基于 SQL 查询的结果集构造没有物理数据的虚拟表。
ALTER VIEW
和 DROP VIEW
仅更改元数据。
CREATE [ OR REPLACE ] [ TEMPORARY ] VIEW [ IF NOT EXISTS ] view_name
[ column_list ]
[ schema_binding |
COMMENT view_comment |
DEFAULT COLLATION collation_name |
TBLPROPERTIES clause ] [...]
AS query
schema_binding
WITH SCHEMA { BINDING | COMPENSATION | [ TYPE ] EVOLUTION }
column_list
( { column_alias [ COMMENT column_comment ] } [, ...] )
或替换
如果已存在具有相同名称的视图,则会替换该视图。 若要替换现有视图,你必须是其所有者。
替换现有视图不会保留对原始视图授予的特权。 使用 ALTER VIEW 来保留特权。
CREATE OR REPLACE VIEW view_name
等效于后接CREATE VIEW view_name
的DROP VIEW IF EXISTS view_name
。临时的
TEMPORARY 视图仅对创建它们的会话可见,并在会话结束后被删除。
GLOBAL TEMPORARY
适用于:
Databricks Runtime
全局临时视图与系统保留的临时架构
global_temp
关联。如果不存在
仅在视图不存在时才创建该视图。 如果已存在具有此名称的视图,则忽略
CREATE VIEW
语句。最多可以指定
IF NOT EXISTS
或OR REPLACE
中的一项。-
新创建的视图的名称。 临时视图的名称不能带限定词。 完全限定的视图名称必须是独一无二的。
hive_metastore
中创建的视图只能包含字母数字 ASCII 字符和下划线 (INVALID_SCHEMA_OR_RELATION_NAME)。 模式绑定
适用于:
Databricks Runtime 15.3 及更高版本
(可选)指定视图如何适应由于基础对象定义的更改而导致的查询架构更改。
临时视图或具体化视图不支持此子句。
WITH SCHEMA BINDING
除以下情况外,如果查询的列列表发生更改,则视图将失效:
- 列列表包含一个星号子句,并且还存在其他列。 将忽略这些附加列。
- 一个或多个列的类型发生了更改,可以使用隐式强制转换规则将其安全地强制转换为原始列类型。
这是默认行为。
WITH SCHEMA COMPENSATION
除以下情况外,如果查询的列列表发生更改,则视图将失效:
- 列列表包含一个星号子句,并且还存在其他列。 将忽略这些附加列。
- 一个或多个列的类型发生了更改,可以使用显式 ANSI 强制转换规则将其强制转换为原始列类型。
WITH SCHEMA TYPE EVOLUTION
当 SQL 编译器因检测到对视图的引用而发生这种更改时,视图会将查询列列表类型的任何更改纳入其自己的定义中。
WITH SCHEMA EVOLUTION
- 此模式的行为类似于
WITH SCHEMA TYPE EVOLUTION
,如果视图不包含显式column_list
,则它还会采用列名的更改或者已添加和删除的列的更改。 - 仅当查询不再可分析,或可选视图
column_list
与query
选择列表中的表达式数量不再匹配时,视图才会失效。
- 此模式的行为类似于
column_list
(可选)在视图的查询结果中为列添加标签。 如果提供列列表,则列别名的数量必须与查询中的表达式数量一致。 如果未指定列列表,则别名派生自视图主体。
-
列别名必须是唯一的。
column_comment
描述列别名的可选
STRING
文本。
-
view_comment
提供视图级别注释的可选
STRING
字面量。默认排序规则 collation_name
适用于:
Databricks Runtime 16.3 及更高版本
在
query
中定义默认的排序规则。 如果未指定,则默认排序规则为UTF8_BINARY
a。-
可以选择设置一个或多个用户定义的属性。
AS 查询
从基表或其他视图中构造视图的查询。
-- Create or replace view for `experienced_employee` with comments.
> CREATE OR REPLACE VIEW experienced_employee
(id COMMENT 'Unique identification number', Name)
COMMENT 'View for experienced employees'
AS SELECT id, name
FROM all_employee
WHERE working_years > 5;
-- Create a temporary view `subscribed_movies`.
> CREATE TEMPORARY VIEW subscribed_movies
AS SELECT mo.member_id, mb.full_name, mo.movie_title
FROM movies AS mo
INNER JOIN members AS mb
ON mo.member_id = mb.id;
-- Create a view with schema binding (default)
> CREATE TABLE emp(name STRING, income INT);
> CREATE VIEW emp_v WITH SCHEMA BINDING AS SELECT * FROM emp;
- The view ignores adding a column to the base table
> ALTER TABLE emp ADD COLUMN bonus SMALLINT;
> SELECT * FROM emp_v;
name income
---- ------
-- The view tolerates narrowing the underlying type
> CREATE OR REPLACE TABLE emp(name STRING, income SMALLINT, bonus SMALLINT);
> SELECT typeof(income) FROM emp_v;
INTEGER
- The view does not tolerate widening the underlying type
CREATE OR REPLACE TABLE emp(name STRING, income BIGINT, bonus SMALLINT);
> SELECT typeof(income) FROM emp_v;
Error
- Create a view with SCHEMA COMPENSATION
> CREATE TABLE emp(name STRING, income SMALLINT, bonus SMALLINT);
> CREATE VIEW emp_v WITH SCHEMA COMPENSATION AS SELECT * FROM emp;
-- The view tolerates widening the underlying type but keeps its own signature fixed
CREATE OR REPLACE TABLE emp(name STRING, income INTEGER, bonus INTEGER);
> SELECT typeof(income) FROM emp_v;
INTEGER
-- The view does not tolerate dropping a needed column
ALTER TABLE emp DROP COLUMN bonus;
> SELECT * FROM emp_v;
Error
- Create a view with SCHEMA EVOLUTION
> CREATE TABLE emp(name STRING, income SMALLINT);
> CREATE VIEW emp_v WITH SCHEMA EVOLUTION AS SELECT * FROM emp;
-- The view picks up additional columns
> ALTER TABLE emp ADD COLUMN bonus SMALLINT
> SELECT * FROM emp_v;
name income bonus
---- ------ -----
-- The view picks up renamed columns as well
> ALTER TABLE emp RENAME COLUMN income TO salary SMALLINT;
> SELECT * FROM emp_v;
name salary bonus
---- ------ -----
-- The view picks up changes to column types and dropped columns
> CREATE OR REPLACE TABLE emp(name STRING, salary BIGINT);
> SELECT *, typeof(salary)AS salary_type FROM emp_v;
name salary
---- ------
-- Create a view using a default collation of UTF8_BINARY
> CREATE VIEW v DEFAULT COLLATION UTF8_BINARY
AS SELECT 5::STRING AS text;