Como trocar dialetos SQL

Neste tópico, você aprenderá a definir o dialeto de consulta ao consultar dados do BigQuery. É possível usar os dialetos SQL padrão ou legado.

Para saber como começar a consultar dados usando a IU da Web do BigQuery, consulte Guia de início rápido sobre o uso da IU da Web.

Para saber como começar a consultar dados usando a ferramenta de linha de comando bq, consulte o Guia de início rápido para usar a ferramenta de linha de comando bq.

Como mudar do dialeto padrão

A interface usada para consultar os dados determina qual dialeto de consulta é o padrão:

  • No Console do GCP e nas bibliotecas de cliente, o SQL padrão é o padrão.
  • Na IU clássica da Web do BigQuery, na ferramenta de linha de comando bq e na API REST, o SQL legado é o padrão.

Para mudar para um dialeto diferente:

Console

O dialeto padrão do Console do GCP é o SQL padrão. Para alterar o dialeto para SQL legado, faça o seguinte:

  1. Se necessário, clique em Escrever nova consulta para abrir a janela do editor de consultas.

  2. Abaixo do editor de consultas, clique em Mais > Configurações de consulta.

  3. Clique em Opções avançadas.

  4. Na seção Configurações extras, clique em Legado para Dialeto SQL. Isso define a opção de SQL legado para essa consulta. Ao clicar em Escrever nova consulta para criar uma nova consulta, será preciso selecionar a opção SQL legado novamente.

IU clássica

O dialeto padrão para a IU da Web clássica do BigQuery é o SQL legado. Para alterar o dialeto para o SQL padrão, faça o seguinte:

  1. Na IU da Web clássica do BigQuery, clique em Escrever consulta.

  2. Clique em Mostrar opções.

  3. Desmarque a caixa Usar SQL legado para o Dialeto SQL. Isso define a opção de SQL padrão enquanto o editor de consultas estiver aberto. Se você fechar o editor de consultas e abri-lo novamente, será necessário desmarcar essa opção outra vez.

CLI

O dialeto de consulta padrão na ferramenta de linha de comando bq é o SQL legado. Para mudar para o dialeto SQL padrão, adicione a sinalização --use_legacy_sql=false ou --nouse_legacy_sql à instrução de linha de comando.

Por exemplo:

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

C#

Antes de testar esta amostra, siga as instruções de configuração do C# no Guia de início rápido do BigQuery – Como usar bibliotecas de cliente. Para saber mais informações, consulte a documentação de referência da API BigQuery C#.

Ao executar uma consulta, o SQL padrão é usado por padrão.


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"]}");
        }
    }
}

Como usar o SQL legado

Para usar o SQL legado ao executar consultas, defina o parâmetro `UseLegacySql` como "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

Antes de testar este exemplo, siga as instruções de configuração do Go no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery Go.

Por padrão, a biblioteca de cliente do Go usa o SQL padrão.


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

Como usar o SQL legado

Para alternar uma consulta de volta para o SQL legado, utilize a propriedade UseLegacySQL na configuração da consulta.

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

Antes de testar este exemplo, siga as instruções de configuração do Java no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery Java.

Por padrão, a biblioteca de cliente do Java usa o SQL padrão.

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

Como usar o SQL legado

Defina o parâmetro useLegacySql como true para usar a sintaxe do SQL legado em um job de consulta.

// 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

Antes de testar esta amostra, siga as instruções de configuração do Node.js no guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery Node.js.

Por padrão, a biblioteca de cliente do Node.js usa o SQL padrão.

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

Como usar o SQL legado

Defina o parâmetro useLegacySql como true para usar a sintaxe do SQL legado em um job de consulta.

PHP

Antes de testar esta amostra, siga as instruções de configuração do PHP no guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery PHP.

Por padrão, a biblioteca de cliente do PHP usa o SQL padrão.

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

Como usar o SQL legado

Defina o parâmetro useLegacySql como true para usar a sintaxe do SQL legado em um job de consulta.

Python

Antes de testar esta amostra, siga as instruções de configuração do Python no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery Python.

Por padrão, a biblioteca de cliente do Python usa o SQL padrão.

# 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)

Como usar o SQL legado

Defina o parâmetro use_legacy_sql como True para usar a sintaxe do SQL legado em um job de consulta.

# 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

Antes de testar este exemplo, siga as instruções de configuração do Ruby no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery Ruby.

Por padrão, a biblioteca de cliente do Ruby usa o SQL padrão.

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

Como usar um prefixo de consulta na IU

Também é possível definir o dialeto SQL no Console do GCP ou na IU da Web incluindo um prefixo de dialeto SQL como parte da sua consulta.

Os prefixos a seguir permitem que você defina o dialeto do SQL:

Prefixo Descrição
#legacySQL Executa a consulta com SQL legado
#standardSQL Executa a consulta com SQL padrão

No Console do GCP, quando você usa um prefixo de consulta, a opção de Dialeto SQL é desativada nas configurações de consulta.

Na IU da Web clássica, ao usar um prefixo de consulta, ele precisa corresponder à opção de dialeto SQL. Por exemplo, na IU da Web clássica, se você desmarcar a opção Usar SQL legado, não poderá usar o prefixo #legacySQL em sua consulta.

Por exemplo, se você copiar e colar a consulta a seguir no Console do GCP, o BigQuery executará a consulta usando o SQL herdado e ignorará a configuração padrão. A configuração padrão para o Console do GCP é o SQL padrão.

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

Os prefixos de consulta #legacySQL e #standardSQL:

  • NÃO diferenciam maiúsculas de minúsculas;
  • precisam preceder a consulta;
  • precisam ser separados da consulta por um caractere de nova linha.

Algumas ferramentas de terceiros podem não ser compatíveis com esses prefixos se, por exemplo, modificarem o texto da consulta antes de enviá-lo ao BigQuery.

Como definir o SQL padrão como padrão para a ferramenta de linha de comando

É possível definir o SQL padrão como a sintaxe padrão para a ferramenta de linha de comando e o shell interativo. Basta editar o arquivo de configuração da ferramenta de linha de comando .bigqueryrc.

Para mais informações sobre .bigqueryrc, consulte Como configurar valores padrão para sinalizações de comando específicas.

Para definir --use_legacy_sql=false em .bigqueryrc:

  1. Abra o .bigqueryrc em um editor de texto. Por padrão, o .bigqueryrc precisa estar em seu diretório de usuário, por exemplo, $HOME/.bigqueryrc.

  2. Adicione o seguinte texto ao arquivo. Este exemplo define o SQL como a sintaxe padrão para consultas e para o comando mk (usado quando você cria uma visualização). Se você já tiver configurado valores padrão para query ou mk, não será necessário adicionar [query] ou [mk] novamente.

    [query]
    --use_legacy_sql=false
    
    [mk]
    --use_legacy_sql=false
    
  3. Salve e feche o arquivo.

  4. Se você estiver usando o shell interativo, precisará sair e reiniciar para que as mudanças sejam aplicadas.

Para mais informações sobre as sinalizações de linha de comando disponíveis, consulte a referência da ferramenta de linha de comando bq.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.