適用対象: Databricks SQL
Databricks Runtime
SQL クエリの結果セットまたは yaml 仕様に基づくメトリック ビューに基づいて、物理データを持たない仮想テーブルを構築します。 ALTER VIEW および DROP VIEW は、メタデータのみを変更します。
このステートメントを実行するには、メタストア管理者であるか、ターゲット スキーマのUSE CATALOG
権限と共に、カタログとスキーマに対するUSE SCHEMA
およびCREATE TABLE
権限を持っている必要があります。
このコマンドを実行しているユーザーは、ビューの所有者になります。
構文
CREATE [ OR REPLACE ] [ TEMPORARY ] VIEW [ IF NOT EXISTS ] view_name
[ column_list ]
[ with_clause |
COMMENT view_comment |
DEFAULT COLLATION collation_name |
TBLPROPERTIES clause |
LANGUAGE YAML ] [...]
AS { query | $$ yaml_string $$ }
with_clause
WITH { { schema_binding | METRICS } |
( { schema_binding | METRICS } [, ...] } )
schema_binding
WITH SCHEMA { BINDING | COMPENSATION | [ TYPE ] EVOLUTION }
column_list
( { column_alias [ COMMENT column_comment ] } [, ...] )
パラメーター
または置換する
同じ名前のビューが既に存在する場合は、そのビューが置き換えられます。 既存のビューを置き換えるには、その所有者である必要があります。
既存のビューを置き換えると、元のビューで付与された権限は保持されません。 ALTER VIEW を使用して特権を保持します。
CREATE OR REPLACE VIEW view_name
は、DROP VIEW IF EXISTS view_name
の後にCREATE VIEW view_name
が続くのと同じです。一時的
TEMPORARY
ビューは、それらを作成したセッションにのみ表示され、セッションの終了時に削除されます。グローバルテンポラリー
適用対象:
Databricks Runtime
GLOBAL TEMPORARY
ビューは、システムによって保持される一時スキーマglobal_temp
に関連付けられます。存在しない場合
存在しない場合にのみビューを作成します。 この名前のビューが既に存在する場合、
CREATE VIEW
ステートメントは無視されます。IF NOT EXISTS
かOR REPLACE
のいずれか 1 つだけを指定できます。-
新しく作成されたビューの名前。 一時ビューの名前を修飾することはできません。 完全修飾のビュー名は一意にする必要があります。
hive_metastore
で作成されたビュー名には、英数字の ASCII 文字とアンダースコア (INVALID_SCHEMA_OR_RELATION_NAME) のみを含めることができます。 メトリック
適用対象:
Databricks SQL
Databricks Runtime 16.4以降
Unity Catalogのみ
ビューをメトリック ビューとして識別します。 ビューは
LANGUAGE YAML
で定義する必要があり、ビューの本文は有効な yaml 仕様である必要があります。この句は、一時ビューではサポートされていません。
メトリック ビューでは、
DEFAULT COLLATION
句とschema_binding
句はサポートされていません。メトリック ビューの YAML 仕様では、
dimensions
とmeasures
が定義されます。dimensions
は、呼び出し元がメジャーを集計できるビューの列であり、measures
はビューの集計を定義します。メトリック ビューの呼び出し側は、集計関数を指定する代わりに、 メジャー 式を使用して定義されたメジャーにアクセスします。
schema_binding
適用対象:
Databricks Runtime 15.3 以降
必要に応じて、基になるオブジェクト定義の変更によるクエリのスキーマの変更に、ビューがどのように適応するかを指定します。
この句は、一時ビュー、メトリック ビュー、または具体化されたビューではサポートされていません。
SCHEMA バインディング
次の条件を除き、クエリの列リストが変更された場合、ビューは無効になります。
- 列リストには star 句が含まれており、追加の列があります。 これらの追加の列は無視されます。
- 1 つ以上の列の型が、暗黙的なキャストの規則を使用して元の列型に安全にキャストできるように変更されました。
これが既定の動作です。
SCHEMA 補償
次の条件を除き、クエリの列リストが変更された場合、ビューは無効になります。
- 列リストには star 句が含まれており、追加の列があります。 これらの追加の列は無視されます。
- 1 つ以上の列の型が、明示的な ANSI のキャストの規則を使用して元の列型にキャストできるように変更されました。
SCHEMA 型の進化
SQL コンパイラがビューへの参照への応答でこのような変更を検出すると、ビューはクエリの列リスト内の型の変更を独自の定義に採用します。
SCHEMA 進化
- このモードは
SCHEMA TYPE EVOLUTION
のように動作し、ビューに明示的なcolumn_list
が含まれていない場合は、列名の変更や追加および削除された列も採用します。 - クエリを解析できなくなったとき、または省略可能なビュー
column_list
がquery
選択リスト内の式の数と一致しなくなった場合のみ、ビューは無効になります。
- このモードは
column_list
必要に応じて、ビューのクエリ結果内の列にラベルを付けます。 列リストを指定する場合、列エイリアスの数はクエリ内の式の数と一致する必要があります。メトリック ビューの場合は YAML 仕様です。 列リストが指定されていない場合、別名はビューの本体から引き出されます。
-
列の別名は一意にする必要があります。
column_comment
列の別名について説明する、省略可能な
STRING
リテラル。
-
view_comment
ビューレベルのコメントを提供する省略可能な
STRING
リテラルです。既定の照合順序 collation_name
適用対象:
Databricks SQL
Databricks Runtime 16.3以降
query
内で使用する既定の照合順序を定義します。 指定しない場合、既定の照合順序はUTF8_BINARY
a です。この句は、メトリック ビューではサポートされていません。
-
必要に応じて、1 つ以上のユーザー定義プロパティを設定します。
AS クエリ
ベース テーブルまたはその他のビューからビューを構築するクエリです。
この句は、メトリック ビューではサポートされていません。
AS $$ yaml_string $$
メトリック ビューを定義する yaml 仕様。
例
-- 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;
-- Creates a Metric View as specified in the YAML definition, with three dimensions and four measures representing the count of orders.
> CREATE OR REPLACE VIEW region_sales_metrics
(month COMMENT 'Month order was made',
status,
order_priority,
count_orders COMMENT 'Count of orders',
total_Revenue,
total_Revenue_p_Customer,
total_revenue_for_open_orders)
WITH METRICS
LANGUAGE YAML
COMMENT 'A Metric View for regional sales metrics.'
AS $$
version: 0.1
source: samples.tpch.orders
filter: o_orderdate > '1990-01-01'
dimensions:
- name: month
expr: date_trunc('MONTH', o_orderdate)
- name: status
expr: case
when o_orderstatus = 'O' then 'Open'
when o_orderstatus = 'P' then 'Processing'
when o_orderstatus = 'F' then 'Fulfilled'
end
- name: prder_priority
expr: split(o_orderpriority, '-')[1]
measures:
- name: count_orders
expr: count(1)
- name: total_revenue
expr: SUM(o_totalprice)
- name: total_revenue_per_customer
expr: SUM(o_totalprice) / count(distinct o_custkey)
- name: total_revenue_for_open_orders
expr: SUM(o_totalprice) filter (where o_orderstatus='O')
$$;
> DESCRIBE EXTENDED region_sales_metrics;
col_name data_type
------------------------------ --------------------------
month timestamp
status string
order_priority string
count_orders bigint measure
total_revenue decimal(28,2) measure
total_revenue_p_customer decimal(38,12) measure
total_revenue_for_open_orders decimal(28,2) measure
# Detailed Table Information
Catalog main
Database default
Table region_sales_metrics
Owner alf@melmak.et
Created Time Thu May 15 13:03:01 UTC 2025
Last Access UNKNOWN
Created By Spark
Type METRIC_VIEW
Comment A Metric View for regional sales metrics.
Use Remote Filtering false
View Text "
version: 0.1
source: samples.tpch.orders
filter: o_orderdate > '1990-01-01'
dimensions:
- name: month
expr: date_trunc('MONTH', o_orderdate)
- name: status
expr: case
when o_orderstatus = 'O' then 'Open'
when o_orderstatus = 'P' then 'Processing'
when o_orderstatus = 'F' then 'Fulfilled'
end
- name: Order_Priority
expr: split(o_orderpriority, '-')[1]
measures:
- name: count_orders
expr: count(1)
- name: total_Revenue
expr: SUM(o_totalprice)
- name: total_Revenue_per_Customer
expr: SUM(o_totalprice) / count(distinct o_custkey)
- name: Total_Revenue_for_Open_Orders
expr: SUM(o_totalprice) filter (where o_orderstatus='O')
"
Language YAML
Table Properties [metric_view.from.name=samples.tpch.orders, metric_view.from.type=ASSET, metric_view.where=o_orderdate > '1990-01-01']
-- Tracking total_revenue_per_customer by month in 1995
> SELECT extract(month from month) as month,
measure(total_revenue_per_customer)::bigint AS total_revenue_per_customer
FROM region_sales_metrics
WHERE extract(year FROM month) = 1995
GROUP BY ALL
ORDER BY ALL;
month total_revenue_per_customer
----- --------------------------
1 167727
2 166237
3 167349
4 167604
5 166483
6 167402
7 167272
8 167435
9 166633
10 167441
11 167286
12 167542
-- Tracking total_revenue_per_customer by month and status in 1995
> SELECT extract(month from month) as month,
status,
measure(total_revenue_per_customer)::bigint AS total_revenue_per_customer
FROM region_sales_metrics
WHERE extract(year FROM month) = 1995
GROUP BY ALL
ORDER BY ALL;
month status total_revenue_per_customer
----- --------- --------------------------
1 Fulfilled 167727
2 Fulfilled 161720
2 Open 40203
2 Processing 193412
3 Fulfilled 121816
3 Open 52424
3 Processing 196304
4 Fulfilled 80405
4 Open 75630
4 Processing 196136
5 Fulfilled 53460
5 Open 115344
5 Processing 196147
6 Fulfilled 42479
6 Open 160390
6 Processing 193461
7 Open 167272
8 Open 167435
9 Open 166633
10 Open 167441
11 Open 167286
12 Open 167542