SQL 言語の切り替え

このトピックでは、BigQuery データを照会するときのクエリ言語を設定する方法について説明します。標準 SQL またはレガシー SQL のどちらかの言語を使用できます。

BigQuery ウェブ UI を使用してデータのクエリ操作を試してみる方法については、ウェブ UI を使用したクイックスタートをご覧ください。

bq コマンドライン ツールを使用してデータのクエリ操作を試してみる方法については、bq コマンドライン ツールを使用したクイックスタートをご覧ください。

デフォルト言語からの変更

デフォルトのクエリ言語は、データのクエリに使用するインターフェースによって決まります。

  • GCP Console とクライアント ライブラリでは、標準 SQL がデフォルトです。
  • 従来の BigQuery ウェブ UI、bq コマンドライン ツール、REST API では、レガシー SQL がデフォルトです。

別の言語に切り替えるには、次の手順を行います。

Console

GCP Console のデフォルト言語は標準 SQL です。言語をレガシー SQL に変更するには、次の手順に従います。

  1. 必要に応じて、[クエリを新規作成] をクリックしてクエリエディタ ウィンドウを開きます。

  2. クエリエディタの下で [展開] > [クエリの設定] をクリックします。

  3. [詳細オプション] をクリックします。

  4. [追加の設定] セクションの [SQL 言語] で [レガシー] をクリックします。これで、このクエリに対してレガシー SQL オプションが設定されます。[クエリを新規作成] をクリックして新しいクエリを作成するときは、レガシー SQL オプションを再度選択する必要があります。

従来の UI

従来の BigQuery ウェブ UI のデフォルト言語はレガシー SQL です。言語を標準 SQL に変更するには、次の手順に従います。

  1. 従来の BigQuery ウェブ UI で、[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 の使用

クエリジョブでレガシー SQL 構文を使用するには、useLegacySql パラメータを true に設定します。

// 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 の使用

クエリジョブでレガシー SQL 構文を使用するには、useLegacySql パラメータを true に設定します。

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 の使用

クエリジョブでレガシー SQL 構文を使用するには、useLegacySql パラメータを true に設定します。

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 の使用

クエリジョブでレガシー SQL 構文を使用するには、use_legacy_sql パラメータを True に設定します。

# 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

UI でのクエリ接頭辞の使用

GCP Console または従来のウェブ UI では、SQL 言語接頭辞をクエリに含めることによって SQL 言語を設定することもできます。

次の接頭辞を使用して SQL 言語を設定できます。

接頭辞 説明
#legacySQL レガシー SQL を使用してクエリを実行します。
#standardSQL 標準 SQL を使用してクエリを実行します。

GCP Console では、クエリ接頭辞を使用すると [クエリの設定] の [SQL 言語] オプションが無効になります。

従来のウェブ UI では、使用するクエリ接頭辞が [SQL dialect] オプションと一致している必要があります。たとえば、従来のウェブ UI で [Use Legacy SQL] オプションをオフにした場合、#legacySQL 接頭辞をクエリで使用することはできません。

たとえば、次のクエリをコピーして GCP Console に貼り付けた場合、このクエリはレガシー 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 をコマンドライン ツールのデフォルトとして設定する

コマンドライン ツールの構成ファイル .bigqueryrc を編集することによって、標準 SQL をコマンドライン ツールと対話型シェルのデフォルトの構文として設定できます。

.bigqueryrc の詳細については、コマンド固有フラグのデフォルト値の設定をご覧ください。

.bigqueryrc--use_legacy_sql=false を設定するには:

  1. テキスト エディタで .bigqueryrc を開きます。.bigqueryrc はデフォルトではユーザー ディレクトリにあります(例: $HOME/.bigqueryrc)。

  2. このファイルに次のテキストを追加します。この例では、標準 SQL を、クエリと mk コマンド(ビューの作成時に使用)のデフォルトの構文として設定しています。すでに query または mk コマンドフラグのデフォルト値を構成している場合は、[query] または [mk] を再度追加する必要はありません。

    [query]
    --use_legacy_sql=false
    
    [mk]
    --use_legacy_sql=false
    
  3. ファイルを保存して閉じます。

  4. 対話型シェルを使用している場合は、変更を適用するために、対話型シェルを終了して再起動する必要があります。

使用可能なコマンドライン フラグについては、bq コマンドライン ツール リファレンスをご覧ください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。