BigQuery での SQL の概要

このドキュメントでは、BigQuery でサポートされているステートメントと SQL 言語の概要について説明します。

GoogleSQL は ANSI 準拠の構造化クエリ言語(SQL)であり、サポートされている次のタイプのステートメントが含まれています。

BigQuery SQL 言語

BigQuery は GoogleSQL 言語をサポートしていますが、レガシー SQL 言語も使用できます。BigQuery を初めて使用する場合は、最も幅広い機能をサポートしている GoogleSQL を使用することをおすすめします。たとえば、DDL ステートメントや DML ステートメントなどの機能は、GoogleSQL を使用する場合にのみサポートされます。下位互換性を持たせるため、レガシー SQL が維持されています。レガシー SQL を使用している場合は、移行することをおすすめします。

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

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

コンソール

Google Cloud コンソールのデフォルトの言語は GoogleSQL です。言語をレガシー SQL に変更するには、次の操作を行います。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] に移動

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

  3. [詳細オプション] セクションの [SQL 言語] で、[レガシー]、[保存] の順にクリックします。これで、このクエリに対してレガシー SQL オプションが設定されます。[add_box SQL クエリ] をクリックして新しいクエリを作成する場合は、レガシー SQL オプションを再度選択する必要があります。

SQL

デフォルトの SQL 言語は GoogleSQL です。クエリの中に接頭辞の #standardSQL または #legacySQL を含めることで、SQL 言語の種類を設定できます。これらのクエリ接頭辞では大文字と小文字が区別されません。クエリの前につける必要があり、クエリとは改行文字で区切る必要があります。次の例では、言語をレガシー SQL に設定し、出生率データセットにクエリを実行します。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

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

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

bq

bq コマンドライン ツールのデフォルトのクエリ言語は、レガシー SQL です。GoogleSQL 言語に切り替えるには、--use_legacy_sql=false フラグまたは --nouse_legacy_sql フラグをコマンドライン ステートメントに追加します。

GoogleSQL 言語に切り替える

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

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

GoogleSQL をデフォルトの言語として設定する

コマンドライン ツールの構成ファイル .bigqueryrc を編集することで、GoogleSQL をコマンドライン ツールと対話型シェルのデフォルトの言語に設定できます。

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

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

  1. テキスト エディタで .bigqueryrc を開きます。デフォルトの場合、.bigqueryrc はユーザー ディレクトリにあります(例: $HOME/.bigqueryrc)。
  2. このファイルに次のテキストを追加します。この例では、GoogleSQL が、クエリと(ビューを作成するときに使用される)mk コマンドのデフォルト構文として設定されます。query コマンドフラグまたは mk コマンドフラグに対してすでにデフォルト値を構成している場合、[query] または [mk] をもう一度追加し直す必要はありません。

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

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

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

C#

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある C# の設定手順を完了してください。詳細については、BigQuery C# API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

C# ライブラリではデフォルトで GoogleSQL が使用されます。

レガシー 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 = job.PollUntilCompleted().ThrowOnAnyError();
        // Display the results
        foreach (BigQueryRow row in client.GetQueryResults(job.Reference))
        {
            Console.WriteLine($"{row["name"]}");
        }
    }
}

Go

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

Go クライアント ライブラリではデフォルトで GoogleSQL が使用されます。

レガシー SQL 言語に切り替える

クエリジョブでレガシー SQL 構文を使用するには、クエリ構成内の UseLegacySQL プロパティを true に設定します。

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
	"google.golang.org/api/iterator"
)

// queryLegacy demonstrates running a query using Legacy SQL.
func queryLegacy(w io.Writer, projectID, sqlString string) error {
	// projectID := "my-project-id"
	// sqlString = "SELECT 3 as somenum"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %w", err)
	}
	defer client.Close()

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

	// Run the query and process the returned row iterator.
	it, err := q.Read(ctx)
	if err != nil {
		return fmt.Errorf("query.Read(): %w", err)
	}
	for {
		var row []bigquery.Value
		err := it.Next(&row)
		if err == iterator.Done {
			break
		}
		if err != nil {
			return err
		}
		fmt.Fprintln(w, row)
	}
	return nil
}

Java

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

Java クライアント ライブラリではデフォルトで GoogleSQL が使用されます。

レガシー SQL 言語に切り替える

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

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableResult;

public class RunLegacyQuery {

  public static void main(String[] args) {
    runLegacyQuery();
  }

  public static void runLegacyQuery() {
    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();

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

      // Execute the query.
      TableResult result = bigquery.query(queryConfig);

      // Print the results.
      result.iterateAll().forEach(rows -> rows.forEach(row -> System.out.println(row.getValue())));

      System.out.println("Legacy query ran successfully");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Legacy query did not run \n" + e.toString());
    }
  }
}

Node.js

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Node.js の設定手順を完了してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

Node.js クライアント ライブラリではデフォルトで GoogleSQL が使用されます。

レガシー SQL 言語に切り替える

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

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

async function queryLegacy() {
  // Queries the U.S. given names dataset for the state of Texas using legacy SQL.

  const query =
    'SELECT word FROM [bigquery-public-data:samples.shakespeare] LIMIT 10;';

  // 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',
    useLegacySql: true,
  };

  // 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));
}

PHP

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある PHP の設定手順を完了してください。詳細については、BigQuery PHP API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

PHP クライアント ライブラリではデフォルトで GoogleSQL が使用されます。

レガシー SQL 言語に切り替える

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

use Google\Cloud\BigQuery\BigQueryClient;

/**
 * Query using legacy sql
 *
 * @param string $projectId The project Id of your Google Cloud Project.
 */
function query_legacy(string $projectId): void
{
    $query = 'SELECT corpus FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus';

    $bigQuery = new BigQueryClient([
      'projectId' => $projectId,
    ]);
    $jobConfig = $bigQuery->query($query)->useLegacySql(true);

    $queryResults = $bigQuery->runQuery($jobConfig);

    $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 クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

Python クライアント ライブラリではデフォルトで GoogleSQL が使用されます。

レガシー SQL 言語に切り替える

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

from google.cloud import bigquery

# Construct a BigQuery client object.
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(use_legacy_sql=True)

# Start the query and waits for query job to complete, passing in the extra configuration.
results = client.query_and_wait(
    query, job_config=job_config
)  # Make an API request.

print("The query data:")
for row in results:
    print(row)

Ruby

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Ruby の設定手順を完了してください。詳細については、BigQuery Ruby API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

Ruby クライアント ライブラリではデフォルトで GoogleSQL が使用されます。

レガシー SQL 言語に切り替える

クエリジョブでレガシー SQL 構文を使用するには、クエリでオプション legacy_sql: true を渡します。

require "google/cloud/bigquery"

def query_legacy
  bigquery = Google::Cloud::Bigquery.new
  sql = "SELECT name FROM [bigquery-public-data:usa_names.usa_1910_2013] " \
        "WHERE state = 'TX' " \
        "LIMIT 100"

  results = bigquery.query sql, legacy_sql: true do |config|
    # Location must match that of the dataset(s) referenced in the query.
    config.location = "US"
  end

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

次のステップ