Introducción a SQL en BigQuery

En este documento, se proporciona una descripción general de las declaraciones y los dialectos SQL compatibles en BigQuery.

GoogleSQL es un lenguaje de consulta estructurado (SQL) compatible con ANSI que incluye los siguientes tipos de declaraciones admitidas:

Dialectos de BigQuery SQL

BigQuery admite el dialecto GoogleSQL, pero también está disponible un dialecto SQL heredado. Si eres nuevo en BigQuery, deberías usar GoogleSQL, ya que admite la mayor variedad de funciones. Por ejemplo, las características como las declaraciones DDL y DML solo se admiten con GoogleSQL. SQL heredado se mantiene para garantizar la retrocompatibilidad y recomendamos que los clientes migren si usan SQL heredado.

Cambia el dialecto predeterminado

La interfaz que usas para consultar tus datos determina qué dialecto de consulta es el predeterminado. Para cambiar a un dialecto diferente, sigue estos pasos:

Console

El dialecto predeterminado para la consola de Google Cloud es GoogleSQL. Para cambiar el dialecto a SQL heredado, haz lo siguiente:

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, haz clic en el botón Más > Configuración de consulta.

  3. En la sección Opciones avanzadas, en Dialecto SQL, haz clic en Heredado y, luego, en Guardar. Esto establece la opción de SQL heredado para esta consulta. Cuando haces clic en add_box Consulta en SQL para crear una consulta nueva, debes volver a seleccionar la opción SQL heredado.

SQL

El dialecto predeterminado de SQL es GoogleSQL. Puedes configurar el dialecto SQL si incluyes el prefijo #standardSQL o #legacySQL como parte de tu consulta. Estos prefijos no distinguen mayúsculas de minúsculas, deben preceder a la consulta y deben separarse de la consulta con un carácter de salto de línea. En el siguiente ejemplo, se establece el dialecto en SQL heredado y se consulta el conjunto de datos de natalidad:

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, escribe la siguiente sentencia:

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

  3. Haz clic en Ejecutar.

Si deseas obtener información sobre cómo ejecutar consultas, visita Ejecuta una consulta interactiva.

bq

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

Cambia al dialecto GoogleSQL

Para usar la sintaxis de GoogleSQL en un trabajo de consulta, establece el parámetro use_legacy_sql en false.

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

Configura GoogleSQL como el dialecto predeterminado

Puedes establecer GoogleSQL como el dialecto predeterminado para 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 GoogleSQL 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. Guarde y cierre 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.

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. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para C#.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

De forma predeterminada, la biblioteca de C# usa GoogleSQL.

Cambia al dialecto SQL heredado

Para usar la sintaxis de SQL heredado en un trabajo de consulta, establece el parámetro UseLegacySql en 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

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. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Go.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

Según la configuración predeterminada, la biblioteca cliente de Go usa GoogleSQL.

Cambia al dialecto SQL heredado

Para usar la sintaxis de SQL heredado en un trabajo de consulta, establece la propiedad UseLegacySQL dentro de la configuración de la consulta en 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

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. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

Según la configuración predeterminada, la biblioteca cliente de Java usa GoogleSQL.

Cambia al dialecto SQL heredado

Para usar la sintaxis de SQL heredado en un trabajo de consulta, establece el parámetro useLegacySql en 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

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. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Node.js.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

De forma predeterminada, la biblioteca cliente de Node.js usa GoogleSQL.

Cambia al dialecto SQL heredado

Para usar la sintaxis de SQL heredado en un trabajo de consulta, establece el parámetro useLegacySql en 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

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. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para PHP.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

De forma predeterminada, la biblioteca cliente de PHP usa GoogleSQL.

Cambia al dialecto SQL heredado

Para usar la sintaxis de SQL heredado en un trabajo de consulta, establece el parámetro useLegacySql en 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

Antes de probar este ejemplo, 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. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

De forma predeterminada, la biblioteca cliente de Python usa GoogleSQL.

Cambia al dialecto SQL heredado

Para usar la sintaxis de SQL heredado en un trabajo de consulta, establece el parámetro use_legacy_sql en 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

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. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Ruby.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

De forma predeterminada, la biblioteca cliente de Ruby usa GoogleSQL.

Cambia al dialecto SQL heredado

Para usar la sintaxis de SQL heredado en un trabajo de consulta, pasa la opción legacy_sql: true con tu consulta.

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

¿Qué sigue?