使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

Google 标准 SQL 中的数据定义语言 (DDL) 语句

通过数据定义语言 (DDL) 语句,您可以使用 Google 标准 SQL 查询语法创建和修改 BigQuery 资源。您可以使用 DDL 命令创建、修改和删除资源,例如表克隆表快照视图用户定义的函数 (UDF) 和行级访问权限政策

所需权限

如需创建运行 DDL 语句的作业,您必须在运行该作业的项目中具有 bigquery.jobs.create 权限。每个 DDL 语句还需要对受影响的资源拥有特定权限,这些权限记录在每个语句下。

IAM 角色

预定义的 IAM 角色 bigquery.userbigquery.jobUserbigquery.admin 可提供所需的 bigquery.jobs.create 权限。

如需详细了解 BigQuery 中的 IAM 角色,请参阅预定义角色和权限IAM 权限参考文档

运行 DDL 语句

如需运行 DDL 语句,您可以使用 Google Cloud 控制台、bq 命令行工具、调用 jobs.query REST API 或以编程方式使用 BigQuery API 客户端库

控制台

  1. 在 Google Cloud Console 中转到 BigQuery 页面。

    转到 BigQuery

  2. 点击编写新查询

    编写新查询。

  3. 查询编辑器文本区域中,输入 DDL 语句。例如:

     CREATE TABLE mydataset.newtable ( x INT64 )
     

  4. 点击运行

bq

输入 bq query 命令并提供 DDL 语句作为查询参数。将 use_legacy_sql 标志设置为 false

bq query --use_legacy_sql=false \
  'CREATE TABLE mydataset.newtable ( x INT64 )'

API

调用 jobs.query 方法并在请求正文的 query 属性中提供 DDL 语句。

DDL 功能会扩展作业资源返回的信息。statistics.query.statementType 包含以下其他值以提供 DDL 支持:

  • CREATE_TABLE
  • CREATE_TABLE_AS_SELECT
  • DROP_TABLE
  • CREATE_VIEW
  • DROP_VIEW

statistics.query 有 2 个附加字段:

  • ddlOperationPerformed:执行的 DDL 操作,可能取决于是否存在 DDL 目标。当前值包括:
    • CREATE:查询创建了 DDL 目标。
    • SKIP:无操作发生。示例 - 提交了 CREATE TABLE IF NOT EXISTS 语句,而表已存在。或者提交了 DROP TABLE IF EXISTS 语句,而表不存在。
    • REPLACE:查询替换了 DDL 目标。示例 - 提交了 CREATE OR REPLACE TABLE 语句,而表已存在。
    • DROP:查询删除了 DDL 目标。
  • ddlTargetTable:当您提交 CREATE TABLE/VIEW 语句或 DROP TABLE/VIEW 语句时,以包含 3 个字段的对象形式返回目标表:
    • “projectId”:字符串
    • “datasetId”:字符串
    • “tableId”:字符串

Java

调用 BigQuery.create() 方法,启动查询作业。调用 Job.waitFor() 方法,等待 DDL 查询完成。

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.QueryJobConfiguration;

// Sample to create a view using DDL
public class DDLCreateView {

  public static void runDDLCreateView() {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String datasetId = "MY_DATASET_ID";
    String tableId = "MY_VIEW_ID";
    String ddl =
        "CREATE VIEW "
            + "`"
            + projectId
            + "."
            + datasetId
            + "."
            + tableId
            + "`"
            + " OPTIONS("
            + " expiration_timestamp=TIMESTAMP_ADD("
            + " CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),"
            + " friendly_name=\"new_view\","
            + " description=\"a view that expires in 2 days\","
            + " labels=[(\"org_unit\", \"development\")]"
            + " )"
            + " AS SELECT name, state, year, number"
            + " FROM `bigquery-public-data.usa_names.usa_1910_current`"
            + " WHERE state LIKE 'W%'`";
    ddlCreateView(ddl);
  }

  public static void ddlCreateView(String ddl) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      QueryJobConfiguration config = QueryJobConfiguration.newBuilder(ddl).build();

      // create a view using query and it will wait to complete job.
      Job job = bigquery.create(JobInfo.of(config));
      job = job.waitFor();
      if (job.isDone()) {
        System.out.println("View created successfully");
      } else {
        System.out.println("View was not created");
      }
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("View was not created. \n" + e.toString());
    }
  }
}

Node.js

// Import the Google Cloud client library and create a client
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function ddlCreateView() {
  // Creates a view via a DDL query

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const projectId = "my_project"
  // const datasetId = "my_dataset"
  // const tableId = "my_new_view"

  const query = `
  CREATE VIEW \`${projectId}.${datasetId}.${tableId}\`
  OPTIONS(
      expiration_timestamp=TIMESTAMP_ADD(
          CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
      friendly_name="new_view",
      description="a view that expires in 2 days",
      labels=[("org_unit", "development")]
  )
  AS SELECT name, state, year, number
      FROM \`bigquery-public-data.usa_names.usa_1910_current\`
      WHERE state LIKE 'W%'`;

  // For all options, see https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query
  const options = {
    query: query,
  };

  // Run the query as a job
  const [job] = await bigquery.createQueryJob(options);

  job.on('complete', metadata => {
    console.log(`Created new view ${tableId} via job ${metadata.id}`);
  });
}

Python

调用 Client.query() 方法,启动查询作业。调用 QueryJob.result() 方法,等待 DDL 查询完成。

# from google.cloud import bigquery
# project = 'my-project'
# dataset_id = 'my_dataset'
# table_id = 'new_view'
# client = bigquery.Client(project=project)

sql = """
CREATE VIEW `{}.{}.{}`
OPTIONS(
    expiration_timestamp=TIMESTAMP_ADD(
        CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
    friendly_name="new_view",
    description="a view that expires in 2 days",
    labels=[("org_unit", "development")]
)
AS SELECT name, state, year, number
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state LIKE 'W%'
""".format(
    project, dataset_id, table_id
)

job = client.query(sql)  # API request.
job.result()  # Waits for the query to finish.

print(
    'Created new view "{}.{}.{}".'.format(
        job.destination.project,
        job.destination.dataset_id,
        job.destination.table_id,
    )
)

CREATE SCHEMA 语句

创建新数据集。

语法

CREATE SCHEMA [ IF NOT EXISTS ]
[project_name.]dataset_name
[DEFAULT COLLATE collate_specification]
[OPTIONS(schema_option_list)]

参数

  • IF NOT EXISTS:如果存在同名的数据集,则 CREATE 语句无效。无法以 OR REPLACE 显示。

  • DEFAULT COLLATE collate_specification:在数据集中创建新表时,该表将继承默认的排序规则规范,除非明确为指定排序规则规范。

    如果您稍后使用 ALTER SCHEMA 语句移除或更改此排序规则规范,则系统不会更改此数据集中的现有排序规则规范。如果要更新数据集中的现有排序规则规范,您必须更改包含该规范的列。

  • project_name:您要在其中创建数据集的项目的名称。默认为运行此 DDL 语句的项目。

  • dataset_name:要创建的数据集的名称。

  • schema_option_list:用于创建数据集的选项列表。

详情

创建数据集的位置就是在查询设置中指定的位置。如需了解详情,请参阅指定位置

如需详细了解如何创建数据集,请参阅创建数据集。如需了解配额,请参阅数据集限制

schema_option_list

选项列表指定数据集的选项。请按以下格式指定选项:NAME=VALUE, ...

支持的选项如下:

NAME VALUE 详情
default_kms_key_name STRING 指定用于加密此数据集中的表数据的默认 Cloud KMS 密钥。您可以在创建表时替换此值。
default_partition_expiration_days FLOAT64 指定此数据集中的表分区的默认到期时间(天)。您可以在创建表时替换此值。
default_table_expiration_days FLOAT64 指定此数据集中的表的默认到期时间(天)。您可以在创建表时替换此值。
description STRING 数据集的说明。
friendly_name STRING 数据集的描述性名称。
is_case_insensitive BOOL

处于预览版阶段。 适用于 CREATE SCHEMA,但不适用于 ALTER SCHEMA

如果数据集及其表名称不区分大小写,则值为 TRUE,否则为 FALSE。如果之前未设置该参数,则数据集及其表名称区分大小写。

labels <ARRAY<STRUCT<STRING, STRING>>> 数据集的标签数组,以键值对形式表示。
location STRING 要在其中创建数据集的位置。如果未指定此选项,则系统会在查询运行的位置创建数据集。如果您指定了此选项,并明确设置了查询作业的位置,则这两个值必须匹配:否则查询会失败。
max_time_travel_hours SMALLINT

处于预览版阶段。

指定数据集的时间旅行窗口的时长(以小时为单位)。max_time_travel_hours 值必须是 48(2 天)到 168(7 天)之间的整数。如果未指定此选项,则默认值为 168 小时。

如需详细了解时间旅行窗口,请参阅配置时间旅行窗口

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.datasets.create 要在其中创建数据集的项目。

示例

创建新的架构

以下示例会创建一个使用默认表到期时间和一组标签的数据集。

CREATE SCHEMA mydataset
OPTIONS(
  location="us",
  default_table_expiration_days=3.75,
  labels=[("label1","value1"),("label2","value2")]
  )

创建不区分大小写的数据集

以下示例会创建一个不区分大小写的数据集。数据集名称及数据集内的表名称都不区分大小写。

CREATE SCHEMA mydataset
OPTIONS(
  is_case_insensitive=TRUE
)

创建支持排序规则的架构

以下示例使用排序规则规范创建数据集。

CREATE SCHEMA mydataset
DEFAULT COLLATE 'und:ci'

CREATE TABLE 语句

创建新表。

语法

CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] TABLE [ IF NOT EXISTS ]
table_name
[(
  column[, ...]
)]
[DEFAULT COLLATE collate_specification]
[PARTITION BY partition_expression]
[CLUSTER BY clustering_column_list]
[OPTIONS(table_option_list)]
[AS query_statement]

参数

  • OR REPLACE。替换任何同名的表(如果存在)。无法以 IF NOT EXISTS 显示。

  • TEMP | TEMPORARY:创建临时表

  • IF NOT EXISTS:如果存在同名的表,则 CREATE 语句无效。无法以 OR REPLACE 显示。

  • table_name:要创建的表的名称。请参阅表路径语法。对于临时表,请勿包含项目名称或数据集名称。

  • column:表的架构信息。

  • collation_specification:向表添加新列时,如果列没有显式的排序规则规范,则将继承 STRING 类型的这个排序规则规范。

    如果您稍后使用 ALTER TABLE 语句移除或更改此排序规则规范,则系统不会更改此表中的现有排序规则规范。如果要更新表中的现有排序规则规范,您必须更改包含该规范的列。

    如果表是数据集的一部分,则此表的默认排序规则规范会替换数据集的默认排序规则规范。

  • partition_expression:用于确定如何对表进行分区的表达式。

  • clustering_column_list:用于确定如何对表进行聚簇的列引用的英文逗号分隔列表。 您不能对此列表中的列执行排序规则。

  • table_option_list:用于创建表的选项列表。

  • query_statement:应根据其创建表的查询。如需了解查询语法,请参阅 SQL 语法参考。{: #query_statement } 如果此表使用了排序规则规范,则排序规则会通过此查询语句传递。

详情

CREATE TABLE 语句必须符合以下规则:

  • 只允许一个 CREATE 语句。
  • 必须存在列列表和/或 as query_statement 子句。
  • 当列列表和 as query_statement 子句都存在时,BigQuery 会忽略 as query_statement 子句中的名称,并按位置匹配列和列列表。
  • 存在 as query_statement 子句但不存在列列表时,BigQuery 会根据 as query_statement 子句确定列名称和类型。
  • 必须通过列列表、as query_statement 子句或 LIKE 子句中的表架构指定列名称。
  • 禁止使用重复的列名称。
  • LIKEas query_statement 子句都存在时,查询语句中的列列表必须与 LIKE 子句引用的表列匹配。

限制:

  • 无法利用查询结果创建提取时间分区表。请改为使用 CREATE TABLE DDL 语句来创建表,然后使用 INSERT DML 语句向其中插入数据。
  • 无法使用 OR REPLACE 修饰符将表替换为使用不同种类的分区。请先使用 DROP 删除表,然后使用 CREATE TABLE ... AS SELECT ... 语句重新创建表。

此语句支持以下变体,这些变体具有相同的限制:

column

(column_name column_schema[, ...]) 以英文逗号分隔列表的形式提供表的架构信息

column :=
  column_name column_schema

column_schema :=
   {
     simple_type [NOT NULL]
     | STRUCT<field_list> [NOT NULL]
     | ARRAY<array_element_schema>
   }
   [DEFAULT default_expression]
   [OPTIONS(column_option_list)]

field_list :=
  field_name column_schema [, ...]

array_element_schema :=
  { simple_type | STRUCT<field_list> }
  [NOT NULL]

simple_type :=
  { data_type | STRING COLLATE collate_specification }
  • column_name 是列的名称。列名称要求:

    • 只能包含字母(a-z、A-Z)、数字 (0-9) 或下划线 (_)
    • 必须以字母或下划线开头
    • 最多包含 300 个字符
  • column_schema:与数据类型相似,但对于 ARRAY 以外的类型,支持可选的 NOT NULL 限制。column_schema 还支持顶级列与 STRUCT 字段的选项。

    column_schema 只能在 CREATE TABLE 语句的列定义列表中使用,不能在表达式中作为类型使用。

  • simple_type:除 STRUCTARRAY 之外的任何受支持的数据类型

    如果 simple_typeSTRING,则它支持排序规则的一个附加子句,用于定义如何对生成的 STRING 进行比较和排序。语法如下所示:

    STRING COLLATE collate_specification
    

    如果已为表分配了 DEFAULT COLLATE collate_specification,则列的排序规范会替换表的规范。

  • default_expression:分配给列的默认值

  • field_list:表示结构体中的字段。

  • field_name:结构体字段的名称。结构体字段名称具有与列名称相同的限制。

  • NOT NULL:当列或字段存在 NOT NULL 限制时,按 REQUIRED 模式创建列或字段。相反,没有 NOT NULL 限制时,按 NULLABLE 模式创建列或字段。

    ARRAY 类型的列和字段不支持 NOT NULL 修饰符。例如,ARRAY<INT64> NOT NULLcolumn_schema 无效,因为 ARRAY 列具有 REPEATED 模式并可为空,但不可为 NULL。无论是否指定 NOT NULL 限制,表中的数组元素都不能为 NULL。例如,ARRAY<INT64> 等同于 ARRAY<INT64 NOT NULL>

    表的 column_schemaNOT NULL 特性 (Attribute) 不会通过对表的查询来传播。例如,如果表 T 包含声明为 x INT64 NOT NULL 的列,CREATE TABLE dataset.newtable AS SELECT x FROM T 会创建名为 dataset.newtable 的表,其中 xNULLABLE

partition_expression

PARTITION BY 是控制表分区的可选子句。partition_expression 是确定如何对表进行分区的表达式。分区表达式可包含以下值:

  • _PARTITIONDATE。按汲取时间通过每日分区进行分区。此语法不能用于 AS query_statement 子句。
  • DATE(_PARTITIONTIME)。与 _PARTITIONDATE 等效。此语法不能用于 AS query_statement 子句。
  • <date_column>。按 DATE 列通过每日分区进行分区。
  • DATE({ <timestamp_column> | <datetime_column> })。按 TIMESTAMPDATETIME 列通过每日分区进行分区。
  • DATETIME_TRUNC(<datetime_column>, { DAY | HOUR | MONTH | YEAR })。按 DATETIME 列通过指定的分区类型进行分区。
  • TIMESTAMP_TRUNC(<timestamp_column>, { DAY | HOUR | MONTH | YEAR })。按 TIMESTAMP 列通过指定的分区类型进行分区。
  • TIMESTAMP_TRUNC(_PARTITIONTIME, { DAY | HOUR | MONTH | YEAR })。按汲取时间通过指定的分区类型进行分区。此语法不能用于 AS query_statement 子句。
  • DATE_TRUNC(<date_column>, { MONTH | YEAR })。按 DATE 列通过指定的分区类型进行分区。
  • RANGE_BUCKET(<int64_column>, GENERATE_ARRAY(<start>, <end>[, <interval>]))。按整数列通过指定的范围进行分区,其中:

    • start 是范围分区的起始值(含边界值)。
    • end 是范围分区的终止值(不含边界值)。
    • interval 是分区中每个范围的宽度。 默认为 1。

clustering_column_list

CLUSTER BY 是控制表聚簇的可选子句。clustering_column_list 是确定如何对表进行聚簇的英文逗号分隔列表。聚簇列列表最多可包含 4 个聚簇列。

table_option_list

可通过选项列表设置标签和到期时间等表选项。可使用逗号分隔列表包括多个选项。

请按以下格式指定表选项列表:

NAME=VALUE, ...

NAMEVALUE 必须是下述组合之一:

NAME VALUE 详情
expiration_timestamp TIMESTAMP

示例:expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC"

此属性等效于 expirationTime 表资源属性。

partition_expiration_days

FLOAT64

示例:partition_expiration_days=7

设置分区过期时间(以天为单位)。如需了解详情,请参阅设置分区过期时间。默认情况下,分区不会过期。

此属性等效于 timePartitioning.expirationMs 表资源属性,但单位是天而非毫秒。一天相当于 8640 万毫秒(即 24 小时)。

只能对分区表设置此属性。

require_partition_filter

BOOL

示例:require_partition_filter=true

指定此表的查询是否必须包含对分区列进行过滤的谓词过滤条件。如需了解详情,请参阅设置分区过滤条件。默认值为 false

此属性等效于 timePartitioning.requirePartitionFilter 表资源属性。

只能对分区表设置此属性。

kms_key_name

STRING

示例:kms_key_name="projects/project_id/locations/location/keyRings/keyring/cryptoKeys/key"

此属性等效于 encryptionConfiguration.kmsKeyName 表资源属性。

请查看有关使用 Cloud KMS 密钥保护数据的详细信息。

friendly_name

STRING

示例:friendly_name="my_table"

此属性等效于 friendlyName 表资源属性。

description

STRING

示例:description="a table that expires in 2025"

此属性等效于 description 表资源属性。

labels

ARRAY<STRUCT<STRING, STRING>>

示例:labels=[("org_unit", "development")]

此属性等效于 labels 表资源属性。

VALUE 是一个只包含文字、查询参数和标量函数的常数表达式。

常量表达式不得包含以下内容:

  • 对表的引用
  • 子查询和 SQL 语句,如 SELECTCREATEUPDATE
  • 用户定义的函数、聚合函数或分析函数
  • 以下标量函数:
    • ARRAY_TO_STRING
    • REPLACE
    • REGEXP_REPLACE
    • RAND
    • FORMAT
    • LPAD
    • RPAD
    • REPEAT
    • SESSION_USER
    • GENERATE_ARRAY
    • GENERATE_DATE_ARRAY

如果 VALUE 评估为 NULL,则系统会忽略 CREATE TABLE 语句中的相应选项 NAME

column_option_list

通过 column_schema 中的 column_option_list,您可以指定可选的列或字段选项。列选项与表选项的语法和要求相同,但包含的 NAMEVALUE 列表不同:

NAME VALUE 详情
description

STRING

示例:description="a unique id"

此属性等效于 schema.fields[].description 表资源属性。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.create 您在其中创建表的数据集。

此外,OR REPLACE 子句需要 bigquery.tables.updatebigquery.tables.updateData 权限。

如果 OPTIONS 子句包含任何到期时间选项,则还需要 bigquery.tables.delete 权限。

示例

创建新表

以下示例在 mydataset 中创建名为 newtable 的分区表:

CREATE TABLE mydataset.newtable
(
  x INT64 OPTIONS(description="An optional INTEGER field"),
  y STRUCT<
    a ARRAY<STRING> OPTIONS(description="A repeated STRING field"),
    b BOOL
  >
)
PARTITION BY _PARTITIONDATE
OPTIONS(
  expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC",
  partition_expiration_days=1,
  description="a table that expires in 2025, with each partition living for 24 hours",
  labels=[("org_unit", "development")]
)

如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id 包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`。因此,表限定符可能是 `myproject.mydataset.newtable`,而不是 mydataset.newtable

如果数据集内已存在该表名称,会返回以下错误:

Already Exists: project_id:dataset.table

该表利用以下 partition_expression 对表进行分区:PARTITION BY _PARTITIONDATE。此表达式使用 _PARTITIONDATE 伪列中的日期对表进行分区。

表架构中包含两列:

  • x:整数,带有“可选的整数字段”描述
  • y:包含两列的 STRUCT:

    • a:一组字符串,带有“重复的字符串字段”描述
    • b:一个布尔值

表选项列表指定了以下内容:

  • 表到期时间:世界协调时间 (UTC) 2025 年 1 月 1 日 00:00:00
  • 分区到期时间:1 天
  • 说明A table that expires in 2025
  • 标签org_unit = development

从现有表创建新表

下面的示例基于查询在 mydataset 中创建名为 top_words 的表:

CREATE TABLE mydataset.top_words
OPTIONS(
  description="Top ten words per Shakespeare corpus"
) AS
SELECT
  corpus,
  ARRAY_AGG(STRUCT(word, word_count) ORDER BY word_count DESC LIMIT 10) AS top_words
FROM bigquery-public-data.samples.shakespeare
GROUP BY corpus;

如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id 包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`。因此,表限定符可能是 `myproject.mydataset.top_words`,而不是 mydataset.top_words

如果数据集内已存在该表名称,会返回以下错误:

Already Exists: project_id:dataset.table

表架构中包含两列:

  • corpus:莎士比亚全集的名称
  • top_wordsSTRUCT 类型的 ARRAY,包含两个字段:wordSTRING 类型)和 word_count(表示该单词出现次数的 INT64

表选项列表指定了以下内容:

  • 说明Top ten words per Shakespeare corpus

仅当某个表不存在时才创建该表

仅当 mydataset 中不存在名为 newtable 的表时,下述示例才会在 mydataset 中创建名为 newtable 的表。如果数据集中存在该表名称,则不会返回任何错误,也不会执行任何操作。

CREATE TABLE IF NOT EXISTS mydataset.newtable (x INT64, y STRUCT<a ARRAY<STRING>, b BOOL>)
OPTIONS(
  expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC",
  description="a table that expires in 2025",
  labels=[("org_unit", "development")]
)

如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id 包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`。因此,表限定符可能是 `myproject.mydataset.newtable`,而不是 mydataset.newtable

表架构中包含两列:

  • x:整数
  • y:包含 a(字符串数组)和 b(布尔值)的 STRUCT

表选项列表指定了以下内容:

  • 到期时间:世界协调时间 (UTC) 2025 年 1 月 1 日 00:00:00
  • 说明A table that expires in 2025
  • 标签org_unit = development

创建或替换表

以下示例会在 mydataset 中创建名为 newtable 的表,如果 mydataset 中存在 newtable,则会用空表覆盖该表。

CREATE OR REPLACE TABLE mydataset.newtable (x INT64, y STRUCT<a ARRAY<STRING>, b BOOL>)
OPTIONS(
  expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC",
  description="a table that expires in 2025",
  labels=[("org_unit", "development")]
)

如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id 包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`。因此,表限定符可能是 `myproject.mydataset.newtable`,而不是 mydataset.newtable

表架构中包含两列:

  • x:整数
  • y:包含 a(字符串数组)和 b(布尔值)的 STRUCT

表选项列表指定了以下内容:

  • 到期时间:世界协调时间 (UTC) 2025 年 1 月 1 日 00:00:00
  • 说明A table that expires in 2025
  • 标签org_unit = development

使用 REQUIRED 列创建表

以下示例在 mydataset 中创建名为 newtable 的表。CREATE TABLE 语句的列定义列表中的 NOT NULL 修饰符指定以 REQUIRED 模式创建列或字段。

CREATE TABLE mydataset.newtable (
  x INT64 NOT NULL,
  y STRUCT<
    a ARRAY<STRING>,
    b BOOL NOT NULL,
    c FLOAT64
  > NOT NULL,
  z STRING
)

如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id 包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`。因此,表限定符可能是 `myproject.mydataset.newtable`,而不是 mydataset.newtable

如果数据集内已存在该表名称,会返回以下错误:

Already Exists: project_id:dataset.table

表架构中包含 3 列:

  • xREQUIRED 整数
  • yREQUIRED STRUCT,包含 a(字符串数组)、b(REQUIRED 布尔值)、c(NULLABLE 浮点)
  • zNULLABLE 字符串

创建支持排序规则的表

以下示例在 mydataset 中创建包含列 abc 的表 newtable 以及包含字段 xy 的结构体。

此表中的所有 STRING 列架构都由 'und:ci' 整理:

CREATE TABLE mydataset.newtable (
  a STRING,
  b STRING,
  c STRUCT<
    x FLOAT64
    y ARRAY<STRING>
  >
)
DEFAULT COLLATE 'und:ci';

只有 by'und:ci' 整理:

CREATE TABLE mydataset.newtable (
  a STRING,
  b STRING COLLATE 'und:ci',
  c STRUCT<
    x FLOAT64
    y ARRAY<STRING COLLATE 'und:ci'>
  >
);

创建具有参数化数据类型的表

以下示例在 mydataset 中创建名为 newtable 的表。括在英文括号中的参数指定的列包含参数化数据类型。如需详细了解参数化类型,请参阅参数化数据类型

CREATE TABLE mydataset.newtable (
  x STRING(10),
  y STRUCT<
    a ARRAY<BYTES(5)>,
    b NUMERIC(15, 2),
    c FLOAT64
  >,
  z BIGNUMERIC(35)
)

如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id 包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`。表限定符应是 `myproject.mydataset.newtable` 而不是 mydataset.newtable

如果数据集内已存在该表名称,会返回以下错误:

Already Exists: project_id:dataset.table

表架构中包含 3 列:

  • x:长度上限为 10 的参数化字符串
  • y:包含 a(一个长度上限为 5 的参数化字节数组)、b(最大精度为 15 且最大精度为 2 的参数化 NUMERIC 类型)和 c(浮点数)的 STRUCT
  • z:最大精度为 35 且最大精度为 0 的参数化 BIGNUMERIC 类型

创建分区表

以下示例使用一个 DATE 列在 mydataset 中创建名为 newtable分区表

CREATE TABLE mydataset.newtable (transaction_id INT64, transaction_date DATE)
PARTITION BY transaction_date
OPTIONS(
  partition_expiration_days=3,
  description="a table partitioned by transaction_date"
)

如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id 包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`。因此,表限定符可能是 `myproject.mydataset.newtable`,而不是 mydataset.newtable

表架构中包含两列:

  • transaction_id:整数
  • transaction_date:日期

表选项列表指定了以下内容:

  • 分区有效期限:3 天
  • 说明A table partitioned by transaction_date

从查询结果创建分区表

以下示例使用一个 DATE 列在 mydataset 中创建名为 days_with_rain分区表

CREATE TABLE mydataset.days_with_rain
PARTITION BY date
OPTIONS (
  partition_expiration_days=365,
  description="weather stations with precipitation, partitioned by day"
) AS
SELECT
  DATE(CAST(year AS INT64), CAST(mo AS INT64), CAST(da AS INT64)) AS date,
  (SELECT ANY_VALUE(name) FROM `bigquery-public-data.noaa_gsod.stations` AS stations
   WHERE stations.usaf = stn) AS station_name,  -- Stations can have multiple names
  prcp
FROM `bigquery-public-data.noaa_gsod.gsod2017` AS weather
WHERE prcp != 99.9  -- Filter unknown values
  AND prcp > 0      -- Filter stations/days with no precipitation

如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id 包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`。因此,表限定符可能是 `myproject.mydataset.days_with_rain`,而不是 mydataset.days_with_rain

表架构中包含两列:

  • date:数据收集的 DATE
  • station_nameSTRING 格式的气象站名称
  • prcpFLOAT64 格式的降雨量(以英寸为单位)

表选项列表指定了以下内容:

  • 分区有效期限:一年
  • 说明Weather stations with precipitation, partitioned by day

创建聚簇表

示例 1

以下示例在 mydataset 中创建名为 myclusteredtable聚簇表。该表是分区表,按 TIMESTAMP 列分区,并按名为 customer_idSTRING 列进行聚簇。

CREATE TABLE mydataset.myclusteredtable
(
  timestamp TIMESTAMP,
  customer_id STRING,
  transaction_amount NUMERIC
)
PARTITION BY DATE(timestamp)
CLUSTER BY customer_id
OPTIONS (
  partition_expiration_days=3,
  description="a table clustered by customer_id"
)

如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id 包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`。因此,表限定符可能是 `myproject.mydataset.myclusteredtable`,而不是 mydataset.myclusteredtable

表架构中包含 3 列:

  • timestampTIMESTAMP 格式的数据收集时间
  • customer_idSTRING 格式的客户 ID
  • transaction_amountNUMERIC 格式的交易金额

表选项列表指定了以下内容:

  • 分区有效期限:3 天
  • 说明A table clustered by customer_id
示例 2

以下示例在 mydataset 中创建名为 myclusteredtable聚簇表。该表为提取时间分区表

CREATE TABLE mydataset.myclusteredtable
(
  customer_id STRING,
  transaction_amount NUMERIC
)
PARTITION BY DATE(_PARTITIONTIME)
CLUSTER BY
  customer_id
OPTIONS (
  partition_expiration_days=3,
  description="a table clustered by customer_id"
)

如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id 包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`。因此,表限定符可能是 `myproject.mydataset.myclusteredtable`,而不是 mydataset.myclusteredtable

表架构中包含两列:

  • customer_idSTRING 格式的客户 ID
  • transaction_amountNUMERIC 格式的交易金额

表选项列表指定了以下内容:

  • 分区有效期限:3 天
  • 说明A table clustered by customer_id
示例 3

以下示例在 mydataset 中创建名为 myclusteredtable聚簇表。该表未进行分区。

CREATE TABLE mydataset.myclusteredtable
(
  customer_id STRING,
  transaction_amount NUMERIC
)
CLUSTER BY
  customer_id
OPTIONS (
  description="a table clustered by customer_id"
)

如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id 包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`。因此,表限定符可能是 `myproject.mydataset.myclusteredtable`,而不是 mydataset.myclusteredtable

表架构中包含两列:

  • customer_idSTRING 格式的客户 ID
  • transaction_amountNUMERIC 格式的交易金额

表选项列表指定了以下内容:

  • 说明A table clustered by customer_id

从查询结果创建聚簇表

示例 1

以下示例使用查询结果在 mydataset 中创建名为 myclusteredtable聚簇表。该表是按 TIMESTAMP 列分区的分区表

CREATE TABLE mydataset.myclusteredtable
(
  timestamp TIMESTAMP,
  customer_id STRING,
  transaction_amount NUMERIC
)
PARTITION BY DATE(timestamp)
CLUSTER BY
  customer_id
OPTIONS (
  partition_expiration_days=3,
  description="a table clustered by customer_id"
)
AS SELECT * FROM mydataset.myothertable

如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id 包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`。因此,表限定符可能是 `myproject.mydataset.myclusteredtable`,而不是 mydataset.myclusteredtable

表架构中包含 3 列:

  • timestampTIMESTAMP 格式的数据收集时间
  • customer_idSTRING 格式的客户 ID
  • transaction_amountNUMERIC 格式的交易金额

表选项列表指定了以下内容:

  • 分区有效期限:3 天
  • 说明A table clustered by customer_id
示例 2

以下示例使用查询结果在 mydataset 中创建名为 myclusteredtable聚簇表。该表未进行分区。

CREATE TABLE mydataset.myclusteredtable
(
  customer_id STRING,
  transaction_amount NUMERIC
)
CLUSTER BY
  customer_id
OPTIONS (
  description="a table clustered by customer_id"
)
AS SELECT * FROM mydataset.myothertable

如果您未配置默认项目,请在示例 SQL 中的数据集名称前加上项目 ID,如果 project_id 包含特殊字符,则用反引号将名称括起:`project_id.dataset.table`。因此,表限定符可能是 `myproject.mydataset.myclusteredtable`,而不是 mydataset.myclusteredtable

表架构中包含两列:

  • customer_idSTRING 格式的客户 ID
  • transaction_amountNUMERIC 格式的交易金额

表选项列表指定了以下内容:

  • 说明A table clustered by customer_id

创建临时表

以下示例会创建一个名为 Example 的临时表并将向其插入值。

CREATE TEMP TABLE Example
(
  x INT64,
  y STRING
);

INSERT INTO Example
VALUES (5, 'foo');

INSERT INTO Example
VALUES (6, 'bar');

SELECT *
FROM Example;

此脚本会返回以下输出:

+-----+---+-----+
| Row | x | y   |
+-----+---|-----+
| 1   | 5 | foo |
| 2   | 6 | bar |
+-----+---|-----+

CREATE TABLE LIKE 语句

使用另一个表的所有相同元数据创建一个新表。

语法

CREATE [ OR REPLACE ] TABLE [ IF NOT EXISTS ]
table_name
LIKE [[project_name.]dataset_name.]source_table_name
...
[OPTIONS(table_option_list)]

详细信息

此语句是 CREATE TABLE 语句的变体,因而具有相同的限制。除了使用 LIKE 子句代替列列表之外,语法与 CREATE TABLE 语法相同。

CREATE TABLE LIKE 语句仅复制源表的元数据。您可以使用 as query_statement 子句向新表中添加数据。

新表在创建后与源表无关;因此对源表的修改不会传播到新表。

默认情况下,新表从源表继承分区、聚簇和选项元数据。您可以使用 SQL 语句中的可选子句来自定义新表中的元数据。例如,如果要为新表指定一组不同的选项,则包含带有选项和值列表的 OPTIONS 子句。此行为与 ALTER TABLE SET OPTIONS 的行为相同。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.create 您在其中创建表的数据集。
bigquery.tables.get 源表。

此外,OR REPLACE 子句需要 bigquery.tables.updatebigquery.tables.updateData 权限。

如果 OPTIONS 子句包含任何到期时间选项,则还需要 bigquery.tables.delete 权限。

示例

示例 1

以下示例在 mydataset 中创建名为 newtable 的新表,其元数据与 sourcetable 相同:

CREATE TABLE mydataset.newtable
LIKE mydataset.sourcetable

示例 2

以下示例在 mydataset 中创建名为 newtable 的新表,该表具有与 sourcetable 相同的元数据和 SELECT 语句中的数据:

CREATE TABLE mydataset.newtable
LIKE mydataset.sourcetable
AS SELECT * FROM mydataset.myothertable

CREATE TABLE COPY 语句

创建一个表,使其与另一个表具有相同的元数据和数据。源表可以是表、表克隆表快照

语法

CREATE [ OR REPLACE ] TABLE [ IF NOT EXISTS ] table_name
COPY source_table_name
...
[OPTIONS(table_option_list)]

详细信息

此语句是 CREATE TABLE 语句的变体,因而具有相同的限制。除了使用 COPY 子句代替列列表之外,语法与 CREATE TABLE 语法相同。

CREATE TABLE COPY 语句会复制源表中的元数据和数据。

新表从源表继承分区和聚簇。默认情况下,源表中的表选项元数据也会被继承,但您可以使用 OPTIONS 子句替换表选项。该行为等同于在复制表后运行 ALTER TABLE SET OPTIONS

新表在创建后与源表无关;对源表的修改不会传播到新表。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.create 您在其中创建表快照的数据集。
bigquery.tables.get 源表。
bigquery.tables.getData 源表。

此外,OR REPLACE 子句需要 bigquery.tables.updatebigquery.tables.updateData 权限。

如果 OPTIONS 子句包含任何到期时间选项,则还需要 bigquery.tables.delete 权限。

CREATE SNAPSHOT TABLE 语句

基于源表创建表快照。源表可以是表、表克隆或表快照。

语法

CREATE SNAPSHOT TABLE [ IF NOT EXISTS ] table_snapshot_name
CLONE source_table_name
[FOR SYSTEM_TIME AS OF time_expression]
[OPTIONS(snapshot_option_list)]

参数

  • IF NOT EXISTS:如果表快照或其他表资源同名,则 CREATE 语句无效。

  • table_snapshot_name:您要创建的表快照的名称。每个数据集的表快照名称必须是唯一的。请参阅表路径语法

  • source_table_name:要复制快照的表的名称,或要复制的表快照的名称。请参阅表路径语法

    如果源表是标准表,则 BigQuery 会创建源表的表快照。如果源表是表快照,则 BigQuery 会创建表快照的副本。

  • FOR SYSTEM_TIME AS OF:您可以选择在由 timestamp_expression 指定时间点上的最新表版本。它只能在创建表的快照时使用;不能在复制表快照时使用。

  • snapshot_option_list:其他表快照创建选项,例如标签和到期时间。

详情

CREATE SNAPSHOT TABLE 语句必须符合以下规则:

  • 只允许一个 CREATE 语句。
  • 源表必须是以下项之一:
    • 表克隆
    • 表快照
  • FOR SYSTEM_TIME AS OF 子句只能在创建表快照或表克隆时使用;无法在创建表快照的副本时使用。

snapshot_option_list

可通过选项列表设置表快照选项,例如标签和到期时间。可使用逗号分隔列表包括多个选项。

请按以下格式指定表快照选项列表:

NAME=VALUE, ...

NAMEVALUE 必须是下述组合之一:

NAME VALUE 详情
expiration_timestamp TIMESTAMP

示例:expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC"

此属性等效于 expirationTime 表资源属性。

friendly_name

STRING

示例:friendly_name="my_table_snapshot"

此属性等效于 friendlyName 表资源属性。

description

STRING

示例:description="A table snapshot that expires in 2025"

此属性等效于 description 表资源属性。

labels

ARRAY<STRUCT<STRING, STRING>>

示例:labels=[("org_unit", "development")]

此属性等效于 labels 表资源属性。

VALUE 是一个只包含文字、查询参数和标量函数的常数表达式。

常量表达式不得包含以下内容:

  • 对表的引用
  • 子查询和 SQL 语句,如 SELECTCREATEUPDATE
  • 用户定义的函数、聚合函数或分析函数
  • 以下标量函数:
    • ARRAY_TO_STRING
    • REPLACE
    • REGEXP_REPLACE
    • RAND
    • FORMAT
    • LPAD
    • RPAD
    • REPEAT
    • SESSION_USER
    • GENERATE_ARRAY
    • GENERATE_DATE_ARRAY

如果 VALUE 评估为 NULL,则系统会忽略 CREATE SNAPSHOT TABLE 语句中的相应选项 NAME

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.create 您在其中创建表快照的数据集。
bigquery.tables.createSnapshot 源表。
bigquery.tables.get 源表。
bigquery.tables.getData 源表。

示例

创建表快照:如果已存在则失败

以下示例创建表 myproject.mydataset.mytable 的表快照。表快照在数据集 mydataset 中创建,并命名为 mytablesnapshot

CREATE SNAPSHOT TABLE `myproject.mydataset.mytablesnapshot`
CLONE `myproject.mydataset.mytable`
OPTIONS(
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
  friendly_name="my_table_snapshot",
  description="A table snapshot that expires in 2 days",
  labels=[("org_unit", "development")]
)

如果数据集内已存在表快照名称,会返回以下错误:

Already Exists: myproject.mydataset.mytablesnapshot

表快照选项列表指定以下内容:

  • 到期时间:创建表快照后 48 小时
  • 易记名称my_table_snapshot
  • 说明A table snapshot that expires in 2 days
  • 标签org_unit = development

创建表快照:如果已存在则忽略

以下示例创建表 myproject.mydataset.mytable 的表快照。表快照在数据集 mydataset 中创建,并命名为 mytablesnapshot

CREATE SNAPSHOT TABLE IF NOT EXISTS `myproject.mydataset.mytablesnapshot`
CLONE `myproject.mydataset.mytable`
OPTIONS(
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
  friendly_name="my_table_snapshot",
  description="A table snapshot that expires in 2 days"
  labels=[("org_unit", "development")]
)

表快照选项列表指定以下内容:

  • 到期时间:创建表快照后 48 小时
  • 易记名称my_table_snapshot
  • 说明A table snapshot that expires in 2 days
  • 标签org_unit = development

如果数据集内已存在该表快照名称,则不会执行任何操作,也不会返回错误。

如需了解如何恢复表快照,请参阅 CREATE TABLE CLONE

如需了解如何移除表快照,请参阅 DROP SNAPSHOT TABLE

CREATE TABLE CLONE 语句

基于源表创建表克隆。源表可以是表、表克隆或表快照

语法

CREATE [ OR REPLACE ] TABLE [ IF NOT EXISTS ]
destination_table_name
CLONE source_table_name [FOR SYSTEM_TIME AS OF time_expression]
...
[OPTIONS(table_option_list)]

详情

除了使用 CLONE 子句代替列列表之外,语法与 CREATE TABLE 语法相同。

参数

  • OR REPLACE:替换任何同名的表(如果存在)。无法以 IF NOT EXISTS 显示。

  • IF NOT EXISTS:如果指定的目标表名称已存在,则 CREATE 语句无效。无法以 OR REPLACE 显示。

destination_table_name 是您要创建的表的名称。每个数据集的表名称必须唯一。表名称可以包含以下内容:

  • 不超过 1024 个字符
  • 字母(大写或小写)、数字和下划线

OPTIONS(table_option_list) 可让您指定其他表创建选项,例如标签和到期时间。

source_table_name 是源表的名称。

CREATE TABLE CLONE 语句必须符合以下规则:

  • 只允许一个 CREATE 语句。
  • 要克隆的表必须是表、表克隆或表快照。

OPTIONS

CREATE TABLE CLONE 选项与 CREATE TABLE 选项相同。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.create 您在其中创建表克隆的数据集。
bigquery.tables.get 源表。
bigquery.tables.getData 源表。
bigquery.tables.restoreSnapshot 源表(仅当源表为表快照时才需要)。

此外,OR REPLACE 子句需要 bigquery.tables.updatebigquery.tables.updateData 权限。

如果 OPTIONS 子句包含任何到期时间选项,则还需要 bigquery.tables.delete 权限。

示例

恢复表快照:如果目标表已存在则失败

以下示例根据表快照 myproject.mydataset.mytablesnapshot 创建表 myproject.mydataset.mytable

CREATE TABLE `myproject.mydataset.mytable`
CLONE `myproject.mydataset.mytablesnapshot`
OPTIONS(
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 365 DAY),
  friendly_name="my_table",
  description="A table that expires in 1 year",
  labels=[("org_unit", "development")]
)

如果数据集内已存在该表名称,则会返回以下错误:

Already Exists: myproject.mydataset.mytable.

表选项列表指定以下内容:

  • 到期时间:自创建表后 365 天
  • 易记名称my_table
  • 说明A table that expires in 1 year
  • 标签org_unit = development

创建表克隆:如果目标表已存在则忽略

以下示例会基于表 myproject.mydataset.mytable 创建表克隆 myproject.mydataset.mytableclone

CREATE TABLE IF NOT EXISTS `myproject.mydataset.mytableclone`
CLONE `myproject.mydataset.mytable`
OPTIONS(
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 365 DAY),
  friendly_name="my_table",
  description="A table that expires in 1 year",
  labels=[("org_unit", "development")]
)

表选项列表指定以下内容:

  • 到期时间:自创建表后 365 天
  • 易记名称my_table
  • 说明A table that expires in 1 year
  • 标签org_unit = development

如果数据集内已存在该表名称,则不会执行任何操作,也不会返回错误。

如需了解如何创建表的副本,请参阅 CREATE TABLE COPY

如需了解如何创建表的快照,请参阅 CREATE SNAPSHOT TABLE

CREATE VIEW 语句

创建新视图。

语法

CREATE [ OR REPLACE ] VIEW [ IF NOT EXISTS ] view_name
[(view_column_name_list)]
[OPTIONS(view_option_list)]
AS query_expression

参数

  • OR REPLACE:替换任何同名的视图(如果存在)。无法以 IF NOT EXISTS 显示。

  • IF NOT EXISTS:如果视图或其他表资源同名,则 CREATE 语句无效。无法以 OR REPLACE 显示。

  • view_name:要创建的视图的名称。请参阅表路径语法

  • view_column_name_list:可让您明确指定视图的列名称,它可以是底层 SQL 查询中列名称的别名。

  • view_option_list:其他视图创建选项,例如标签和到期时间。

  • query_expression:用于定义视图的 Google 标准 SQL 查询表达式。

详细信息

CREATE VIEW 语句必须符合以下规则:

  • 只允许一个 CREATE 语句。

view_column_name_list

视图的列名称列表是可选的。这些名称必须是唯一的,但不必与底层 SQL 查询的列名称相同。例如,如果您的视图是使用以下语句创建的:

CREATE VIEW mydataset.age_groups(age, count) AS SELECT age, COUNT(*)
FROM mydataset.people
group by age;

那么您可以使用以下语句来查询它:

SELECT age, count from mydataset.age_groups;

列名列表中的列数必须与底层 SQL 查询中的列数相匹配。如果在底层 SQL 查询表中添加或移除列,则视图将变为无效并且必须重新创建视图。例如,如果从 mydataset.people 表中删除 age 列,则在上一示例中创建的视图无效。

view_option_list

通过选项列表,您可以设置视图选项,例如标签和到期时间。可使用逗号分隔列表包括多个选项。

请按以下格式指定视图选项列表:

NAME=VALUE, ...

NAMEVALUE 必须是下述组合之一:

NAME VALUE 详情
expiration_timestamp TIMESTAMP

示例:expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC"

此属性等效于 expirationTime 表资源属性。

friendly_name

STRING

示例:friendly_name="my_view"

此属性等效于 friendlyName 表资源属性。

description

STRING

示例:description="a view that expires in 2025"

此属性等效于 description 表资源属性。

labels

ARRAY<STRUCT<STRING, STRING>>

示例:labels=[("org_unit", "development")]

此属性等效于 labels 表资源属性。

VALUE 是一个只包含文字、查询参数和标量函数的常数表达式。

常量表达式不得包含以下内容:

  • 对表的引用
  • 子查询和 SQL 语句,如 SELECTCREATEUPDATE
  • 用户定义的函数、聚合函数或分析函数
  • 以下标量函数:
    • ARRAY_TO_STRING
    • REPLACE
    • REGEXP_REPLACE
    • RAND
    • FORMAT
    • LPAD
    • RPAD
    • REPEAT
    • SESSION_USER
    • GENERATE_ARRAY
    • GENERATE_DATE_ARRAY

如果 VALUE 评估为 NULL,则系统会忽略 CREATE VIEW 语句中的相应选项 NAME

视图正文中的默认项目

如果视图是在用于运行 CREATE VIEW 语句的项目中创建的,则视图正文 query_expression 可以在不指定项目的情况下引用实体;默认项目是拥有视图的项目。请考虑以下示例查询。

CREATE VIEW myProject.myDataset.myView AS SELECT * FROM anotherDataset.myTable;

在项目 myProject 中运行上述 CREATE VIEW 查询后,您可以运行查询 SELECT * FROM myProject.myDataset.myView。无论选择哪个项目来运行此 SELECT 查询,引用的表 anotherDataset.myTable 始终会针对项目 myProject 进行解析。

如果视图并非是在用于运行 CREATE VIEW 语句的项目中创建的,则视图正文 query_expression 中的所有引用都必须使用项目 ID 进行限定。例如,如果前面的示例 CREATE VIEW 查询在 myProject 之外的其他项目中运行,则该查询无效。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.create 在其中创建视图的数据集。

此外,OR REPLACE 子句需要 bigquery.tables.update 权限。

如果 OPTIONS 子句包含到期时间,则还需要 bigquery.tables.delete 权限。

示例

创建新视图

以下示例在 mydataset 中创建名为 newview 的视图:

CREATE VIEW `myproject.mydataset.newview`
OPTIONS(
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
  friendly_name="newview",
  description="a view that expires in 2 days",
  labels=[("org_unit", "development")]
)
AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

如果数据集中存在该视图名称,会返回以下错误:

Already Exists: project_id:dataset.table

视图使用以下 Google 标准 SQL 查询进行定义:

SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

视图选项列表指定了以下内容:

  • 到期时间:自创建视图后 48 小时
  • 易记名称newview
  • 说明A view that expires in 2 days
  • 标签org_unit = development

仅当某个视图不存在时才创建该视图

以下示例只有在 mydataset 中不存在名为 newview 的视图时才会在 mydataset 中创建名为 newview 的视图。如果数据集中存在该视图名称,则不会返回任何错误,也不会执行任何操作。

CREATE VIEW IF NOT EXISTS `myproject.mydataset.newview`
OPTIONS(
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
  friendly_name="newview",
  description="a view that expires in 2 days",
  labels=[("org_unit", "development")]
)
AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

视图使用以下 Google 标准 SQL 查询进行定义:

SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

视图选项列表指定了以下内容:

  • 到期时间:自创建视图后 48 小时
  • 易记名称newview
  • 说明A view that expires in 2 days
  • 标签org_unit = development

创建或替换视图

以下示例会在 mydataset 中创建名为 newview 的视图,如果 mydataset 中存在 newview,会使用指定的查询表达式覆盖该视图。

CREATE OR REPLACE VIEW `myproject.mydataset.newview`
OPTIONS(
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
  friendly_name="newview",
  description="a view that expires in 2 days",
  labels=[("org_unit", "development")]
)
AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

视图使用以下 Google 标准 SQL 查询进行定义:

SELECT column_1, column_2, column_3 FROM myproject.mydataset.mytable

视图选项列表指定了以下内容:

  • 到期时间:自创建视图后 48 小时
  • 易记名称newview
  • 说明A view that expires in 2 days
  • 标签org_unit = development

CREATE MATERIALIZED VIEW 语句

创建新的具体化视图。

语法

CREATE [ OR REPLACE ] MATERIALIZED VIEW [ IF NOT EXISTS ] materialized_view_name
[PARTITION BY partition_expression]
[CLUSTER BY clustering_column_list]
[OPTIONS(materialized_view_option_list)]
AS query_expression

参数

  • OR REPLACE:替换具有相同名称的任何具体化视图(如果存在)。无法以 IF NOT EXISTS 显示。

  • IF NOT EXISTS:如果具体化视图或其他表资源同名,则 CREATE 语句无效。无法以 OR REPLACE 显示。

  • materialized_view_name:要创建的具体化视图的名称。请参阅表路径语法

    如果从具体化视图名称中省略 project_name,或者它与运行此 DDL 查询的项目相同,则后者也会用作对 query_expression 中的表、函数和其他资源的引用的默认项目。引用的默认项目是固定的,不依赖于将来调用新具体化视图的查询。否则,query_expression 中的所有引用都必须使用项目名称进行限定。

    每个数据集的具体化视图名称必须是唯一的。

  • partition_expression:用于确定如何对表进行分区的表达式。具体化视图只能像 query expression基表)中的表一样分区。

  • clustering_column_list:确定如何对具体化视图进行聚簇的列引用的英文逗号分隔列表。

  • materialized_view_option_list** 可用于指定其他具体化视图选项,例如是否启用刷新、刷新间隔、标签和到期时间。

  • query_expression:用于定义具体化视图的 Google 标准 SQL 查询表达式。

详细信息

CREATE MATERIALIZED VIEW 语句必须符合以下规则:

  • 只允许一个 CREATE 语句。

具体化视图正文中的默认项目

如果具体化视图是在用于运行 CREATE MATERIALIZED VIEW 语句的项目中创建的,则具体化视图正文 query_expression 可以在不指定项目的情况下引用实体;默认项目是拥有具体化视图的项目。请考虑以下示例查询。

CREATE MATERIALIZED VIEW myProject.myDataset.myView AS SELECT * FROM anotherDataset.myTable;

在项目 myProject 中运行上述 CREATE MATERIALIZED VIEW 查询后,您可以运行查询 SELECT * FROM myProject.myDataset.myView。无论选择哪个项目来运行此 SELECT 查询,引用的表 anotherDataset.myTable 始终会针对项目 myProject 进行解析。

如果具体化视图并非是在用于运行 CREATE VIEW 语句的项目中创建的,则具体化视图正文 query_expression 中的所有引用都必须使用项目 ID 进行限定。例如,如果前面的示例 CREATE MATERIALIZED VIEW 查询在 myProject 之外的其他项目中运行,则该查询无效。

materialized_view_option_list

通过选项列表,您可以设置具体化视图选项,例如是否启用刷新、刷新间隔、标签和到期时间。可使用逗号分隔列表包括多个选项。

请按以下格式指定具体化视图选项列表:

NAME=VALUE, ...

NAMEVALUE 必须是下述组合之一:

NAME VALUE 详情
enable_refresh BOOLEAN

示例:enable_refresh=false

refresh_interval_minutes FLOAT64

示例:refresh_interval_minutes=20

expiration_timestamp TIMESTAMP

示例:expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC"

此属性等效于 expirationTime 表资源属性。

friendly_name

STRING

示例:friendly_name="my_mv"

此属性等效于 friendlyName 表资源属性。

description

STRING

示例:description="a materialized view that expires in 2025"

此属性等效于 description 表资源属性。

labels

ARRAY<STRUCT<STRING, STRING>>

示例:labels=[("org_unit", "development")]

此属性等效于 labels 表资源属性。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.create 要在其中创建具体化视图的数据集。

此外,OR REPLACE 子句需要 bigquery.tables.update 权限。

如果 OPTIONS 子句包含任何到期时间选项,则还需要 bigquery.tables.delete 权限。

示例

创建新的具体化视图

以下示例在 mydataset 中创建了一个名为 new_mv 的具体化视图:

CREATE MATERIALIZED VIEW `myproject.mydataset.new_mv`
OPTIONS(
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
  friendly_name="new_mv",
  description="a materialized view that expires in 2 days",
  labels=[("org_unit", "development")],
  enable_refresh=true,
  refresh_interval_minutes=20
)
AS SELECT column_1, SUM(column_2) AS sum_2, AVG(column_3) AS avg_3
FROM `myproject.mydataset.mytable`
GROUP BY column_1

如果数据集中已存在此具体化视图名称,会返回以下错误:

Already Exists: project_id:dataset.materialized_view

使用 DDL 语句创建具体化视图时,您必须按以下格式指定项目、数据集和具体化视图:`project_id.dataset.materialized_view`(如果 project_id 包含特殊字符,则包括反引号);例如 `myproject.mydataset.new_mv`

具体化视图使用以下 Google 标准 SQL 查询进行定义:

SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

具体化视图选项列表指定了以下内容:

  • 到期时间:自创建具体化视图后 48 小时
  • 易记名称new_mv
  • 说明A materialized view that expires in 2 days
  • 标签org_unit = development
  • 已启用刷新:true
  • 刷新间隔:20 分钟

仅当某个具体化视图不存在时才创建该视图

以下示例仅在 mydataset 中不存在名为 new_mv 的具体化视图时才在 mydataset 中创建名为 new_mv 的具体化视图。如果数据集中存在该具体化视图名称,则不会返回任何错误,也不会执行任何操作。

CREATE MATERIALIZED VIEW IF NOT EXISTS `myproject.mydataset.new_mv`
OPTIONS(
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR),
  friendly_name="new_mv",
  description="a view that expires in 2 days",
  labels=[("org_unit", "development")],
  enable_refresh=false
)
AS SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

具体化视图使用以下 Google 标准 SQL 查询进行定义:

SELECT column_1, column_2, column_3 FROM `myproject.mydataset.mytable`

具体化视图选项列表指定了以下内容:

  • 到期时间:自创建视图后 48 小时
  • 易记名称new_mv
  • 说明A view that expires in 2 days
  • 标签org_unit = development
  • 已启用刷新:false

使用分区和聚簇创建具体化视图

以下示例在 mydataset 中创建一个名为 new_mv 的具体化视图,按 col_datetime 列进行分区并按 col_int 列进行聚簇:

CREATE MATERIALIZED VIEW `myproject.mydataset.new_mv`
PARTITION BY DATE(col_datetime)
CLUSTER BY col_int
AS SELECT col_int, col_datetime, COUNT(1) as cnt
   FROM `myproject.mydataset.mv_base_table`
   GROUP BY col_int, col_datetime

基表 mv_base_table 也必须按 col_datetime 列进行分区。如需了解详情,请参阅使用分区表和聚簇表

CREATE EXTERNAL TABLE 语句

创建一个新的外部表。

外部表允许 BigQuery 查询存储在 BigQuery 存储空间以外的数据。如需详细了解外部表,请参阅外部数据源简介

语法

CREATE [ OR REPLACE ] EXTERNAL TABLE [ IF NOT EXISTS ] table_name
[(
  column_name column_schema,
  ...
)]
[WITH CONNECTION connection_name]
[WITH PARTITION COLUMNS
  [(
      partition_column_name partition_column_type,
      ...
  )]
]
OPTIONS (
  external_table_option_list,
  ...
);

参数

  • OR REPLACE:替换任何同名的外部表(如果存在)。无法以 IF NOT EXISTS 显示。

  • IF NOT EXISTS:如果外部表或其他表资源同名,则 CREATE 语句无效。无法以 OR REPLACE 显示。

  • table_name:外部表的名称。请参阅表路径语法

  • column_name:表中的列名称。

  • column_schema:指定列的架构。它使用的语法与 CREATE TABLE 语句中的 column_schema 定义相同。如果您不添加此子句,BigQuery 会自动检测架构。

  • connection_name:指定具有用于访问外部数据的凭据的连接资源。采用 PROJECT_ID.LOCATION.CONNECTION_ID 形式指定连接名称。如果项目 ID 或位置包含短划线,请将连接名称用英文反引号 (`) 括起来。

  • partition_column_name:分区列的名称。如果外部数据使用 Hive 分区布局,请添加此字段。如需了解详情,请参阅支持的数据布局

  • partition_column_type:分区列类型。

  • external_table_option_list:用于创建外部表的选项列表。

详情

CREATE EXTERNAL TABLE 语句不支持创建临时外部表。

如需创建外部分区表,请使用 WITH PARTITION COLUMNS 子句指定分区架构的详细信息。BigQuery 会根据外部数据位置验证列定义。架构声明必须严格遵循外部路径中的字段顺序。如需详细了解外部分区,请参阅查询外部分区数据

external_table_option_list

此选项列表指定用于创建外部表的选项。您必须提供 formaturis 选项。请按以下格式指定选项列表:NAME=VALUE, ...

选项
allow_jagged_rows

BOOL

如果为 true,则表示允许末尾处缺少可选列的行。

适用于 CSV 数据。

allow_quoted_newlines

BOOL

如果为 true,则表示文件中允许引号括起来的数据部分中包含换行符。

适用于 CSV 数据。

compression

STRING

数据源的压缩类型。支持的值包括:GZIP。如果未指定,则数据源未压缩。

适用于 CSV 和 JSON 数据。

description

STRING

此表的说明。

enable_logical_types

BOOL

如果为 true,则将 Avro 逻辑类型转换为相应的 SQL 类型。如需了解详情,请参阅逻辑类型

适用于 Avro 数据。

enum_as_string

BOOL

如果为 true,则默认将 Parquet ENUM 逻辑类型推断为 STRING 而不是 BYTES。

适用于 Parquet 数据。

enable_list_inference

BOOL

如果为 true,则专门为 Parquet LIST 逻辑类型使用架构推断。

适用于 Parquet 数据。

encoding

STRING

数据的字符编码。支持的值包括:UTF8(或 UTF-8)、ISO_8859_1(或 ISO-8859-1)。

适用于 CSV 数据。

expiration_timestamp

TIMESTAMP

此表的到期时间。如果未指定,则该表不会过期。

示例:"2025-01-01 00:00:00 UTC"

field_delimiter

STRING

CSV 文件中的字段的分隔符。

适用于 CSV 数据。

format

STRING

外部数据的格式。 支持的 CREATE EXTERNAL TABLE 值包括:AVROCSVDATASTORE_BACKUPGOOGLE_SHEETSNEWLINE_DELIMITED_JSON(或 JSON)、ORCPARQUET

支持的 LOAD DATA 值包括:AVROCSVNEWLINE_DELIMITED_JSON(或 JSON)、ORCPARQUET

JSON 相当于 NEWLINE_DELIMITED_JSON

decimal_target_types

ARRAY<STRING>

确定如何转换 Decimal 类型。相当于 ExternalDataConfiguration.decimal_target_types

示例:["NUMERIC", "BIGNUMERIC"]

json_extension

STRING

对于 JSON 数据,指示特定的 JSON 交换格式。如果未指定,BigQuery 会以通用 JSON 记录的形式读取数据。

支持的值包括:
GEOJSON。以换行符分隔的 GeoJSON 数据。如需了解详情,请参阅根据以换行符分隔的 GeoJSON 文件创建外部表

hive_partition_uri_prefix

STRING

分区键编码开始之前所有源 URI 的通用前缀。仅适用于 Hive 分区的外部表。

适用于 Avro、CSV、JSON、Parquet、ORC 数据。

示例:"gs://bucket/path"

ignore_unknown_values

BOOL

如果为 true,则系统会忽略表架构中不存在的额外值,而不返回错误。

适用于 CSV 和 JSON 数据。

max_bad_records

INT64

读取数据时要忽略的错误记录数上限。

适用于 CSV、JSON、表格数据。

null_marker

STRING

表示 CSV 文件中 NULL 值的字符串。

适用于 CSV 数据。

preserve_ascii_control_characters

BOOL

如果为 true,则系统会保留嵌入的 ASCII 控制字符,即 ASCII 表中的前 32 个字符(范围从“\x00”到“\x1F”)。

适用于 CSV 数据。

projection_fields

STRING

要加载的实体属性的列表。

适用于 Datastore 数据。

quote

STRING

用于括起 CSV 文件中数据部分的字符串。如果您的数据包含括起的换行符,另请将 allow_quoted_newlines 属性设置为 true

适用于 CSV 数据。

reference_file_schema_uri

STRING

用户提供的包含表架构的参考文件。

适用于 Parquet/ORC/AVRO 数据。

示例:"gs://bucket/path/reference_schema_file.parquet"

require_hive_partition_filter

BOOL

如果为 true,则对此表进行的所有查询都需要分区过滤条件,该过滤条件可用于在读取数据时清除分区。仅适用于 Hive 分区的外部表。

适用于 Avro、CSV、JSON、Parquet、ORC 数据。

sheet_range

STRING

要查询的表格的电子表格范围。

适用于表格数据。

示例:“sheet1!A1:B20”

skip_leading_rows

INT64

读取数据时要跳过的文件顶部行数。

适用于 CSV 和表格数据。

uris

ARRAY<STRING>

外部数据位置的完全限定 URI 数组。

示例:["gs://bucket/path/*"]

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.create 您在其中创建外部表的数据集。

此外,OR REPLACE 子句需要 bigquery.tables.update 权限。

如果 OPTIONS 子句包含到期时间,则还需要 bigquery.tables.delete 权限。

示例

以下示例通过多个 URI 创建外部表。数据格式为 CSV。此示例使用架构自动检测功能。

CREATE EXTERNAL TABLE dataset.CsvTable OPTIONS (
  format = 'CSV',
  uris = ['gs://bucket/path1.csv', 'gs://bucket/path2.csv']
);

下面的示例将根据 CSV 文件创建外部表并明确指定架构。此外,它还会指定字段分隔符 ('|') 并设置允许的错误记录数上限。

CREATE OR REPLACE EXTERNAL TABLE dataset.CsvTable
(
  x INT64,
  y STRING
)
OPTIONS (
  format = 'CSV',
  uris = ['gs://bucket/path1.csv'],
  field_delimiter = '|',
  max_bad_records = 5
);

下面的示例将创建一个外部分区表。它使用架构自动检测功能来检测文件架构和 Hive 分区布局。如果外部路径是 gs://bucket/path/field_1=first/field_2=1/data.parquet,则分区列会被检测为 field_1 (STRING) 和 field_2 (INT64)。

CREATE EXTERNAL TABLE dataset.AutoHivePartitionedTable
WITH PARTITION COLUMNS
OPTIONS (
  uris = ['gs://bucket/path/*'],
  format = 'PARQUET',
  hive_partition_uri_prefix = 'gs://bucket/path',
  require_hive_partition_filter = false);

下面的示例将通过明确指定分区列来创建外部分区表。此示例假定外部文件路径的格式为 gs://bucket/path/field_1=first/field_2=1/data.parquet

CREATE EXTERNAL TABLE dataset.CustomHivePartitionedTable
WITH PARTITION COLUMNS (
  field_1 STRING, -- column order must match the external path
  field_2 INT64)
OPTIONS (
  uris = ['gs://bucket/path/*'],
  format = 'PARQUET',
  hive_partition_uri_prefix = 'gs://bucket/path',
  require_hive_partition_filter = false);

CREATE FUNCTION 语句

创建一个新的用户定义的函数 (UDF)。BigQuery 支持使用 SQL 或 JavaScript 编写的 UDF。

语法

如需创建 SQL UDF,请使用以下语法:

CREATE [ OR REPLACE ] [ TEMPORARY | TEMP ] FUNCTION [ IF NOT EXISTS ]
    [[project_name.]dataset_name.]function_name
    ([named_parameter[, ...]])
     ([named_parameter[, ...]])
  [RETURNS data_type]
  AS (sql_expression)
  [OPTIONS (function_option_list)]

named_parameter:
  param_name param_type

如需创建 JavaScript UDF,请使用以下语法:

CREATE [OR REPLACE] [TEMPORARY | TEMP] FUNCTION [IF NOT EXISTS]
    [[project_name.]dataset_name.]function_name
    ([named_parameter[, ...]])
  RETURNS data_type
  [determinism_specifier]
  LANGUAGE js
  [OPTIONS (function_option_list)]
  AS javascript_code

named_parameter:
  param_name param_type

determinism_specifier:
  { DETERMINISTIC | NOT DETERMINISTIC }

如需创建远程函数,请使用以下语法:

CREATE [OR REPLACE] FUNCTION [IF NOT EXISTS]
    [[project_name.]dataset_name.]function_name
    ([named_parameter[, ...]])
  RETURNS data_type
  REMOTE WITH CONNECTION connection_path
  [OPTIONS (function_option_list)]

named_parameter:
  param_name param_type

例程名称只能包含字母、数字和下划线,长度不超过 256 个字符。

参数

  • OR REPLACE:替换任何同名的函数(如果存在)。无法以 IF NOT EXISTS 显示。

  • IF NOT EXISTS:如果存在同名的数据集,则 CREATE 语句无效。无法以 OR REPLACE 显示。

  • TEMPTEMPORARY:创建临时函数。如果子句不存在,则该语句将创建永久性 UDF。您可以在多个查询间重复使用永久性 UDF,但只能在单个查询、脚本或过程中使用临时性 UDF。

  • project_name。对于永久性函数,是指您要在其中创建函数的项目的名称。默认为运行此 DDL 查询的项目。请勿包括临时性函数的项目名称。

  • dataset_name。对于永久性函数,是指您要在其中创建函数的数据集的名称。默认为请求中的 defaultDataset。请勿包括临时性函数的数据集名称。

  • function_name。函数的名称。

  • named_parameter:使用英文逗号分隔的 param_nameparam_type 对。param_type 的值为 BigQuery 数据类型。对于 SQL UDF,param_type 的值也可以是 ANY TYPE

  • determinism_specifier:仅适用于 JavaScript UDF。向 BigQuery 提供关于是否可缓存查询结果的提示。可以是下列值之一:

    • DETERMINISTIC:传递相同的参数时,函数始终返回相同的结果。查询结果可能可缓存。例如,如果函数 add_one(i) 始终返回 i + 1,则该函数是确定性函数。

    • NOT DETERMINISTIC:在传递相同的参数时,函数并不总是返回相同的结果,因此无法缓存。例如,如果函数 add_random(i) 返回 i + rand(),则该函数不是确定性的,并且 BigQuery 不会使用缓存的结果。

      如果调用的所有函数均为 DETERMINISTIC,则 BigQuery 将尝试缓存结果,除非由于其他原因无法缓存结果。如需了解详情,请参阅使用缓存的查询结果

  • data_type:函数返回的数据类型。

    • 如果函数是使用 SQL 定义的,则 RETURNS 为可选子句。如果省略 RETURNS 子句,则当查询调用函数时,BigQuery 会通过 SQL 函数体推断出函数的结果类型。
    • 如果函数是使用 JavaScript 定义的,则需要 RETURNS 子句。如需详细了解可使用的 data_type 值,请参阅支持的 JavaScript UDF 数据类型
  • sql_expression:用于定义函数的 SQL 表达式。

  • function_option_list。用于创建函数的选项列表。

  • javascript_code:JavaScript 函数的定义。 该值为字符串字面量。如果代码包含英文引号和反斜杠,则必须进行转义或表示为原始字符串。例如,代码 return "\n"; 可以表示为以下之一:

    • 带英文引号的字符串 "return \"\\n\";"。英文引号和反斜杠都需要进行转义。
    • 带英文三引号的字符串:"""return "\\n";"""。反斜杠需要进行转义,而英文引号不需要。
    • 原始字符串:r"""return "\n";"""。无需进行转义。
  • connection_name:指定具有可访问远程端点的凭据的连接资源。指定连接名称,格式为 project_name.location.connection_id。如果项目名称或位置包含短划线,请将连接名称用英文反引号 (`) 括起来。

function_option_list

此选项列表指定用于创建 UDF 的选项。支持的选项如下:

NAME VALUE 详情
description

STRING

UDF 的说明。
library

ARRAY<STRING>

要包含在函数定义中的 JavaScript 库数组。仅适用于 JavaScript UDF。如需了解详情,请参阅包含 JavaScript 库

示例:["gs://my-bucket/lib1.js", "gs://my-bucket/lib2.js"]

endpoint

STRING

Cloud Functions 的 HTTP 端点。仅适用于远程函数。

示例:"https://us-east1-your-project.cloudfunctions.net/foo"

如需了解详情,请参阅创建远程函数

user_defined_context

ARRAY<STRUCT<STRING,STRING>>

调用函数时将随每个 HTTP 请求一起发送的键值对列表。仅适用于远程函数。

示例:[("key1","value1"),("key2", "value2")]

max_batching_rows

INT64

每个 HTTP 请求中的行数上限。如果未指定该选项,BigQuery 会自行确定 HTTP 请求中包含的行数。仅适用于远程函数。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.routines.create 您在其中创建函数的数据集。

此外,OR REPLACE 子句需要 bigquery.routines.update 权限。

如需创建远程函数,您需要具有额外的 IAM 权限

权限 资源
bigquery.connections.delegate 用于创建远程函数的连接。

示例

创建 SQL UDF

以下示例会在名为 mydataset 的数据集中创建一个名为 multiplyInputs 的永久性 SQL UDF。

CREATE FUNCTION mydataset.multiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
AS (x * y);

创建 JavaScript UDF

以下示例会创建一个名为 multiplyInputs 的临时性 JavaScript UDF,并从 SELECT 语句中对其进行调用。

CREATE TEMP FUNCTION multiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS r"""
  return x*y;
""";

SELECT multiplyInputs(a, b) FROM (SELECT 3 as a, 2 as b);

创建远程函数

以下示例会在名为 mydataset 的数据集中创建一个名为 remoteMultiplyInputs 的永久性远程函数,这里会假定 mydataset 位于 US 并且 myconnection 连接位于同一位置的相同项目中。

CREATE FUNCTION mydataset.remoteMultiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
REMOTE WITH CONNECTION us.myconnection
OPTIONS(endpoint="https://us-central1-myproject.cloudfunctions.net/multiply");

CREATE TABLE FUNCTION 语句

创建新的表函数(也称为“”表值函数 (TVF))。

语法

CREATE [ OR REPLACE ] TABLE FUNCTION [ IF NOT EXISTS ]
  [[project_name.]dataset_name.]function_name
  ( [ function_parameter [, ...] ] )
  [RETURNS TABLE < column_declaration [, ...] > ]
  AS sql_query

function_parameter:
  parameter_name { data_type | ANY TYPE }

column_declaration:
  column_name data_type

参数

  • OR REPLACE:替换任何同名的表函数(如果存在)。无法以 IF NOT EXISTS 显示。
  • IF NOT EXISTS:如果存在任何同名的表函数,则 CREATE 语句无效。无法以 OR REPLACE 显示。
  • project_name:要在其中创建函数的项目的名称。默认为运行此 DDL 语句的项目。
  • dataset_name:要在其中创建函数的数据集的名称。
  • function_name:要创建的函数的名称。
  • function_parameter:函数的参数,指定为参数名称和数据类型。data_type 的值是标量 BigQuery 数据类型ANY TYPE
  • RETURNS TABLE:函数返回的表的架构,此标志指定为列名称和数据类型对的逗号分隔列表。如果 RETURNS TABLE 不存在,则 BigQuery 会通过函数正文中的查询语句推断输出架构。如果包含 RETURNS TABLE,则所返回表类型中的名称必须与 SQL 查询中的列名称匹配。
  • sql_query:指定要运行的 SQL 查询。SQL 查询必须包含所有列的名称。

详情

BigQuery 会尽可能强制转换参数类型。例如,如果参数类型为 FLOAT64 并且传递 INT64 值,则 BigQuery 会将其强制转换为 FLOAT64

如果参数类型为 ANY TYPE,则该函数接受此参数的任何类型的输入。您传递给函数的类型必须与函数定义兼容。如果您传递的参数类型不兼容,则查询会返回错误。如果多个参数的类型为 ANY TYPE,则 BigQuery 不会在这些参数之间强制执行任何类型关系。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.routines.create 您在其中创建表函数的数据集。

此外,OR REPLACE 子句需要 bigquery.routines.update 权限。

示例

以下表函数接受用于过滤查询结果的 INT64 参数:

CREATE OR REPLACE TABLE FUNCTION mydataset.names_by_year(y INT64)
AS
  SELECT year, name, SUM(number) AS total
  FROM `bigquery-public-data.usa_names.usa_1910_current`
  WHERE year = y
  GROUP BY year, name

以下示例在 RETURNS 子句中指定返回 TABLE 类型:

CREATE OR REPLACE TABLE FUNCTION mydataset.names_by_year(y INT64)
RETURNS TABLE<name STRING, year INT64, total INT64>
AS
  SELECT year, name, SUM(number) AS total
  FROM `bigquery-public-data.usa_names.usa_1910_current`
  WHERE year = y
  GROUP BY year, name

CREATE PROCEDURE 语句

创建一个新过程,该过程是可以从其他查询调用的语句块。 过程可以递归调用自身。

语法

CREATE [OR REPLACE] PROCEDURE [IF NOT EXISTS]
[[project_name.]dataset_name.]procedure_name (procedure_argument[, ...] )
[OPTIONS(procedure_option_list)]
BEGIN
multi_statement_query
END;

procedure_argument: [procedure_argument_mode] argument_name argument_type

procedure_argument_mode: IN | OUT | INOUT

参数

  • OR REPLACE:替换任何同名的过程(如果存在)。无法以 IF NOT EXISTS 显示。

  • IF NOT EXISTS:如果存在同名过程,则 CREATE 语句无效。无法以 OR REPLACE 显示。

  • project_name**:您要在其中创建过程的项目的名称。 默认为运行此 DDL 查询的项目。如果项目名称包含特殊字符(例如英文冒号),则应使用反引号 ` 将项目名称括起来(示例:`google.com:my_project`)。

  • dataset_name:您要在其中创建过程的数据集的名称。默认为请求中的 defaultDataset

  • procedure_name:要创建的过程的名称。

  • multi_statement_query:要运行的多语句查询

  • argument_type:任何有效的 BigQuery 类型

  • procedure_argument_mode:指定参数是输入还是输出,或者既是输入又是输出。

procedure_option_list

procedure_option_list 可让您指定过程选项。过程选项与表选项的语法和要求相同,但包含的 NAMEVALUE 列表不同:

NAME VALUE 详情
strict_mode

BOOL

示例:strict_mode=FALSE

如果 strict_modeTRUE,则过程主体将针对诸如表或列不存在之类的错误接受额外的检查。如果主体未通过其中任何检查,则 CREATE PROCEDURE 语句将失败。

虽然 strict_mode 有助于捕获许多常见类型的错误,但并非涵盖所有类型的错误,并且使用 strict_mode 成功创建过程并不能保证过程在运行时成功执行。

如果 strict_modeFALSE,则过程主体将仅进行语法检查。应使用 strict_mode=FALSE 创建以递归方式调用自身的过程,以避免尚不存在的过程在验证期间引发错误。

默认值为 TRUE

description

STRING

示例:description="A procedure that runs a query."

过程的说明。

参数模式

IN 指示参数只是过程的输入。您可以为 IN 参数指定变量或值表达式。

OUT 指示参数是过程的输出。过程开始时,OUT 参数会初始化为 NULL。您必须为 OUT 参数指定变量。

INOUT 指示参数既是过程的输入,也是过程的输出。您必须为 INOUT 参数指定变量。您可以在过程正文中将 INOUT 参数作为变量引用,并且可以为该参数赋予新值。

如果未指定 INOUTINOUT,则参数会被视为 IN 参数。

变量范围

如果变量是在某个过程之外声明的,并且作为 INOUT 或 OUT 参数传递给该过程,而该过程为该变量赋予了新值,则该新值在该过程之外可见。

在某个过程中声明的变量在该过程之外不可见,反之亦然。

您可以使用 SETOUTINOUT 参数赋值,在这种情况下,修改后的值在相应过程之外可见。如果该过程成功退出,则 OUTINOUT 参数的值是赋予该 INOUT 变量的最终值。

由于临时表存在于脚本的生命周期内,因此,如果某个过程创建了临时表,则该过程的调用者也可以引用该临时表。

过程正文中的默认项目

过程正文可以在不指定项目的情况下引用实体;默认项目是拥有该过程的项目,而不一定是用于运行 CREATE PROCEDURE 语句的项目。请考虑以下示例查询。

CREATE PROCEDURE myProject.myDataset.QueryTable()
BEGIN
  SELECT * FROM anotherDataset.myTable;
END;

创建上述过程后,您可以运行查询 CALL myProject.myDataset.QueryTable()。无论选择哪个项目来运行此 CALL 查询,引用的表 anotherDataset.myTable 始终会针对项目 myProject 进行解析。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.routines.create 您在其中创建过程的数据集。

此外,OR REPLACE 子句需要 bigquery.routines.update 权限。

示例

以下示例会创建一个过程,该过程既接收 x 作为输入参数,又返回 x 作为输出;由于参数 delta 没有参数模式,因此该参数是输入参数。该过程由一个包含单一语句的块组成,该语句将这两个输入参数的总和赋予 x

CREATE PROCEDURE mydataset.AddDelta(INOUT x INT64, delta INT64)
BEGIN
  SET x = x + delta;
END;

以下示例会调用上述示例中的 AddDelta 过程,并将变量 accumulator 传递给该过程两次;由于 AddDelta 内部对 x 的更改在 AddDelta 之外可见,因此这些过程调用使 accumulator 总共增加了 8。

DECLARE accumulator INT64 DEFAULT 0;
CALL mydataset.AddDelta(accumulator, 5);
CALL mydataset.AddDelta(accumulator, 3);
SELECT accumulator;

此示例会返回以下内容:

+-------------+
| accumulator |
+-------------+
|           8 |
+-------------+

以下示例会创建过程 SelectFromTablesAndAppend,该过程接收 target_date 作为输入参数,并返回 rows_added 作为输出。该过程会基于查询创建临时表 DataForTargetDate,然后计算 DataForTargetDate 中的行数并将结果赋予 rows_added。接下来,该过程会在 TargetTable 中插入一个新行,并将 target_date 的值作为列名之一传递。最后,该过程会删除 DataForTargetDate 表并返回 rows_added

CREATE PROCEDURE mydataset.SelectFromTablesAndAppend(
  target_date DATE, OUT rows_added INT64)
BEGIN
  CREATE TEMP TABLE DataForTargetDate AS
  SELECT t1.id, t1.x, t2.y
  FROM dataset.partitioned_table1 AS t1
  JOIN dataset.partitioned_table2 AS t2
  ON t1.id = t2.id
  WHERE t1.date = target_date
    AND t2.date = target_date;

  SET rows_added = (SELECT COUNT(*) FROM DataForTargetDate);

  SELECT id, x, y, target_date  -- note that target_date is a parameter
  FROM DataForTargetDate;

  DROP TABLE DataForTargetDate;
END;

以下示例会声明变量 rows_added,然后将其作为参数(连同 CURRENT_DATE 的值)传递给上一示例中的 SelectFromTablesAndAppend 过程,最后,该示例会返回一条说明添加了多少行的消息。

DECLARE rows_added INT64;
CALL mydataset.SelectFromTablesAndAppend(CURRENT_DATE(), rows_added);
SELECT FORMAT('Added %d rows', rows_added);

CREATE ROW ACCESS POLICY 语句

创建或替换行级访问权限政策。表的行级访问权限政策必须具有唯一名称。

语法

CREATE [ OR REPLACE ] ROW ACCESS POLICY [ IF NOT EXISTS ]
row_access_policy_name ON table_name
[GRANT TO (grantee_list)]
FILTER USING (filter_expression);

参数

  • IF NOT EXISTS:如果存在同名的行级访问权限政策,则 CREATE 语句无效。无法以 OR REPLACE 显示。

  • row_access_policy_name:您要创建的行级访问权限政策的名称。每个表的行级访问政策名称必须是唯一的。行级访问权限政策名称可以包含以下内容:

    • 不超过 256 个字符。
    • 字母(大写或小写)、数字和下划线。必须以字母开头。
  • table_name:要为其创建行级访问权限政策的表的名称。该表必须已经存在。

  • GRANT TO grantee_list:可选子句,它指定应该用于创建行级访问权限政策的初始成员。

    grantee_listiam_member 用户或群组的列表。字符串必须是有效的 IAM 主帐号,或者采用 IAM 政策绑定成员格式的成员,并且必须用引号括起来。系统支持以下类型:

    grantee_list 类型
    user:{emailid}

    表示特定 Google 帐号的电子邮件地址。

    示例:user:alice@example.com

    serviceAccount:{emailid}

    表示服务帐号的电子邮件地址。

    示例:serviceAccount:my-other-app@appspot.gserviceaccount.com

    group:{emailid}

    表示 Google 群组的电子邮件地址。

    示例:group:admins@example.com

    domain:{domain}

    Google Workspace 网域(主网域),表示该网域中的所有用户。

    示例:domain:example.com

    allAuthenticatedUsers 一个特殊的标识符,表示所有服务帐号和互联网上已使用 Google 帐号进行身份验证的所有用户。此标识符包括未关联到 Google Workspace 或 Cloud Identity 网域的帐号,如个人 Gmail 帐号。不包括未经身份验证的用户,例如匿名访问者。
    allUsers 一个特殊的标识符,表示互联网上的任何用户,包括经过身份验证和未经过身份验证的用户。由于 BigQuery 要求进行身份验证,然后用户才能访问该服务,因此 allUsers 仅包括经过身份验证的用户。

    如果一系列 iam_member 值是用英文逗号分隔的并分别用引号括起来,则可以将它们组合起来。例如:"user:alice@example.com","group:admins@example.com","user:sales@example.com"

  • filter_expression:定义仅向 grantee_list 成员显示的表行的子集。filter_expression 类似于 SELECT 查询中的 WHERE 子句。

    以下是有效的过滤条件表达式:

    • Google 标准 SQL 标量函数、聚合函数和分析函数。
    • SESSION_USER(),用于将访问权限限制为仅属于运行查询的用户的行。如果所有行级访问权限政策都不适用于运行查询的用户,则该用户无权访问表中的数据。
    • TRUE。向 grantee_list 字段中的主帐号授予对表的所有行的访问权限。

    过滤条件表达式不能包含以下内容:

    • 对表的引用。
    • 子查询和 SQL 语句,如 SELECTCREATEUPDATE
    • 用户定义的函数。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.rowAccessPolicies.create 目标表。
bigquery.rowAccessPolicies.setIamPolicy 目标表。
bigquery.tables.getData 目标表。

示例

CREATE CAPACITY 语句

通过创建新的容量承诺购买

语法

CREATE CAPACITY
project_id.location_id.commitment_id
AS JSON
capacity_json_object

参数

  • project_id:保持此承诺所有权的管理项目的 ID。
  • location_id:项目的位置
  • commitment_id:承诺的 ID。每个项目和位置的该值必须唯一。该字段必须以小写字母或数字开头和结尾,并且只能包含小写字母、数字和短划线。
  • capacity_json_object:描述容量承诺的 JSON 字符串。

capacity_json_object

指定包含以下字段的 JSON 对象:

NAME TYPE 详情
plan 字符串 要购买的承诺方案。支持的值包括:FLEXMONTHLYANNUAL。如需了解详情,请参阅承诺方案
renewal_plan 字符串 承诺续订方案。仅在 planANNUAL 时适用。如需了解详情,请参阅续订承诺
slot_count 整数 承诺中的槽数。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.capacityCommitments.create 维持承诺所有权的管理项目。

示例

以下示例将创建一个位于 region-us 区域并由 admin_project 项目管理的 100 个灵活槽的容量承诺:

CREATE CAPACITY `admin_project.region-us.my-commitment`
AS JSON """{
 "slot_count": 100,
 "plan": "FLEX"
}"""

CREATE RESERVATION 语句

创建预留。 如需了解详情,请参阅预留简介

语法

CREATE RESERVATION
project_id.location_id.reservation_id
AS JSON
reservation_json_object

参数

  • project_id:创建容量承诺的管理项目的 ID。
  • location_id:项目的位置
  • reservation_id:预留 ID。
  • reservation_json_object:描述预留的 JSON 字符串。

reservation_json_object

指定包含以下字段的 JSON 对象:

NAME TYPE 详情
ignore_idle_slots 布尔值 如果值为 true,则预留仅使用已预配的槽。默认值为 false。 如需了解详情,请参阅空闲槽
slot_capacity 整数 要分配给预留的槽数。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.reservations.create 维持承诺所有权的管理项目。

示例

以下示例将在项目 admin_project 中创建 100 个槽的预留:

CREATE RESERVATION `admin_project.region-us.prod`
AS JSON """{
 "slot_capacity": 100
}"""

CREATE ASSIGNMENT 语句

将项目、文件夹或组织分配到预留。

语法

CREATE ASSIGNMENT
project_id.location_id.reservation_id.assignment_id
AS JSON
assignment_json_object

参数

  • project_id:创建预留的管理项目的 ID。
  • location_id:项目的位置
  • reservation_id:预留 ID。
  • assignment_id:分配的 ID。每个项目和位置的该值必须唯一。该字段必须以小写字母或数字开头和结尾,并且只能包含小写字母、数字和短划线。
  • assignment_json_object:描述分配的 JSON 字符串。

如需从任何预留中移除项目并改用按需结算,请将 reservation_id 设置为 none

assignment_json_object

指定包含以下字段的 JSON 对象:

NAME TYPE 详情
assignee 字符串 要分配给预留的项目、文件夹或组织的 ID。
job_type 字符串 要分配给此预留的作业类型。支持的值包括 QUERYPIPELINEML_EXTERNAL。如需了解详情,请参阅分配

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.reservationAssignments.create 管理项目和分配对象。

示例

以下示例将 my_project 项目分配给查询作业的 prod 预留:

CREATE ASSIGNMENT `admin_project.region-us.prod.my_assignment`
AS JSON """{
 "assignee": "projects/my_project",
 "job_type": "QUERY"
}"""

以下示例将组织分配到流水线作业(如加载和导出作业)的 prod 预留:

CREATE ASSIGNMENT `admin_project.region-us.prod.my_assignment`
AS JSON """{
 "assignee": "organizations/1234",
 "job_type": "PIPELINE"
}"""

CREATE SEARCH INDEX 语句

在表的一个或多个列上创建新的搜索索引

搜索索引使用 SEARCH 函数来实现高效查询。

语法

CREATE SEARCH INDEX [ IF NOT EXISTS ] index_name
ON table_name({ALL COLUMNS | column_name [, ...]})
[OPTIONS(index_option_list)]

参数

  • IF NOT EXISTS:如果表中已存在使用该名称的索引,则不执行任何操作。如果表具有不同名称的索引,则返回错误。

  • index_name:您要创建的索引的名称。由于索引始终在基表所在的项目和数据集中创建,因此无需在名称中指定这些内容。

  • table_name:表格的名称。 请参阅表路径语法

  • ALL COLUMNS:针对表中包含 STRING 字段的每一列创建索引。

  • column_name:表中顶级列的名称,为 STRING 或包含 STRING 字段。该列必须是以下类型之一:

    • STRING
    • ARRAY<STRING>
    • STRUCT,至少包含一个类型为 STRINGARRAY<STRING> 的嵌套字段
    • JSON
  • index_option_list:要在索引上设置的选项列表。

详细信息

每个基表只能创建一个索引。您无法在视图或具体化视图上创建索引。如需修改要编入索引的列,请 DROP 当前索引并创建新索引。

如果任何 column_name 不是 STRING 或不包含 STRING 字段,或者对不包含 STRING 字段的表的 ALL COLUMNS 调用 CREATE SEARCH INDEX,则 BigQuery 将返回错误。

对于具有列 ACL 或行过滤条件的表,创建索引将失败;但是,这些过滤条件可在创建索引后添加到表中。

index_option_list

选项列表指定索引的选项。请按以下格式指定选项:NAME=VALUE, ...

支持的选项如下:

NAME VALUE 详情
analyzer STRING

示例:analyzer='LOG_ANALYZER'

用于为搜索索引生成令牌的文本分析器。支持的值为 'LOG_ANALYZER''NO_OP_ANALYZER'

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.createIndex 创建索引所在的基表。

示例

以下示例在 my_table 的所有字符串列上创建名为 my_index 的索引。这种情况下,仅在 a 列上创建索引。

CREATE TABLE dataset.my_table(a STRING, b INT64);

CREATE SEARCH INDEX my_index
ON dataset.my_table(ALL COLUMNS);

以下示例会使用 NO_OP_ANALYZER 文本分析器针对 amy_struct.string_fieldb 列创建索引。

CREATE TABLE dataset.complex_table(
  a STRING,
  my_struct STRUCT<string_field STRING, int_field INT64>,
  b ARRAY<STRING>
);

CREATE SEARCH INDEX my_index
ON dataset.complex_table(a, my_struct, b)
OPTIONS (analyzer = 'NO_OP_ANALYZER');

ALTER SCHEMA SET DEFAULT COLLATE 语句

为数据集设置排序规则规范

语法

ALTER SCHEMA [IF EXISTS]
[project_name.]dataset_name
SET DEFAULT COLLATE collate_specification

参数

  • IF EXISTS:如果不存在具有该名称的数据集,则语句无效。

  • DEFAULT COLLATE collate_specification:在架构中创建新表时,该表将继承默认的排序规则规范,除非明确为指定排序规则规范。

    更新后的排序规则规范仅适用于之后创建的表。如果要更新现有排序规则规范,您必须更改包含该规范的列。

  • project_name:包含数据集的项目的名称默认为运行此 DDL 语句的项目。

  • dataset_name:数据集的名称。

  • collate_specification:指定要设置的排序规则规范。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.datasets.get 要更改的数据集。
bigquery.datasets.update 要更改的数据集。

示例

假设您在名为 mydataset 的架构中有一个现有表 mytable_a。例如:

CREATE SCHEMA mydataset
CREATE TABLE mydataset.mytable_a
(
  number INT64,
  word STRING
)
+----------------------+
| mydataset.mytable_a  |
|   number INT64       |
|   word STRING        |
+----------------------+

稍后,您决定向架构添加排序规则规范。例如:

ALTER SCHEMA mydataset
SET DEFAULT COLLATE 'und:ci'

如果为架构创建新表,则该表将为所有 STRING 列继承 COLLATE 'und:ci'。例如,在 mydataset 架构中创建 mytable_b 表时,排序规则会添加到 characters

CREATE TABLE mydataset.mytable_b
(
  amount INT64,
  characters STRING
)
+--------------------------------------+
| mydataset.mytable_b                  |
|   amount INT64                       |
|   characters STRING COLLATE 'und:ci' |
+--------------------------------------+

不过,尽管您更新了架构的排序规则规范,但现有表 mytable_a 会继续使用之前的排序规则规范。例如:

+---------------------+
| mydataset.mytable_a |
|   number INT64      |
|   word STRING       |
+---------------------+

ALTER SCHEMA SET OPTIONS 语句

设置数据集的选项。

如果数据集存在,则除非您在查询设置中指定了位置,否则语句会在数据集的位置运行。如需了解详情,请参阅指定位置

语法

ALTER SCHEMA [IF EXISTS]
[project_name.]dataset_name
SET OPTIONS(schema_set_options_list)

参数

  • IF EXISTS:如果不存在具有该名称的数据集,则语句无效。

  • project_name:包含数据集的项目的名称默认为运行此 DDL 语句的项目。

  • dataset_name:数据集的名称。

  • schema_set_options_list:要设置的选项列表。

schema_set_options_list

选项列表指定数据集的选项。请按以下格式指定选项:NAME=VALUE, ...

支持的选项如下:

NAME VALUE 详情
default_kms_key_name STRING 指定用于加密此数据集中的表数据的默认 Cloud KMS 密钥。您可以在创建表时替换此值。
default_partition_expiration_days FLOAT64 指定此数据集中的表分区的默认到期时间(天)。您可以在创建表时替换此值。
default_table_expiration_days FLOAT64 指定此数据集中的表的默认到期时间(天)。您可以在创建表时替换此值。
description STRING 数据集的说明。
friendly_name STRING 数据集的描述性名称。
is_case_insensitive BOOL

处于预览版阶段。 适用于 CREATE SCHEMA,但不适用于 ALTER SCHEMA

如果数据集及其表名称不区分大小写,则值为 TRUE,否则为 FALSE。如果之前未设置该参数,则数据集及其表名称区分大小写。

labels <ARRAY<STRUCT<STRING, STRING>>> 数据集的标签数组,以键值对形式表示。
location STRING 要在其中创建数据集的位置。如果未指定此选项,则系统会在查询运行的位置创建数据集。如果您指定了此选项,并明确设置了查询作业的位置,则这两个值必须匹配:否则查询会失败。
max_time_travel_hours SMALLINT

处于预览版阶段。

指定数据集的时间旅行窗口的时长(以小时为单位)。max_time_travel_hours 值必须是 48(2 天)到 168(7 天)之间的整数。如果未指定此选项,则默认值为 168 小时。

如需详细了解时间旅行窗口,请参阅配置时间旅行窗口

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.datasets.get 要更改的数据集。
bigquery.datasets.update 要更改的数据集。

示例

设置数据集的默认表过期时间

以下示例设置默认的表过期时间。

ALTER SCHEMA mydataset
SET OPTIONS(
  default_table_expiration_days=3.75
  )

ALTER TABLE SET OPTIONS 语句

设置表上的选项。

语法

ALTER TABLE [IF EXISTS] table_name
SET OPTIONS(table_set_options_list)

参数

  • IF EXISTS:如果不存在使用该名称的表,则语句无效。

  • table_name:要修改的表的名称。请参阅表路径语法

  • table_set_options_list:要设置的选项列表。

详情

外部表不支持此语句。

table_set_options_list

可通过选项列表设置标签和到期时间等表选项。可使用逗号分隔列表包括多个选项。

请按以下格式指定表选项列表:

NAME=VALUE, ...

NAMEVALUE 必须是下述组合之一:

NAME VALUE 详情
expiration_timestamp TIMESTAMP

示例:expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC"

此属性等效于 expirationTime 表资源属性。

partition_expiration_days

FLOAT64

示例:partition_expiration_days=7

设置分区过期时间(以天为单位)。如需了解详情,请参阅设置分区过期时间。默认情况下,分区不会过期。

此属性等效于 timePartitioning.expirationMs 表资源属性,但单位是天而非毫秒。一天相当于 8640 万毫秒(即 24 小时)。

只能对分区表设置此属性。

require_partition_filter

BOOL

示例:require_partition_filter=true

指定此表的查询是否必须包含对分区列进行过滤的谓词过滤条件。如需了解详情,请参阅设置分区过滤条件。默认值为 false

此属性等效于 timePartitioning.requirePartitionFilter 表资源属性。

只能对分区表设置此属性。

kms_key_name

STRING

示例:kms_key_name="projects/project_id/locations/location/keyRings/keyring/cryptoKeys/key"

此属性等效于 encryptionConfiguration.kmsKeyName 表资源属性。

请查看有关使用 Cloud KMS 密钥保护数据的详细信息。

friendly_name

STRING

示例:friendly_name="my_table"

此属性等效于 friendlyName 表资源属性。

description

STRING

示例:description="a table that expires in 2025"

此属性等效于 description 表资源属性。

labels

ARRAY<STRUCT<STRING, STRING>>

示例:labels=[("org_unit", "development")]

此属性等效于 labels 表资源属性。

VALUE 是一个只包含文字、查询参数和标量函数的常数表达式。

常量表达式不得包含以下内容:

  • 对表的引用
  • 子查询和 SQL 语句,如 SELECTCREATEUPDATE
  • 用户定义的函数、聚合函数或分析函数
  • 以下标量函数:
    • ARRAY_TO_STRING
    • REPLACE
    • REGEXP_REPLACE
    • RAND
    • FORMAT
    • LPAD
    • RPAD
    • REPEAT
    • SESSION_USER
    • GENERATE_ARRAY
    • GENERATE_DATE_ARRAY

设置该值会替换表的该选项的现有值(如果有)。将该值设置为 NULL 会清除表中该选项的值。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.get 要更改的表。
bigquery.tables.update 要更改的表。

示例

设置表上的到期时间戳和说明

以下示例将表上的到期时间戳设置为执行 ALTER TABLE 语句后七天,还设置了说明:

ALTER TABLE mydataset.mytable
SET OPTIONS (
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY),
  description="Table that expires seven days from now"
)

对分区表设置 require partition filter 特性

以下示例会对分区表设置 timePartitioning.requirePartitionFilter 特性:

ALTER TABLE mydataset.mypartitionedtable
SET OPTIONS (require_partition_filter=true)

引用此表的查询必须对分区列使用过滤条件,否则 BigQuery 会返回错误。将此选项设置为 true 有助于避免查询超过预期的数据量。

清除表上的到期时间戳

以下示例清除表上的到期时间戳,使其不会过期:

ALTER TABLE mydataset.mytable
SET OPTIONS (expiration_timestamp=NULL)

ALTER TABLE ADD COLUMN 语句

向现有表架构添加一个新列或多个新列。

语法

ALTER TABLE table_name
ADD COLUMN [IF NOT EXISTS] column[, ...]

参数

  • table_name:表格的名称。 请参阅表路径语法

  • IF EXISTS:如果列名称已存在,则语句将不起作用。

  • column:要添加的列。这包括要添加的列和架构的名称。此列名称和架构使用 CREATE TABLE 语句中使用的语法。

详情

您无法使用此语句创建以下列:

  • 分区列。
  • 聚簇列。
  • 现有 RECORD 字段中的嵌套列。

不能向现有表架构添加 REQUIRED 列。但是,您可以创建嵌套的 REQUIRED 列以作为新的 RECORD 字段的一部分。

外部表不支持此语句。

在没有 IF NOT EXISTS 子句的情况下,如果表已包含使用该名称的列,则语句将返回错误。如果包含 IF NOT EXISTS 子句且列名已存在,则系统不会返回任何错误,也不会执行任何操作。

现有行对应的新列的值设置为下列值之一:

  • 如果采用 NULLABLE 模式添加了新列,则为 NULL。这是默认模式。
  • 如果采用 REPEATED 模式添加了新列,则为空的 ARRAY

如需详细了解 BigQuery 中的架构修改,请参阅修改表架构

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.get 要更改的表。
bigquery.tables.update 要更改的表。

示例

添加列

以下示例会将以下列添加到名为 mytable 的现有表中:

  • 类型为 STRING 的列 A
  • 类型为 GEOGRAPHY 的列 B
  • 类型为 NUMERIC 且采用 REPEATED 模式的列 C
  • 类型为 DATE 且具有说明的列 D
ALTER TABLE mydataset.mytable
  ADD COLUMN A STRING,
  ADD COLUMN IF NOT EXISTS B GEOGRAPHY,
  ADD COLUMN C ARRAY<NUMERIC>,
  ADD COLUMN D DATE OPTIONS(description="my description")

如果已存在名为 ACD 的任意列,则语句将失败。如果已存在列 B,则由于 IF NOT EXISTS 子句的原因,语句将会成功。

添加 RECORD

以下示例添加了一个名为 A 且类型为 STRUCT 的列,其中包含以下嵌套列:

  • 类型为 GEOGRAPHY 的列 B
  • 类型为 INT64 且采用 REPEATED 模式的列 C
  • 类型为 INT64 且采用 REQUIRED 模式的列 D
  • 类型为 TIMESTAMP 且具有说明的列 E
ALTER TABLE mydataset.mytable
   ADD COLUMN A STRUCT<
       B GEOGRAPHY,
       C ARRAY<INT64>,
       D INT64 NOT NULL,
       E TIMESTAMP OPTIONS(description="creation time")
       >

如果表已有名为 A 的列,则即使该列不包含任何指定的嵌套列,查询也会失败。

名为 A 的新 STRUCT 可为 null,但 A 的任何 STRUCT 值都需要 A 中的嵌套列 D

向列添加排序规则支持

为表创建新列时,可以为该列明确分配新的排序规则规范。

ALTER TABLE mydataset.mytable
ADD COLUMN word STRING COLLATE 'und:ci'

ALTER TABLE RENAME TO 语句

重命名克隆、快照或表。

语法

ALTER TABLE [IF EXISTS] table_name
RENAME TO new_table_name

参数

  • IF EXISTS:如果不存在使用该名称的表,则语句无效。

  • table_name:要重命名的表的名称。请参阅表路径语法

  • new_table_name:表的新名称。新名称不能是现有的表名称。

详情

  • 外部表不支持此语句。
  • 如果在重命名表时更改表政策或行级访问权限政策,则这些更改可能无效。
  • 如果您想重命名包含流式插入到其中的数据的表,则必须停止流式插入,然后等待 BigQuery 指示当前未使用流式插入。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.get 要更改的表。
bigquery.tables.update 要更改的表。

示例

重命名表

以下示例将表 mydataset.mytable 重命名为 mydataset.mynewtable

ALTER TABLE mydataset.mytable RENAME TO mynewtable

ALTER TABLE RENAME COLUMN 语句

重命名现有表架构中的一列或多列。

语法

ALTER TABLE [IF EXISTS] table_name
RENAME COLUMN [IF EXISTS] column_to_column[, ...]

column_to_column :=
    column_name TO new_column_name

参数

  • (ALTER TABLE) IF EXISTS:如果指定的表不存在,则语句无效。

  • table_name:要修改的表的名称。请参阅表路径语法

  • (ALTER COLUMN) IF EXISTS:如果指定的列不存在,则语句无效。

  • column_name:您要更改的顶级列的名称。

  • new_column_name:列的新名称。新名称不能是现有的列名称。

详情

外部表不支持此语句。

如果要修改的表具有有效的行级访问权限政策,该语句将返回错误。

在没有 IF EXISTS 子句的情况下,如果表不包含具有该名称的列,则语句将返回错误。如果包含 IF EXISTS 子句,但列名称不存在,则不会返回任何错误,也不会执行任何操作。

此语句仅重命名表中的列。引用该列的任何对象(例如视图或具体化视图)都必须单独更新或重新创建。

您无法使用此语句来重命名以下内容:

  • 子字段,例如 STRUCT 中的嵌套列
  • 分区列
  • 聚簇列

重命名表中的一列或多列后,您可能无法执行以下操作:

  • 使用旧版 SQL 查询表。
  • 使用 BigQuery BI Engine 加快对表的查询速度。
  • 使用通配符表查询表。
  • 在 Google Cloud 控制台中复制表。
  • 使用 bq cp 命令复制表。

使用列的原始名称重命名列可移除这些限制。

支持在一个 ALTER TABLE 语句中使用多个 RENAME COLUMN 语句。系统会按顺序解释并验证重命名序列。每个 column_name 都必须引用应用所有先前重命名之后存在的列名称。一个语句中不能同时使用 RENAME COLUMN 和其他 ALTER TABLE 操作。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.get 要更改的表。
bigquery.tables.update 要更改的表。

示例

重命名列

以下示例重命名名为 mytable 的现有表中的列:

  • A -> columnA
  • B -> columnB
ALTER TABLE mydataset.mytable
  RENAME COLUMN A TO columnA,
  RENAME COLUMN IF EXISTS B TO columnB

如果列 A 不存在,则语句将失败。如果列 B 不存在,则由于 IF EXISTS 子句,该语句仍会成功。

以下示例将交换 columnAcolumnB 的名称:

ALTER TABLE mydataset.mytable
  RENAME COLUMN columnA TO temp,
  RENAME COLUMN columnB TO columnA,
  RENAME COLUMN temp TO columnB

ALTER TABLE DROP COLUMN 语句

从现有表架构中丢弃一列或多列。

语法

ALTER TABLE table_name
DROP COLUMN [IF EXISTS] column_name [, ...]

参数

  • table_name:要修改的表的名称。请参阅表路径语法。该表必须已存在且具有架构。

  • IF EXISTS:如果指定的列不存在,则语句无效。

  • column_name:要丢弃的列的名称。

详情

该语句不会立即释放与丢弃的列关联的存储空间。存储空间必须在丢弃列之日起的 7 天内在后台收回。

如需了解如何立即回收存储空间,请参阅从表架构中删除列

您无法使用此语句来删除以下列:

  • 分区列
  • 聚簇列
  • 现有 RECORD 字段中的嵌套列。

外部表不支持此语句。

在没有 IF EXISTS 子句的情况下,如果表不包含具有该名称的列,则语句将返回错误。如果包含 IF EXISTS 子句,但列名称不存在,则不会返回任何错误,也不会执行任何操作。

此语句仅从表中移除列。引用该列的任何对象(例如视图或具体化视图)都必须单独更新或重新创建。

如需详细了解 BigQuery 中的架构修改,请参阅修改表架构

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.get 要更改的表。
bigquery.tables.update 要更改的表。

示例

删除列

以下示例会从名为 mytable 的现有表中删除以下列:

  • A”列
  • B”列
ALTER TABLE mydataset.mytable
  DROP COLUMN A,
  DROP COLUMN IF EXISTS B

如果名为 A 的列不存在,则语句将会失败。如果列 B 不存在,则由于 IF EXISTS 子句,该语句仍会成功。

ALTER TABLE SET DEFAULT COLLATE 语句

为表设置排序规则

语法

ALTER TABLE
  table_name
  SET DEFAULT COLLATE collate_specification

参数

  • table_name:要修改的表的名称。请参阅表路径语法。该表必须已存在且具有架构。

  • SET DEFAULT COLLATE collate_specification:在架构中创建新列时,如果列没有显式排序规则规范,则将继承 STRING 类型的这个排序规范。更新后的排序规则规范仅适用于之后添加的列。

    如果要更新现有排序规则规范,您必须更改包含该规范的列。如果要对现有表中的新列添加排序规则规范,可以在添加列时执行此操作。如果您直接在列上添加排序规范,则该列的排序规范优先于表的默认排序规则规范。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.get 要更改的表。
bigquery.tables.update 要更改的表。

示例

假设您在名为 mydataset 的架构中有一个现有表 mytable

CREATE TABLE mydataset.mytable
(
  number INT64,
  word STRING
) DEFAULT COLLATE 'und:ci'

创建 mytable 时,所有 STRING 列都会继承 COLLATE 'und:ci'。生成的表具有以下结构:

+--------------------------------+
| mydataset.mytable              |
|   number INT64                 |
|   word STRING COLLATE 'und:ci' |
+--------------------------------+

稍后,您决定更改表的排序规则规范。

ALTER TABLE mydataset.mytable
SET DEFAULT COLLATE ''

虽然您更新了排序规则规范,但现有列 word 会继续使用之前的排序规则规范。

+--------------------------------+
| mydataset.mytable              |
|   number INT64                 |
|   word STRING COLLATE 'und:ci' |
+--------------------------------+

不过,如果为表创建新列,则新列包含新的排序规则规范。在以下示例中,添加了一个名为 name 的列。由于新排序规则规范为空,因此使用默认排序规则规范。

ALTER TABLE mydataset.mytable
ADD COLUMN name STRING
+--------------------------------+
| mydataset.mytable              |
|   number INT64                 |
|   word STRING COLLATE 'und:ci' |
|   name STRING COLLATE          |
+--------------------------------+

ALTER COLUMN SET OPTIONS 语句

在 BigQuery 表中设置列选项,例如列说明。

语法

ALTER TABLE [IF EXISTS] table_name
ALTER COLUMN [IF EXISTS] column_name SET OPTIONS(column_set_options_list)

参数

  • (ALTER TABLE) IF EXISTS:如果不存在使用该名称的表,则语句无效。

  • table_name:要修改的表的名称。请参阅表路径语法

  • (ALTER COLUMN) IF EXISTS:如果指定的列不存在,则语句无效。

  • column_name:您要更改的顶级列的名称。不支持修改子字段,例如 STRUCT 中的嵌套列。

  • column_set_options_list:要在列上设置的选项列表。

详情

外部表不支持此语句。

column_set_options_list

请按以下格式指定列选项列表:

NAME=VALUE, ...

NAMEVALUE 必须是下述组合之一:

NAME VALUE 详情
description

STRING

示例:description="a table that expires in 2025"

VALUE 是一个只包含文字、查询参数和标量函数的常数表达式。

常量表达式不得包含以下内容:

  • 对表的引用
  • 子查询和 SQL 语句,如 SELECTCREATEUPDATE
  • 用户定义的函数、聚合函数或分析函数
  • 以下标量函数:
    • ARRAY_TO_STRING
    • REPLACE
    • REGEXP_REPLACE
    • RAND
    • FORMAT
    • LPAD
    • RPAD
    • REPEAT
    • SESSION_USER
    • GENERATE_ARRAY
    • GENERATE_DATE_ARRAY

设置 VALUE 会替换列的该选项的现有值(如果有)。将 VALUE 设置为 NULL 会清除列中该选项的值。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.get 要更改的表。
bigquery.tables.update 要更改的表。

示例

以下示例在名为 price 的列上设置新说明:

ALTER TABLE mydataset.mytable
ALTER COLUMN price
SET OPTIONS (
  description="Price per unit"
)

ALTER COLUMN DROP NOT NULL 语句

从 BigQuery 表的列中移除 NOT NULL 限制条件。

语法

ALTER TABLE [IF EXISTS] table_name
ALTER COLUMN [IF EXISTS] column DROP NOT NULL

参数

  • (ALTER TABLE) IF EXISTS:如果不存在使用该名称的表,则语句无效。

  • table_name:要修改的表的名称。请参阅表路径语法

  • (ALTER COLUMN) IF EXISTS:如果指定的列不存在,则语句无效。

  • column_name:您要更改的顶级列的名称。无法修改子字段。

详情

如果列没有 NOT NULL 限制条件,则查询会返回错误。

外部表不支持此语句。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.get 要更改的表。
bigquery.tables.update 要更改的表。

示例

以下示例从名为 mycolumn 的列中移除了 NOT NULL 限制条件:

ALTER TABLE mydataset.mytable
ALTER COLUMN mycolumn
DROP NOT NULL

ALTER COLUMN SET DATA TYPE 语句

将 BigQuery 表中某个列的数据类型更改为限制较少的数据类型。例如,NUMERIC 数据类型可以更改为 BIGNUMERIC 类型,反之不行。

语法

ALTER TABLE [IF EXISTS] table_name
ALTER COLUMN [IF EXISTS] column_name SET DATA TYPE column_schema

参数

  • (ALTER TABLE) IF EXISTS:如果不存在使用该名称的表,则语句无效。

  • table_name:要修改的表的名称。请参阅表路径语法

  • (ALTER COLUMN) IF EXISTS:如果指定的列不存在,则语句无效。

  • column_name:您要更改的顶级列的名称。无法修改子字段。

  • column_schema:您要将列转换为的架构。此架构使用与 CREATE TABLE 语句相同的语法。

详细信息

如需查看有效数据类型强制转换表,请对比 Google 标准 SQL 中的转换规则页面中的“源类型”列和“强制转换目标类型”列。

以下是有效数据类型强制转换的示例:

  • INT64 到 NUMERIC、BIGNUMERIC、FLOAT64
  • NUMERIC 到 BIGNUMERIC、FLOAT64

外部表不支持此语句。

在没有 IF EXISTS 子句的情况下,如果表不包含具有该名称的列,该语句将返回错误。如果包含 IF EXISTS 子句但列名不存在,则系统不会返回任何错误,也不会执行任何操作。

您还可以将数据类型从限制性更高的数据强制转换为限制性较低的参数化数据类型。例如,您可以增加字符串类型的长度上限或者增加数字类型的精度或范围。

以下是有效的参数化数据类型更改的示例:

  • NUMERIC(6,10) 到 NUMERIC(8,12)
  • NUMERIC 到 BIGNUMERIC(40, 20)
  • STRING(5) 到 STRING(7)

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.get 要更改的表。
bigquery.tables.update 要更改的表。

示例

更改列的数据类型

以下示例将列 c1 的数据类型从 INT64 更改为 NUMERIC

CREATE TABLE dataset.table(c1 INT64);

ALTER TABLE dataset.table ALTER COLUMN c1 SET DATA TYPE NUMERIC;

更改字段的数据类型

以下示例可更改 s1 列中某个字段的数据类型:

CREATE TABLE dataset.table(s1 STRUCT<a INT64, b STRING>);

ALTER TABLE dataset.table ALTER COLUMN s1
SET DATA TYPE STRUCT<a NUMERIC, b STRING>;

更改精度

以下示例更改了参数化数据类型列的精度:

CREATE TABLE dataset.table (pt NUMERIC(7,2));

ALTER TABLE dataset.table
ALTER COLUMN pt
SET DATA TYPE NUMERIC(8,2);

ALTER COLUMN SET DEFAULT 语句

设置列的默认值

语法

ALTER TABLE [IF EXISTS] table_name ALTER COLUMN [IF EXISTS] column_name
SET DEFAULT default_expression;

参数

详情

为列设置的默认值只会影响后续插入到表中的数据;而不会更改任何现有表数据。

默认值的类型必须与列的类型相匹配。STRUCT 类型只能为整个 STRUCT 字段设置默认值。不能只为部分字段设置默认值。您无法将数组的默认值设置为 NULL,或将数组中的元素设置为 NULL

如果默认值为函数,函数会在值写入表时求值,而不是在表创建时。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.get 要更改的表。
bigquery.tables.update 要更改的表。

示例

以下示例将列 mycolumn 的默认值设置为当前时间:

ALTER TABLE mydataset.mytable
ALTER COLUMN mycolumn
SET DEFAULT CURRENT_TIME();

ALTER COLUMN DROP DEFAULT 语句

移除分配给列的默认值。这与将默认值设置为 NULL 相同。

语法

ALTER TABLE [IF EXISTS] table_name ALTER COLUMN [IF EXISTS] column_name
DROP DEFAULT;

参数

  • (ALTER TABLE) IF EXISTS:如果指定的表不存在,则语句无效。

  • table_name:要修改的表的名称。请参阅表路径语法

  • (ALTER COLUMN) IF EXISTS:如果指定的列不存在,则语句无效。

  • column_name:要从中移除默认值的顶级列的名称。如果从未设置默认值的列中删除默认值,则会返回错误。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.get 要更改的表。
bigquery.tables.update 要更改的表。

示例

以下示例会从 mycolumn 列中移除默认值:

ALTER TABLE mydataset.mytable
ALTER COLUMN mycolumn
DROP DEFAULT;

ALTER VIEW SET OPTIONS 语句

设置视图上的选项。

语法

ALTER VIEW [IF EXISTS] view_name
SET OPTIONS(view_set_options_list)

参数

  • IF EXISTS:如果不存在使用该名称的视图,则语句无效。

  • view_name:要修改的视图的名称。请参阅表路径语法

  • view_set_options_list:要设置的选项列表。

view_set_options_list

通过选项列表,您可以设置视图选项,例如标签和到期时间。可使用逗号分隔列表包括多个选项。

请按以下格式指定视图选项列表:

NAME=VALUE, ...

NAMEVALUE 必须是下述组合之一:

NAME VALUE 详情
expiration_timestamp TIMESTAMP

示例:expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC"

此属性等效于 expirationTime 表资源属性。

friendly_name

STRING

示例:friendly_name="my_view"

此属性等效于 friendlyName 表资源属性。

description

STRING

示例:description="a view that expires in 2025"

此属性等效于 description 表资源属性。

labels

ARRAY<STRUCT<STRING, STRING>>

示例:labels=[("org_unit", "development")]

此属性等效于 labels 表资源属性。

VALUE 是一个只包含文字、查询参数和标量函数的常数表达式。

常量表达式不得包含以下内容:

  • 对表的引用
  • 子查询和 SQL 语句,如 SELECTCREATEUPDATE
  • 用户定义的函数、聚合函数或分析函数
  • 以下标量函数:
    • ARRAY_TO_STRING
    • REPLACE
    • REGEXP_REPLACE
    • RAND
    • FORMAT
    • LPAD
    • RPAD
    • REPEAT
    • SESSION_USER
    • GENERATE_ARRAY
    • GENERATE_DATE_ARRAY

设置该值会替换视图上该选项的现有值(如果有)。将该值设置为 NULL 会清除视图上该选项的值。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.get 要更改的视图。
bigquery.tables.update 要更改的视图。

示例

设置视图上的到期时间戳和说明

以下示例将视图上的到期时间戳设置为执行 ALTER VIEW 语句后七天,还设置了说明:

ALTER VIEW mydataset.myview
SET OPTIONS (
  expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 7 DAY),
  description="View that expires seven days from now"
)

ALTER MATERIALIZED VIEW SET OPTIONS 语句

设置具体化视图上的选项。

语法

ALTER MATERIALIZED VIEW [IF EXISTS] materialized_view_name
SET OPTIONS(materialized_view_set_options_list)

参数

materialized_view_set_options_list

通过选项列表,您可以设置具体化视图选项,例如是否启用刷新、刷新间隔、标签和到期时间。可使用逗号分隔列表包括多个选项。

请按以下格式指定具体化视图选项列表:

NAME=VALUE, ...

NAMEVALUE 必须是下述组合之一:

NAME VALUE 详情
enable_refresh BOOLEAN

示例:enable_refresh=false

refresh_interval_minutes FLOAT64

示例:refresh_interval_minutes=20

expiration_timestamp TIMESTAMP

示例:expiration_timestamp=TIMESTAMP "2025-01-01 00:00:00 UTC"

此属性等效于 expirationTime 表资源属性。

friendly_name

STRING

示例:friendly_name="my_mv"

此属性等效于 friendlyName 表资源属性。

description

STRING

示例:description="a materialized view that expires in 2025"

此属性等效于 description 表资源属性。

labels

ARRAY<STRUCT<STRING, STRING>>

示例:labels=[("org_unit", "development")]

此属性等效于 labels 表资源属性。

设置该值会针对具体化视图替换该选项的现有值(如果有)。将该值设置为 NULL 会针对具体化视图清除该选项的值。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.tables.get 要更改的具体化视图。
bigquery.tables.update 要更改的具体化视图。

示例

在具体化视图上设置启用刷新状态和刷新间隔

以下示例在具体化视图上启用了刷新功能并将刷新间隔设置为 20 分钟:

ALTER MATERIALIZED VIEW mydataset.my_mv
SET OPTIONS (
  enable_refresh=true,
  refresh_interval_minutes=20
)

ALTER ORGANIZATION SET OPTIONS 语句

设置组织的选项。

语法

ALTER ORGANIZATION
SET OPTIONS (
  organization_set_options_list);

参数

organization_set_options_list

选项列表指定组织的选项。请按以下格式指定选项:NAME=VALUE, ...

支持的选项如下:

NAME VALUE 详情
default_kms_key_name STRING

示例:kms_key_name="projects/project_id/locations/location/keyRings/keyring/cryptoKeys/key"

此属性等效于 encryptionConfiguration.kmsKeyName 表资源属性。

请查看有关使用 Cloud KMS 密钥保护数据的详细信息。

default_time_zone STRING 示例:`region-us.default_time_zone` = "America/Los_Angeles"。将 us 区域中的默认时区设置为 America/Los_Angeles
default_query_job_timeout_ms INT64 示例:`region-us.default_query_job_timeout_ms` = 1800000。将 us 区域中组织的默认查询作业超时时间设置为 30 分钟。

设置该值会替换组织的该选项的现有值(如果有)。将该值设置为 NULL 会清除组织的该选项的值。

所需权限

ALTER ORGANIZATION SET OPTIONS 语句需要以下 IAM 权限

权限 资源
bigquery.config.update 要更改的组织。

示例

以下示例将美国区域的默认时区设置为美国/芝加哥,并将默认查询作业超时设置为一小时。

ALTER ORGANIZATION
SET OPTIONS (
  `region-us.default_time_zone` = "America/Chicago",
  `region-us.default_job_query_timeout_ms` = 3600000
);

ALTER PROJECT SET OPTIONS 语句

设置项目的选项。

语法

ALTER PROJECT project_id
SET OPTIONS (project_set_options_list);

参数

  • project_id:要更改的项目的名称。默认为运行此 DDL 查询的项目。
  • project_set_options_list:要设置的选项列表。

project_set_options_list

选项列表指定项目的选项。请按以下格式指定选项:NAME=VALUE, ...

支持的选项如下:

NAME VALUE 详情
default_kms_key_name STRING

示例:kms_key_name="projects/project_id/locations/location/keyRings/keyring/cryptoKeys/key"

此属性等效于 encryptionConfiguration.kmsKeyName 表资源属性。

请查看有关使用 Cloud KMS 密钥保护数据的详细信息。

default_time_zone STRING 示例:`region-us.default_time_zone` = "America/Los_Angeles"。将 us 区域中的默认时区设置为 America/Los_Angeles
default_query_job_timeout_ms INT64 示例:`region-us.default_query_job_timeout_ms` = 1800000。将 us 区域中项目的默认查询作业超时时间设置为 30 分钟。

设置该值会替换项目的该选项的现有值(如果有)。将该值设置为 NULL 会清除项目的该选项的值。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.config.update 要更改的项目。

示例

以下示例将 us 区域中的项目的默认时区设置为 America/New_York,并将默认查询作业超时设置为 30 分钟。

ALTER PROJECT project_id
SET OPTIONS (
  `region-us.default_time_zone` = "America/New_York",
  `region-us.default_job_query_timeout_ms` = 1800000
);

ALTER BI_CAPACITY SET OPTIONS 语句

设置 BigQuery BI Engine 容量的选项。

语法

ALTER BI_CAPACITY `project_id.location_id.default`
SET OPTIONS(bi_capacity_options_list)

参数

  • project_id:可从 BI Engine 加速中获益的项目的可选项目 ID。如果省略,则使用查询项目 ID。

  • location_id:需要缓存数据的位置,前缀为 region-。示例:region-usregion-us-central1

  • bi_capacity_options_list:要设置的选项列表。

bi_capacity_options_list

此选项列表指定一组 BigQuery BI Engine 容量选项。

请按以下格式指定列选项列表:

NAME=VALUE, ...

支持的选项如下:

NAME VALUE 详情
size_gb INT64 指定预留的大小(以 GB 为单位)。
preferred_tables <ARRAY<STRING>> 应该应用加速的表列表。格式:project.dataset.table or dataset.table。如果省略项目,则使用查询项目。

设置 VALUE 会替换 BI Engine 容量的该选项的现有值(如果有)。将 VALUE 设置为 NULL 会清除该选项的值。

所需权限

此语句需要以下 IAM 权限

权限 资源
bigquery.bireservations.update BI Engine 预留

示例

在没有首选表的情况下分配 BI Engine 容量

ALTER BI_CAPACITY `my-project.region-us.default`
SET OPTIONS(
  size_gb = 250
)

取消分配 BI 容量

ALTER BI_CAPACITY `my-project.region-us.default`
SET OPTIONS(
  size_gb = 0
)

从预留中移除一组首选表

ALTER BI_CAPACITY `my-project.region-us.default`
SET OPTIONS(
  preferred_tables = NULL
)

使用首选表列表分配 BI 容量

ALTER BI_CAPACITY `my-project.region-us.default`
SET OPTIONS(
  size_gb = 250,
  preferred_tables = ["data_project1.dataset1.table1",
                      "data_project2.dataset2.table2"]
)

覆盖首选表列表而不更改大小

ALTER BI_CAPACITY `region-us.default`
SET OPTIONS(
  preferred_tables = ["dataset1.table1",
                      "data_project2.dataset2.table2"]
)

DROP SCHEMA 语句

删除数据集。

语法

DROP SCHEMA [IF EXISTS]
[project_name.]dataset_name
[ CASCADE | RESTRICT ]

参数

  • IF EXISTS:如果不存在具有该名称的数据集,则语句无效。

  • project_name:包含数据集的项目的名称默认为运行此 DDL 语句的项目。

  • dataset_name:要删除的数据集的名称。

  • CASCADE:删除数据集及数据集中的所有资源,例如表、视图和函数。您必须拥有删除资源的权限,否则语句将返回错误。如需查看 BigQuery 权限的列表,请参阅预定义角色和权限

  • RESTRICT:仅当数据集为空时才能删除。否则会返回错误。如果您未指定 CASCADERESTRICT,则默认行为是 RESTRICT

详情

如果数据集存在,则除非您在查询设置中指定了位置,否则语句会在数据集的位置运行。如需了解详情,请参阅指定位置

所需权限

此语句需要以下 IAM 权限

权限 资源