CREATE VIEW
適用於:Databricks SQL Databricks Runtime
根據 SQL 查詢的結果set,建構沒有實體數據的虛擬 table。
ALTER VIEW
和 DROP VIEW
只會變更元數據。
語法
CREATE [ OR REPLACE ] [ TEMPORARY ] VIEW [ IF NOT EXISTS ] view_name
[ column_list ]
[ schema_binding |
COMMENT view_comment |
TBLPROPERTIES clause [...]
AS query
schema_binding
WITH SCHEMA { BINDING | COMPENSATION | [ TYPE ] EVOLUTION }
column_list
( { column_alias [ COMMENT column_comment ] } [, ...] )
Parameters
或 REPLACE
如果已有相同名稱的檢視存在,則會加以取代。 若要取代現有的檢視,您必須是其擁有者。
取代現有的檢視並不會保留原始檢視上授與的許可權。 使用 ALTER VIEW 來保留許可權。
TEMPORARY
暫時性 views 只對創建它們的工作階段可見,並且會在工作階段結束時被刪除。
全域暫存
適用於: Databricks Runtime
GLOBAL TEMPORARY views 會連結至系統保留的暫存 schema
global_temp
。IF NOT EXISTS
只有在檢視不存在時,才會建立檢視。 如果這個名稱的檢視已經存在,
CREATE VIEW
則會忽略 語句。您最多可以指定
IF NOT EXISTS
或OR REPLACE
中的一個。-
新建立的檢視的名稱。 暫存檢視的名稱不得限定。 完整檢視名稱必須唯一。
在
hive_metastore
中建立的 Views 只能包含字母數字 ASCII 字元和底線(INVALID_SCHEMA_OR_RELATION_NAME)。 schema_binding
適用於: Databricks Runtime 15.3 和更新版本
選擇性地指定檢視如何因基礎物件定義變更而適應查詢 schema 的變更。
暫時 views 或具體化 views不支持這個子句。
配有 SCHEMA 裝訂
如果查詢 column-list 變更,則檢視會變成無效,但下列條件除外:
- column-list 包含星號條款,還有額外的 columns。 這些額外的 columns 會被忽略。
- 一個或多個 columns 的類型發生變更,使得它們可以按照隱式轉換規則安全地轉換回原始 column 類型。
此為預設行為。
與 SCHEMA 賠償
若查詢 columnlist 發生變更,除非符合以下條件,否則檢視將會失效:
- column-list 包含明星條款,還有額外的 columns。 這些額外的 columns 會被忽略。
- 一或多個 columns 的類型已變更,使得它們能夠透過明確的 ANSI 轉換規則轉換成原始 column 類型。
與 SCHEMA 類型演進
當 SQL 編譯器檢測到對檢視的引用發生變更時,檢視將採取查詢 columnlist 中類型的任何變更,作為其自身定義的一部分。
SCHEMA 演進
- 此模式的行為與
WITH SCHEMA TYPE EVOLUTION
相似,並且如果檢視中不包含明確的column_list
,則也會採用 column 名稱的變更,或加入和卸除 columns。 - 只有當查詢無法再被剖析或者選用的檢視
column_list
與query
select-list 中的運算式數目不匹配時,檢視才會變成無效。
- 此模式的行為與
column_list
選擇性地在檢視的查詢結果中標記 columns。 如果您提供了 columnlist 那麼 column 別名的數目必須符合查詢中的表達式數目。 若未指定 columnlist,則會從檢視的主體中衍生別名。
-
column 別名必須是唯一的。
column_comment
描述 column 別名的可選的
STRING
常值。
-
view_comment
提供檢視層級批注的選擇性
STRING
常值。-
選擇性地設定一個或多個使用者定義的屬性。
AS 查詢
從基底 tables 或其他 views建構檢視的查詢。
範例
-- 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
---- ------