切换 SQL 语言

本主题介绍如何在查询 BigQuery 数据时设置查询语言。您可以使用标准 SQL 或旧版 SQL 语言。

如需了解如何使用 BigQuery 网页界面开始查询数据,请参阅使用网页界面快速入门

如需了解如何使用 bq 命令行工具开始查询数据,请参阅使用 bq 命令行工具快速入门

从默认语言更改

用于查询数据的界面决定了默认的查询语言:

  • 在 GCP Console 和客户端库中,标准 SQL 是默认的查询语言。
  • 在经典版 BigQuery 网页界面、bq 命令行工具和 REST API 中,旧版 SQL 是默认的查询语言。

如需切换到其他语言,请执行以下操作:

控制台

GCP Console 的默认语言是标准 SQL。如需将语言更改为旧版 SQL,请执行以下操作:

  1. 如有必要,请点击编写新查询以打开查询编辑器窗口。

  2. 在查询编辑器下方,点击更多 > 查询设置

  3. 点击高级选项

  4. 其他设置部分中,对于 SQL 方言,点击旧版。这将为此查询设置旧版 SQL 选项。点击编写新查询以创建新查询时,您必须再次选择旧版 SQL 选项。

经典版界面

经典版 BigQuery 网页界面的默认语言是旧版 SQL。如需将语言更改为标准 SQL,请执行以下操作:

  1. 在经典版网页界面中,点击 Compose Query

  2. 点击 Show Options

  3. 对于 SQL Dialect,取消选中 Use Legacy SQL 框。这将在您打开查询编辑器时设置标准 SQL 选项。如果您关闭查询编辑器并重新打开它,则必须再次取消选择旧版 SQL 选项。

CLI

bq 命令行工具中的默认查询语言是旧版 SQL。如需切换到标准 SQL 语言,请在命令行语句中添加 --use_legacy_sql=false--nouse_legacy_sql 标志。

例如:

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

C#

试用此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 C# 设置说明进行操作。如需了解详情,请参阅 BigQuery C# API 参考文档

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


using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryQuery
{
    public void Query(
        string projectId = "your-project-id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        string query = @"
            SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013`
            WHERE state = 'TX'
            LIMIT 100";
        BigQueryJob job = client.CreateQueryJob(
            sql: query,
            parameters: null,
            options: new QueryOptions { UseQueryCache = false });
        // Wait for the job to complete.
        job.PollUntilCompleted();
        // Display the results
        foreach (BigQueryRow row in client.GetQueryResults(job.Reference))
        {
            Console.WriteLine($"{row["name"]}");
        }
    }
}

使用旧版 SQL

如需在运行查询时使用旧版 SQL,请将“UseLegacySql”参数设置为“true”。


using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryQueryLegacy
{
    public void QueryLegacy(
        string projectId = "your-project-id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        string query = @"
            SELECT name FROM [bigquery-public-data:usa_names.usa_1910_2013]
            WHERE state = 'TX'
            LIMIT 100";
        BigQueryJob job = client.CreateQueryJob(
            sql: query,
            parameters: null,
            options: new QueryOptions { UseLegacySql = true });
        // Wait for the job to complete.
        job.PollUntilCompleted();
        // Display the results
        foreach (BigQueryRow row in client.GetQueryResults(job.Reference))
        {
            Console.WriteLine($"{row["name"]}");
        }
    }
}

Go

试用此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Go 设置说明进行操作。如需了解详情,请参阅 BigQuery Go API 参考文档

默认情况下,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 快速入门:使用客户端库》中的 Java 设置说明进行操作。如需了解详情,请参阅 BigQuery Java API 参考文档

默认情况下,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 快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 BigQuery Node.js API 参考文档

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

// Import the Google Cloud client library using default credentials
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();
async function query() {
  // Queries the U.S. given names dataset for the state of Texas.

  const query = `SELECT name
    FROM \`bigquery-public-data.usa_names.usa_1910_2013\`
    WHERE state = 'TX'
    LIMIT 100`;

  // For all options, see https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query
  const options = {
    query: query,
    // Location must match that of the dataset(s) referenced in the query.
    location: 'US',
  };

  // Run the query as a job
  const [job] = await bigquery.createQueryJob(options);
  console.log(`Job ${job.id} started.`);

  // Wait for the query to finish
  const [rows] = await job.getQueryResults();

  // Print the results
  console.log('Rows:');
  rows.forEach(row => console.log(row));
}

使用旧版 SQL

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

PHP

试用此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 BigQuery PHP API 参考文档

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

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

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $query = 'SELECT id, view_count FROM `bigquery-public-data.stackoverflow.posts_questions`';

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$jobConfig = $bigQuery->query($query);
$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);

使用旧版 SQL

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

Python

试用此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

默认情况下,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 快速入门:使用客户端库》中的 Ruby 设置说明进行操作。如需了解详情,请参阅 BigQuery Ruby API 参考文档

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

require "google/cloud/bigquery"

def query
  bigquery = Google::Cloud::Bigquery.new
  sql = "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.
  results = bigquery.query sql do |config|
    config.location = "US"
  end

  results.each do |row|
    puts row.inspect
  end
end

在界面中使用查询前缀

您还可以通过 GCP Console 或经典版网页界面在查询中包含 SQL 语言前缀来设置 SQL 语言。

通过以下前缀,您可以设置 SQL 语言:

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

在 GCP Console 中,使用查询前缀时,查询设置中的 SQL 方言选项处于停用状态。

在经典版网页界面中,使用查询前缀时,前缀必须与 SQL dialect 选项相匹配。例如,在经典版网页界面中,如果您取消选中 Use Legacy SQL 选项,则无法在查询中使用 #legacySQL 前缀。

例如,如果您将以下查询复制并粘贴到 GCP Console 中,则 BigQuery 会使用旧版 SQL 运行查询并忽略默认设置。GCP Console 的默认设置是标准 SQL。

#legacySQL
SELECT
  weight_pounds, state, year, gestation_weeks
FROM
  [bigquery-public-data:samples.natality]
ORDER BY weight_pounds DESC
LIMIT 10;

查询前缀 #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 命令行工具参考

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

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