Cambia los dialectos de SQL

Este tema describe cómo configurar el dialecto de consulta cuando consultas datos de BigQuery. Puedes usar SQL estándar o el dialecto SQL heredado.

Para aprender a consultar datos mediante la IU web de BigQuery, consulta la guía de inicio rápido sobre el uso de la IU web en GCP Console.

Para aprender a consultar datos mediante la herramienta de línea de comandos de bq, consulta la guía de inicio rápido sobre el uso de la herramienta de línea de comandos de bq.

Cambia el dialecto predeterminado

La interfaz que usas para consultar tus datos determina qué dialecto de consulta es el predeterminado:

  • En Cloud Console y las bibliotecas cliente, el SQL estándar es el predeterminado.
  • En la IU web clásica de BigQuery, la herramienta de línea de comandos de bq y la API de REST, el SQL heredado es el predeterminado.

Para cambiar a un dialecto diferente, sigue estos pasos:

Console

El dialecto predeterminado para Cloud Console es SQL estándar. Para cambiar el dialecto a SQL heredado, haz lo siguiente:

  1. Si es necesario, haz clic en Redactar consulta nueva para abrir la ventana del editor de consultas.

  2. Debajo del editor de consultas, haz clic en Más > Configuración de consulta.

  3. Haz clic en Opciones avanzadas.

  4. En la sección Configuración adicional, para el Dialecto SQL, haz clic en Heredado. Esto establece la opción de SQL heredado para esta consulta. Cuando haces clic en Redactar consulta nueva para crear una consulta nueva, debes volver a seleccionar la opción SQL heredado.

IU clásica

El dialecto predeterminado para la IU web clásica de BigQuery es SQL heredado. Para cambiar el dialecto a SQL estándar, sigue estos pasos:

  1. En la IU web clásica, haz clic en Redactar consulta.

  2. Haz clic en Mostrar opciones.

  3. Para el Dialecto SQL, desmarca la casilla Usar SQL heredado. Esto establece la opción SQL estándar mientras tienes abierto el editor de consultas. Si cierras el editor de consultas y lo vuelves a abrir, debes anular la selección de la opción sql heredado nuevamente.

CLI

El dialecto predeterminado para las consultas en la herramienta de línea de comandos de bq es SQL heredado. Para cambiar al dialecto SQL estándar, agrega las marcas --use_legacy_sql=false o --nouse_legacy_sql a tu declaración de línea de comandos.

Por ejemplo:

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

C#

Antes de probar este ejemplo, sigue las instrucciones de configuración para C# incluidas en la Guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de BigQuery para C#.

Cuando se ejecuta una consulta, se usa SQL estándar de forma predeterminada.


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

Usa SQL heredado

Para usar SQL heredado en la ejecución de consultas, configura el 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 probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de BigQuery para Go.

De forma predeterminada, la biblioteca cliente de Go usa SQL estándar.

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
}

Usa SQL heredado

Para cambiar una consulta a SQL heredado, aprovecha la propiedad UseLegacySQL dentro de la configuración de la consulta.

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
}

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

Según la configuración predeterminada, la biblioteca cliente de Java usa SQL estándar.

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

Usa SQL heredado

Configura el parámetro useLegacySql como true para usar la sintaxis de SQL heredado en un trabajo de consulta.

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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de BigQuery para Node.js.

De forma predeterminada, la biblioteca cliente de Node.js usa SQL estándar.

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

Usa SQL heredado

Configura el parámetro useLegacySql como true para usar la sintaxis de SQL heredado en un trabajo de consulta.

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

Antes de probar este ejemplo, sigue las instrucciones de configuración para PHP incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de BigQuery para PHP.

De forma predeterminada, la biblioteca cliente de PHP usa SQL estándar.

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

Usa SQL heredado

Configura el parámetro useLegacySql como true para usar la sintaxis de SQL heredado en un trabajo de consulta.

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Si deseas obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.

De forma predeterminada, la biblioteca cliente de Python usa SQL estándar.


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

Usa SQL heredado

Configura el parámetro use_legacy_sql como True para usar la sintaxis de SQL heredado en un trabajo de consulta.

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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Ruby incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. A fin de obtener más información, consulta la documentación de referencia de la API de BigQuery para Ruby.

De forma predeterminada, la biblioteca cliente de Ruby usa SQL estándar.

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

Usa un prefijo de consulta en la IU

También puedes configurar el dialecto SQL en Cloud Console o en la IU web clásica si incluyes un prefijo de dialecto de SQL en tu consulta.

Los siguientes prefijos te permiten configurar el dialecto SQL:

Prefijo Descripción
#legacySQL Ejecuta la consulta con SQL heredado.
#standardSQL Ejecuta la consulta con SQL estándar.

En Cloud Console, cuando usas un prefijo de consulta, la opción Dialecto SQL está inhabilitada en la Configuración de consulta.

En la IU web clásica, cuando usas un prefijo de consulta, el prefijo debe coincidir con la opción de Dialecto SQL. Por ejemplo, en la IU web clásica, si desmarcas la opción Usar SQL heredado, no puedes usar el prefijo #legacySQL en tu consulta.

Por ejemplo, si copias y pegas la siguiente consulta en Cloud Console, BigQuery ejecuta la consulta con SQL heredado y, también, ignora la configuración predeterminada. La configuración predeterminada para Cloud Console es SQL estándar.

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

Los prefijos de consulta #legacySQL y #standardSQL tienen las siguientes características:

  • NO distinguen entre mayúsculas y minúsculas.
  • Deben preceder a la consulta.
  • Deben estar separados de la consulta por un carácter de línea nueva.

Es posible que algunas herramientas de terceros no admitan este prefijo si, por ejemplo, modifican el texto de la consulta antes de enviarla a BigQuery.

Establece SQL estándar como la configuración predeterminada para la herramienta de línea de comandos

Puedes establecer SQL estándar como la sintaxis predeterminada de la herramienta de línea de comandos y la shell interactiva si editas el archivo de configuración de la herramienta de línea de comandos: .bigqueryrc.

Si deseas obtener más información sobre .bigqueryrc, consulta Configura los valores predeterminados para marcas de línea de comandos.

Para configurar --use_legacy_sql=false en .bigqueryrc, haz lo siguiente:

  1. Abre .bigqueryrc en un editor de texto. De forma predeterminada, .bigqueryrc debe aparecer en el directorio de usuarios, por ejemplo, $HOME/.bigqueryrc.

  2. Agrega el siguiente texto al archivo. En este ejemplo, se establece SQL estándar como la sintaxis predeterminada para las consultas y el comando mk (que se usa cuando se crea una vista). Si ya configuraste los valores predeterminados para las marcas de comando query o mk, no es necesario que vuelvas a agregar [query] o [mk].

    [query]
    --use_legacy_sql=false
    
    [mk]
    --use_legacy_sql=false
    
  3. Guarda y cierra el archivo.

  4. Si usas la shell interactiva, debes salir y reiniciar para que se apliquen los cambios.

Si deseas obtener información sobre las marcas de línea de comandos disponibles, consulta Referencia de la herramienta de línea de comandos de bq.