启用标准 SQL

本主题介绍如何在查询 BigQuery 数据时启用标准 SQL。

要了解如何开始使用 BigQuery 网页界面,请参阅快速入门:使用网页界面

要了解如何开始使用 bq 命令行工具,请参阅快速入门:使用 bq 命令行工具

设置 useLegacySql 选项

要为查询启用标准 SQL,请执行以下操作:

网页界面

  1. 打开 BigQuery 网页界面
  2. 点击 COMPOSE QUERY
  3. 点击 Show Options
  4. 取消选中 Use Legacy SQL 复选框。

命令行

--use_legacy_sql=false 标记添加到命令行语句中。

bq query --use_legacy_sql=false 'SELECT word FROM `bigquery-public-data.samples.shakespeare`'

C#

要详细了解如何安装和创建 BigQuery 客户端,请参阅 BigQuery 客户端库

运行查询时,默认使用标准 SQL。

public BigQueryResults AsyncQuery(string projectId, string datasetId, string tableId,
    string query, BigQueryClient client)
{
    var table = client.GetTable(projectId, datasetId, tableId);
    BigQueryJob job = client.CreateQueryJob(query,
        parameters: null,
        options: new QueryOptions { UseQueryCache = false });

    // Wait for the job to complete.
    job.PollUntilCompleted();

    // Then we can fetch the results, either via the job or by accessing
    // the destination table.
    return client.GetQueryResults(job.Reference.JobId);
}

使用旧版 SQL

要在运行查询时使用旧版 SQL,请将 UseLegacySql 参数设置为 true

public BigQueryResults LegacySqlAsyncQuery(string projectId, string datasetId,
    string tableId, string query, BigQueryClient client)
{
    var table = client.GetTable(projectId, datasetId, tableId);
    BigQueryJob job = client.CreateQueryJob(query,
        parameters: null,
        options: new QueryOptions { UseLegacySql = true });

    // Wait for the job to complete.
    job.PollUntilCompleted();

    // Then we can fetch the results, either via the job or by accessing
    // the destination table.
    return client.GetQueryResults(job.Reference.JobId);
}

Go

要详细了解如何安装和创建 BigQuery 客户端,请参阅 BigQuery 客户端库

默认情况下,Go 客户端库使用标准 SQL。

q := client.Query(
	"SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` " +
		"WHERE state = \"TX\" " +
		"LIMIT 100")
// Location must match that of the dataset(s) referenced in the query.
q.Location = "US"
job, err := q.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}
if err := status.Err(); err != nil {
	return err
}
it, err := job.Read(ctx)
for {
	var row []bigquery.Value
	err := it.Next(&row)
	if err == iterator.Done {
		break
	}
	if err != nil {
		return err
	}
	fmt.Println(row)
}

使用旧版 SQL

要将查询切换回旧版,请使用查询配置中的 UseLegacySQL 属性。

q := client.Query(sqlString)
q.UseLegacySQL = true

job, err := q.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}
if err := status.Err(); err != nil {
	return err
}
it, err := job.Read(ctx)
for {
	var row []bigquery.Value
	err := it.Next(&row)
	if err == iterator.Done {
		break
	}
	if err != nil {
		return err
	}
	fmt.Println(row)
}

Java

要详细了解如何安装和创建 BigQuery 客户端,请参阅 BigQuery 客户端库

默认情况下,Java 客户端库使用标准 SQL。

// BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
String query = "SELECT corpus FROM `bigquery-public-data.samples.shakespeare` GROUP BY corpus;";
QueryJobConfiguration queryConfig = QueryJobConfiguration.newBuilder(query).build();

// Print the results.
for (FieldValueList row : bigquery.query(queryConfig).iterateAll()) {
  for (FieldValue val : row) {
    System.out.printf("%s,", val.toString());
  }
  System.out.printf("\n");
}

使用旧版 SQL

useLegacySql 参数设置为 true 即可在查询作业中使用旧版 SQL 语法。

// BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
String query = "SELECT corpus FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus;";
QueryJobConfiguration queryConfig =
    // To use legacy SQL syntax, set useLegacySql to true.
    QueryJobConfiguration.newBuilder(query).setUseLegacySql(true).build();

// Print the results.
for (FieldValueList row : bigquery.query(queryConfig).iterateAll()) {
  for (FieldValue val : row) {
    System.out.printf("%s,", val.toString());
  }
  System.out.printf("\n");
}

Node.js

要详细了解如何安装和创建 BigQuery 客户端,请参阅 BigQuery 客户端库

默认情况下,Node.js 客户端库使用标准 SQL。

// Imports the Google Cloud client library
const BigQuery = require('@google-cloud/bigquery');

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const projectId = "your-project-id";
// const sqlQuery = "SELECT * FROM publicdata.samples.natality LIMIT 5;";

// Creates a client
const bigquery = new BigQuery({
  projectId: projectId,
});

// Query options list: https://cloud.google.com/bigquery/docs/reference/v2/jobs/query
const options = {
  query: sqlQuery,
  useLegacySql: false, // Use standard SQL syntax for queries.
};

let job;

// Runs the query as a job
bigquery
  .createQueryJob(options)
  .then(results => {
    job = results[0];
    console.log(`Job ${job.id} started.`);
    return job.promise();
  })
  .then(() => {
    // Get the job's status
    return job.getMetadata();
  })
  .then(metadata => {
    // Check the job's status for errors
    const errors = metadata[0].status.errors;
    if (errors && errors.length > 0) {
      throw errors;
    }
  })
  .then(() => {
    console.log(`Job ${job.id} completed.`);
    return job.getQueryResults();
  })
  .then(results => {
    const rows = results[0];
    console.log('Rows:');
    rows.forEach(row => console.log(row));
  })
  .catch(err => {
    console.error('ERROR:', err);
  });

使用旧版 SQL

useLegacySql 参数设置为 true 即可在查询作业中使用旧版 SQL 语法。

PHP

要详细了解如何安装和创建 BigQuery 客户端,请参阅 BigQuery 客户端库

默认情况下,PHP 客户端库使用标准 SQL。

使用旧版 SQL

useLegacySql 参数设置为 true 即可在查询作业中使用旧版 SQL 语法。

use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

/**
 * Run a BigQuery query as a job.
 * Example:
 * ```
 * $query = 'SELECT TOP(corpus, 10) as title, COUNT(*) as unique_words ' .
 *          'FROM `bigquery-public-data.samples.shakespeare`';
 * run_query_as_job($projectId, $query, false);
 * ```.
 *
 * @param string $projectId The Google project ID.
 * @param string $query     A SQL query to run. *
 * @param bool $useLegacySql Specifies whether to use BigQuery's legacy SQL
 *        syntax or standard SQL syntax for this query.
 */
function run_query_as_job($projectId, $query, $useLegacySql)
{
    $bigQuery = new BigQueryClient([
        'projectId' => $projectId,
    ]);
    $jobConfig = $bigQuery->query($query)->useLegacySql($useLegacySql);
    $job = $bigQuery->startQuery($jobConfig);

    $backoff = new ExponentialBackoff(10);
    $backoff->execute(function () use ($job) {
        print('Waiting for job to complete' . PHP_EOL);
        $job->reload();
        if (!$job->isComplete()) {
            throw new Exception('Job has not yet completed', 500);
        }
    });
    $queryResults = $job->queryResults();

    $i = 0;
    foreach ($queryResults as $row) {
        printf('--- Row %s ---' . PHP_EOL, ++$i);
        foreach ($row as $column => $value) {
            printf('%s: %s' . PHP_EOL, $column, json_encode($value));
        }
    }
    printf('Found %s row(s)' . PHP_EOL, $i);
}

Python

要详细了解如何安装和创建 BigQuery 客户端,请参阅 BigQuery 客户端库

默认情况下,Python 客户端库使用标准 SQL。

# from google.cloud import bigquery
# client = bigquery.Client()

query = (
    'SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` '
    'WHERE state = "TX" '
    'LIMIT 100')
query_job = client.query(
    query,
    # Location must match that of the dataset(s) referenced in the query.
    location='US')  # API request - starts the query

for row in query_job:  # API request - fetches results
    # Row values can be accessed by field name or index
    assert row[0] == row.name == row['name']
    print(row)

使用旧版 SQL

use_legacy_sql 参数设置为 True 即可在查询作业中使用旧版 SQL 语法。

# from google.cloud import bigquery
# client = bigquery.Client()

query = (
    'SELECT name FROM [bigquery-public-data:usa_names.usa_1910_2013] '
    'WHERE state = "TX" '
    'LIMIT 100')

# Set use_legacy_sql to True to use legacy SQL syntax.
job_config = bigquery.QueryJobConfig()
job_config.use_legacy_sql = True

query_job = client.query(
    query,
    # Location must match that of the dataset(s) referenced in the query.
    location='US',
    job_config=job_config)  # API request - starts the query

# Print the results.
for row in query_job:  # API request - fetches results
    print(row)

Ruby

要详细了解如何安装和创建 BigQuery 客户端,请参阅 BigQuery 客户端库

默认情况下,Ruby 客户端库使用标准 SQL。

# project_id   = "your google cloud project id"
# query_string = "query string to execute (using bigquery query syntax)"

require "google/cloud/bigquery"

bigquery = Google::Cloud::Bigquery.new project: project_id

puts "Running query"
query_job = bigquery.query_job query_string

puts "Waiting for query to complete"
query_job.wait_until_done!

puts "Query results:"
query_job.query_results.each do |row|
  puts row.inspect
end

设置查询前缀

在网页界面、REST API 中或使用客户端库时,您可以为查询添加前缀,以此设置 SQL 变体(旧版 SQL 或标准 SQL)。

前缀 说明
#legacySQL 使用旧版 SQL 运行查询
#standardSQL 使用标准 SQL 运行查询

例如,如果您复制以下查询并将其粘贴到网页界面中,BigQuery 会使用标准 SQL 运行查询并忽略默认的使用旧版 SQL 选项设置。

#standardSQL
SELECT
  weight_pounds, state, year, gestation_weeks
FROM
  `bigquery-public-data.samples.natality`
ORDER BY weight_pounds DESC
LIMIT 10;

如果您明确设置 useLegacySql 选项,则必须与前缀保持一致。例如,在网页界面中,如果您取消选中使用旧版 SQL 选项,则无法使用 #legacySQL 前缀。

查询前缀 #legacySQL#standardSQL

  • 不区分大小写
  • 必须位于查询之前
  • 必须以换行符与查询分隔

某些第三方工具可能不支持这类前缀,例如它们会先修改查询文本再发送到 BigQuery。

将标准 SQL 设置为命令行工具的默认语法

要将标准 SQL 设置为命令行工具和交互式 shell 的默认语法,您可以修改命令行工具的配置文件 - .bigqueryrc

要详细了解 .bigqueryrc,请参阅设置特定于命令的标记的默认值

要在 .bigqueryrc 中设置 --use_legacy_sql=false,请执行以下操作:

  1. 在文本编辑器中打开 .bigqueryrc。默认情况下,.bigqueryrc 应位于您的用户目录中,例如 $HOME/.bigqueryrc

  2. 将以下文本添加到该文件中。本示例将标准 SQL 设置为查询和 mk 命令(用于创建视图)的默认语法。如果您已为 querymk 命令标记配置默认值,则无需重新添加 [query][mk]

    [query]
    --use_legacy_sql=false
    
    [mk]
    --use_legacy_sql=false
    
  3. 保存并关闭文件。

  4. 如果您使用交互式 shell,则必须退出并重启,才能应用更改。

要详细了解可用的命令行标记,请参阅 bq 命令行工具参考

后续步骤

  • 要详细了解标准 SQL,请参阅 SQL 参考
此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面