BigQuery의 SQL 소개

이 문서에서는 BigQuery에서 지원되는 문과 SQL 언어를 간략하게 설명합니다.

개요

GoogleSQL은 다음과 같은 유형의 지원되는 문을 포함하는 ANSI와 호환되는 구조화된 쿼리 언어(SQL)입니다.

  • 쿼리 문(데이터 쿼리 언어(DQL) 문이라고도 함)은 BigQuery에서 데이터를 분석하는 기본 방법입니다. 테이블 또는 표현식을 하나 이상 스캔하고 계산된 결과 행을 반환합니다.
  • 절차적 언어 문은 단일 요청으로 여러 SQL 문을 실행할 수 있게 해주는 GoogleSQL의 절차적 확장입니다. 절차적 문에서 변수와 제어 흐름 문을 사용할 수 있으며 부작용이 있을 수 있습니다.
  • 데이터 정의 언어(DDL) 문을 사용하면 테이블, 뷰, 함수, 행 수준 액세스 정책과 같은 데이터베이스 객체를 만들고 수정할 수 있습니다.
  • 데이터 조작 언어(DML) 문을 사용하여 BigQuery 테이블에서 데이터를 업데이트, 삽입, 삭제할 수 있습니다.
  • 데이터 제어 언어(DCL) 문을 사용하면 액세스 및 용량과 같은 BigQuery 시스템 리소스를 제어할 수 있습니다.
  • 트랜잭션 제어 언어(TCL) 문을 사용하면 데이터 수정 트랜잭션을 관리할 수 있습니다.
  • 기타 문에서는 데이터 내보내기와 같은 추가 기능을 제공합니다.

BigQuery SQL 언어

BigQuery는 GoogleSQL 언어를 지원하지만 legacy SQL 언어도 사용할 수 있습니다. BigQuery를 처음 사용하는 경우 Google Cloud에서 다양한 기능을 지원하므로 GoogleSQL을 사용하는 것이 좋습니다. 예를 들어 DDL 및 DML 문과 같은 기능은 GoogleSQL을 통해서만 지원됩니다. legacy SQL은 이전 버전과의 호환성을 위해 유지 관리되므로 고객이 legacy SQL을 사용하는 경우 마이그레이션하는 것이 좋습니다.

기본 언어에서 변경

데이터를 쿼리하는 데 사용하는 인터페이스에 따라 기본 쿼리 언어가 결정됩니다. 다른 언어로 전환하려면 다음 안내를 따르세요.

콘솔

Google Cloud 콘솔의 기본 언어가 GoogleSQL입니다. 언어를 legacy SQL로 변경하려면 다음 안내를 따르세요.

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

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

  3. 고급 옵션 섹션에서 SQL 언어레거시를 클릭한 후 저장을 클릭합니다. 이에 따라 이 쿼리에 legacy SQL 옵션이 설정됩니다. 새 쿼리 작성을 클릭하여 새 쿼리를 작성할 때 legacy SQL 옵션을 다시 선택해야 합니다.

SQL

기본 SQL 언어는 GoogleSQL입니다. 프리픽스 #standardSQL 또는 #legacySQL을 쿼리 일부로 포함시켜 SQL 언어를 설정할 수 있습니다. 이러한 쿼리 프리픽스는 대소문자를 구분하지 않으며 쿼리 앞에 와야 하며 줄바꿈 문자로 쿼리와 구분해야 합니다. 다음 예시에서는 언어를 legacy 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 명령줄 도구의 기본 쿼리 언어는 legacy 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을 사용합니다.

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 = 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을 사용합니다.

legacy SQL 언어로 전환

쿼리 작업에서 legacy 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을 사용합니다.

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 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을 사용합니다.

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 참고 문서를 확인하세요.

BigQuery에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

기본적으로 PHP 클라이언트 라이브러리에서는 GoogleSQL을 사용합니다.

legacy SQL 언어로 전환

쿼리 작업에서 legacy 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을 사용합니다.

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 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을 사용합니다.

legacy SQL 언어로 전환

쿼리 작업에서 legacy 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

다음 단계