SQL 언어 전환

이 주제에서는 BigQuery 데이터를 쿼리할 때 쿼리 언어를 설정하는 방법을 설명합니다. 표준 SQL 또는 legacy SQL 언어 중 하나를 사용할 수도 있습니다.

BigQuery 웹 UI를 사용하여 데이터를 쿼리하는 방법을 알아보려면 빠른 시작: 웹 UI 사용을 참조하세요.

bq 명령줄 도구를 사용하여 데이터를 쿼리하는 방법을 알아보려면 빠른 시작: bq 명령줄 도구 사용을 참조하세요.

기본 언어에서 변경

데이터를 쿼리하는 데 사용하는 인터페이스에 따라 기본 쿼리 언어가 결정됩니다.

  • Cloud Console 및 클라이언트 라이브러리에서는 표준 SQL이 기본입니다.
  • 기본 BigQuery 웹 UI, bq 명령줄 도구, REST API에서는 legacy SQL이 기본입니다.

다른 언어로 전환하려면 다음 안내를 따르세요.

Console

Cloud Console의 기본 언어는 표준 SQL입니다. 언어를 legacy SQL로 변경하려면 다음 단계를 따르세요.

  1. 필요한 경우 새 쿼리 작성을 클릭하여 쿼리 편집기를 엽니다.

  2. 쿼리 편집기 아래에서 더보기 > 쿼리 설정을 클릭합니다.

  3. 고급 옵션을 클릭합니다.

  4. 추가 설정 섹션에서 SQL 언어Legacy를 클릭합니다. 이렇게 하면 이 쿼리에 legacy SQL 옵션이 설정됩니다. 새 쿼리 작성을 클릭하여 새 쿼리를 작성할 때 legacy SQL 옵션을 다시 선택해야 합니다.

기본 UI

기본 BigQuery 웹 UI의 기본 언어는 legacy SQL입니다. 언어를 표준 SQL로 변경하려면 다음 단계를 따르세요.

  1. 기본 웹 UI에서 쿼리 작성을 클릭합니다.

  2. 옵션 표시를 클릭합니다.

  3. SQL 언어legacy SQL 사용 체크박스를 선택 해제합니다. 이렇게 하면 쿼리 편집기가 열려 있는 동안 표준 SQL 옵션이 설정됩니다. 쿼리 편집기를 닫았다가 다시 여는 경우 legacy SQL 옵션을 다시 선택 해제해야 합니다.

CLI

bq 명령줄 도구의 기본 쿼리 언어는 legacy 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"]}");
            }
        }
    }

legacy SQL 사용

쿼리를 실행할 때 legacy 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을 사용합니다.

import (
    	"context"
    	"fmt"
    	"io"

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

    // queryBasic demonstrates issuing a query and reading results.
    func queryBasic(w io.Writer, projectID string) error {
    	// projectID := "my-project-id"
    	ctx := context.Background()
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()

    	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"
    	// Run the query and print results when the query job is completed.
    	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.Fprintln(w, row)
    	}
    	return nil
    }
    

legacy SQL 사용

이전 쿼리로 전환하려면 쿼리 구성에 있는 UseLegacySQL 속성을 사용합니다.

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: %v", err)
    	}
    	defer client.Close()

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

    	// Run the query and print results when the query job is completed.
    	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.Fprintln(w, row)
    	}
    	return nil
    }
    

자바

이 샘플을 시도하기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용의 자바 설정 안내를 따르세요. 자세한 내용은 BigQuery 자바 API 참조 문서를 확인하세요.

기본적으로 자바 클라이언트 라이브러리는 표준 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");
    }

legacy SQL 사용

쿼리 작업에서 legacy 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 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 참조 문서를 확인하세요.

기본적으로 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));
    }

legacy SQL 사용

쿼리 작업에서 legacy 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 참조 문서를 참조하세요.

기본적으로 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);

legacy SQL 사용

쿼리 작업에서 legacy SQL 구문을 사용하려면 useLegacySql 매개변수를 true로 설정합니다.

Python

이 샘플을 시도하기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참조 문서를 확인하세요.

기본적으로 Python 클라이언트 라이브러리는 표준 SQL을 사용합니다.


    from google.cloud import bigquery

    # Construct a BigQuery client object.
    client = bigquery.Client()

    query = """
        SELECT name, SUM(number) as total_people
        FROM `bigquery-public-data.usa_names.usa_1910_2013`
        WHERE state = 'TX'
        GROUP BY name, state
        ORDER BY total_people DESC
        LIMIT 20
    """
    query_job = client.query(query)  # Make an API request.

    print("The query data:")
    for row in query_job:
        # Row values can be accessed by field name or index.
        print("name={}, count={}".format(row[0], row["total_people"]))

legacy SQL 사용

쿼리 작업에서 legacy 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, passing in the extra configuration.
    query_job = client.query(query, job_config=job_config)  # Make an API request.

    print("The query data:")
    for row in query_job:
        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에서 쿼리 프리픽스 사용

SQL 언어 프리픽스를 쿼리의 일부로 포함시켜 Cloud Console 또는 기본 웹 UI에서 SQL 언어를 설정할 수도 있습니다.

다음 프리픽스를 사용하면 SQL 언어를 설정할 수 있습니다.

프리픽스 설명
#legacySQL legacy SQL을 사용하여 쿼리를 실행합니다.
#standardSQL 표준 SQL을 사용하여 쿼리를 실행합니다.

Cloud Console에서 쿼리 프리픽스를 사용하면 쿼리 설정에서 SQL 언어 옵션이 비활성화됩니다.

기본 웹 UI에서 쿼리 프리픽스를 사용하면 프리픽스가 SQL 언어 옵션과 일치해야 합니다. 예를 들어 기본 웹 UI에서 legacy SQL 사용 옵션을 선택 해제하면 쿼리에 #legacySQL 프리픽스를 사용할 수 없습니다.

예를 들어 다음 쿼리를 복사하여 Cloud Console에 붙여넣으면 BigQuery가 legacy SQL을 사용하여 쿼리를 실행하고 기본 설정을 무시합니다. Cloud 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:

  • 대소문자를 구분하지 않습니다.
  • 쿼리보다 선행해야 합니다.
  • 줄바꿈 문자로 쿼리와 구분해야 합니다.

일부 제3자 도구는 예를 들어 쿼리를 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 명령줄 도구 참조를 확인하세요.