Introducción a SQL en BigQuery

En este documento se ofrece una descripción general de las instrucciones y los dialectos de SQL admitidos en BigQuery.

GoogleSQL es un lenguaje de consulta estructurada (SQL) que cumple el estándar ANSI y que incluye los siguientes tipos de instrucciones admitidas:

Dialectos de SQL de BigQuery

BigQuery admite el dialecto GoogleSQL, pero también está disponible un dialecto SQL antiguo. Si no tienes mucha experiencia con BigQuery, te recomendamos que uses GoogleSQL, ya que admite la mayor variedad de funciones. Por ejemplo, las funciones como las instrucciones DDL y DML solo se admiten con GoogleSQL. El SQL antiguo se mantiene para ofrecer compatibilidad con versiones anteriores. Recomendamos a los clientes que migrate si están usando SQL antiguo.

Cambiar de dialecto predeterminado

La interfaz que uses para consultar tus datos determinará qué dialecto de consulta se usará de forma predeterminada. Para cambiar a otro dialecto, sigue estos pasos:

Consola

El dialecto predeterminado de la consola de Google Cloud es GoogleSQL. Para cambiar el dialecto a SQL antiguo, sigue estos pasos:

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

    Ir a BigQuery

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

  3. En la sección Opciones avanzadas, en Dialecto SQL, haz clic en Antiguo y, a continuación, en Guardar. De esta forma, se define la opción de SQL antiguo para esta consulta. Cuando hagas clic en add_box Consulta SQL para crear una consulta, debes volver a seleccionar la opción de SQL antiguo.

SQL

El dialecto SQL predeterminado es GoogleSQL. Puedes definir el dialecto de SQL incluyendo el prefijo #standardSQL o #legacySQL como parte de tu consulta. Estos prefijos de consulta no distinguen entre mayúsculas y minúsculas, deben preceder a la consulta y separarse de ella con un carácter de salto de línea. En el siguiente ejemplo se define el dialecto como SQL antiguo y se consulta el conjunto de datos natality:

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

    Ir a BigQuery

  2. En el editor de consultas, introduce la siguiente instrucción:

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

Para obtener más información sobre cómo ejecutar consultas, consulta Ejecutar una consulta interactiva.

bq

El dialecto de consulta predeterminado de la herramienta de línea de comandos bq es el SQL antiguo. Para cambiar al dialecto GoogleSQL, añade la marca --use_legacy_sql=false o --nouse_legacy_sql a tu instrucción de línea de comandos.

Cambiar al dialecto GoogleSQL

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

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

Definir GoogleSQL como dialecto predeterminado

Puedes definir GoogleSQL como dialecto predeterminado para la herramienta de línea de comandos y el shell interactivo editando el archivo de configuración de la herramienta de línea de comandos: .bigqueryrc.

Para obtener más información sobre .bigqueryrc, consulta Definir valores predeterminados para las marcas específicas de un comando.

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

  1. Abre .bigqueryrc en un editor de texto. De forma predeterminada, .bigqueryrc debe estar en tu directorio de usuario, por ejemplo, $HOME/.bigqueryrc.
  2. Añade el siguiente texto al archivo. En este ejemplo, se define GoogleSQL como la sintaxis predeterminada de las consultas y del comando mk (que se usa al crear una vista). Si ya has configurado valores predeterminados para las marcas de comando query o mk, no es necesario que vuelvas a añadir [query] o [mk].

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

  4. Si estás usando la shell interactiva, debes salir y volver a iniciarla para que se apliquen los cambios.

Para obtener información sobre las marcas de línea de comandos disponibles, consulta la referencia de la herramienta de línea de comandos bq.

C#

Antes de probar este ejemplo, sigue las C#instrucciones de configuración de la guía de inicio rápido de BigQuery con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API C# de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

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

Cambiar al dialecto SQL antiguo

Para usar la sintaxis de SQL antiguo en un trabajo de consulta, asigna el valor true al parámetro UseLegacySql.


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 Goinstrucciones de configuración de la guía de inicio rápido de BigQuery con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Go de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

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

Cambiar al dialecto SQL antiguo

Para usar la sintaxis de SQL antiguo en una tarea de consulta, asigna el valor true a la propiedad UseLegacySQL en 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: %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 Javainstrucciones de configuración de la guía de inicio rápido de BigQuery con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Java de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

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

Cambiar al dialecto SQL antiguo

Para usar la sintaxis de SQL antiguo en un trabajo de consulta, asigna el valor true al parámetro useLegacySql.

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 Node.jsinstrucciones de configuración de la guía de inicio rápido de BigQuery con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Node.js de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

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

Cambiar al dialecto SQL antiguo

Para usar la sintaxis de SQL antiguo en un trabajo de consulta, asigna el valor true al parámetro useLegacySql.

// 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 PHPinstrucciones de configuración de la guía de inicio rápido de BigQuery con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API PHP de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

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

Cambiar al dialecto SQL antiguo

Para usar la sintaxis de SQL antiguo en un trabajo de consulta, asigna el valor true al parámetro useLegacySql.

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 Pythoninstrucciones de configuración de la guía de inicio rápido de BigQuery con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Python de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

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

Cambiar al dialecto SQL antiguo

Para usar la sintaxis de SQL antiguo en un trabajo de consulta, asigna el valor True al parámetro use_legacy_sql.

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 Rubyinstrucciones de configuración de la guía de inicio rápido de BigQuery con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Ruby de BigQuery.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

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

Cambiar al dialecto SQL antiguo

Para usar la sintaxis de SQL antiguo en un trabajo de consulta, incluye la opción legacy_sql: true en la 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

Siguientes pasos