Einführung in SQL in BigQuery

Dieses Dokument bietet einen Überblick über unterstützte Anweisungen und SQL-Dialekte in BigQuery.

GoogleSQL ist eine ANSI-konforme strukturierte Abfragesprache (Structured Query Language, SQL), die die folgenden Arten unterstützter Anweisungen enthält:

BigQuery SQL-Dialekte

BigQuery unterstützt den GoogleSQL-Dialekt, aber auch ein Legacy-SQL-Dialekt ist verfügbar. Wenn Sie mit BigQuery noch nicht vertraut sind, sollten Sie GoogleSQL verwenden, da es die meisten Funktionen unterstützt. Beispielsweise werden Funktionen wie DDL- und DML-Anweisungen nur mit GoogleSQL unterstützt. Legacy-SQL sorgt für Abwärtskompatibilität. Wir empfehlen Kunden, zu migrieren, wenn sie Legacy-SQL verwenden.

Standarddialekt ändern

Anhand der Schnittstelle, die Sie zum Abfragen der Daten verwenden, wird der Standarddialekt für Abfragen festgelegt. So wechseln Sie zu einem anderen Dialekt:

Console

Der Standarddialekt für die Google Cloud Console ist GoogleSQL. So ändern Sie den Dialekt in Legacy-SQL:

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Klicken Sie im Abfrageeditor auf die Schaltfläche Mehr > Abfrageeinstellungen.

  3. Klicken Sie im Abschnitt Erweiterte Optionen unter SQL-Dialekt auf Legacy und dann auf Speichern. Dadurch wird für diese Abfrage die Option "Legacy-SQL" aktiviert. Wenn Sie auf add_box SQL-Abfrage klicken, um eine neue Abfrage zu erstellen, müssen Sie noch einmal die Option „Legacy-SQL“ auswählen.

SQL

Der Standard-SQL-Dialekt ist GoogleSQL. Sie können den SQL-Dialekt festlegen, indem Sie das Präfix #standardSQL oder #legacySQL in Ihre Abfrage einfügen. Bei diesen Abfragepräfixen wird nicht zwischen Groß- und Kleinschreibung unterschieden. Sie müssen der Abfrage vorangestellt sein und durch ein Zeilenvorschubzeichen getrennt werden. Im folgenden Beispiel wird der Dialekt auf Legacy-SQL gesetzt und das "natality"-Dataset abgefragt:

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Geben Sie im Abfrageeditor die folgende Anweisung ein:

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

  3. Klicken Sie auf Ausführen.

Informationen zum Ausführen von Abfragen finden Sie unter Interaktive Abfrage ausführen.

bq

Der Standard-Suchanfragendialekt im bq-Befehlszeilentool ist Legacy-SQL. Fügen Sie der Befehlszeilenanweisung das Flag --use_legacy_sql=false oder --nouse_legacy_sql hinzu, um zum GoogleSQL-Dialekt zu wechseln.

Zum GoogleSQL-Dialekt wechseln

Zur Verwendung der GoogleSQL-Syntax in einem Abfragejob legen Sie für den Parameter use_legacy_sql den Wert false fest.

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

GoogleSQL als Standarddialekt festlegen

Sie können GoogleSQL als Standarddialekt für das Befehlszeilentool und die interaktive Shell festlegen. Dazu bearbeiten Sie die Konfigurationsdatei .bigqueryrc des Befehlszeilentools.

Weitere Informationen zu .bigqueryrc finden Sie unter Standardwerte für Befehlszeilen-Flags festlegen.

So legen Sie --use_legacy_sql=false in .bigqueryrc fest:

  1. Öffnen Sie .bigqueryrc in einem Texteditor. Standardmäßig sollte sich .bigqueryrc in Ihrem Nutzerverzeichnis befinden, z. B. $HOME/.bigqueryrc.
  2. Fügen Sie der Datei den folgenden Text hinzu. In diesem Beispiel wird GoogleSQL als Standardsyntax für Abfragen und für den Befehl mk festgelegt, der beim Erstellen einer Datenansicht verwendet wird. Wenn Sie bereits Standardwerte für die Befehls-Flags query oder mk konfiguriert haben, müssen Sie [query] oder [mk] nicht noch einmal hinzufügen.

    [query]
    --use_legacy_sql=false
    [mk]
    --use_legacy_sql=false
    
  3. Speichern und schließen Sie die Datei.

  4. Wenn Sie die interaktive Shell verwenden, müssen Sie die Anwendung beenden und neu starten, damit die Änderungen wirksam werden.

Informationen zu verfügbaren Befehlszeilen-Flags finden Sie in der Referenz zum bq-Befehlszeilentool.

C#

Bevor Sie dieses Beispiel ausprobieren, folgen Sie der C#-Einrichtungsanleitung in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery C# API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Standardmäßig verwendet die C#-Bibliothek GoogleSQL.

Zum Legacy-SQL-Dialekt wechseln

Zur Verwendung der Legacy-SQL-Syntax in einem Abfragejob legen Sie den Parameter UseLegacySql auf true fest.


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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Go in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery Go API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Standardmäßig verwendet die Go-Clientbibliothek GoogleSQL.

Zum Legacy-SQL-Dialekt wechseln

Um die Legacy-SQL-Syntax in einem Abfragejob zu verwenden, legen Sie das Attribut UseLegacySQL in der Abfragekonfiguration auf true fest.

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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Java in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery Java API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Standardmäßig verwendet die Java-Clientbibliothek GoogleSQL.

Zum Legacy-SQL-Dialekt wechseln

Zur Verwendung der Legacy-SQL-Syntax in einem Abfragejob legen Sie für den Parameter useLegacySql den Wert true fest.

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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Node.js in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery Node.js API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Standardmäßig verwendet die Node.js-Clientbibliothek GoogleSQL.

Zum Legacy-SQL-Dialekt wechseln

Zur Verwendung der Legacy-SQL-Syntax in einem Abfragejob legen Sie für den Parameter useLegacySql den Wert true fest.

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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von PHP in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery PHP API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Standardmäßig verwendet die PHP-Clientbibliothek GoogleSQL.

Zum Legacy-SQL-Dialekt wechseln

Zur Verwendung der Legacy-SQL-Syntax in einem Abfragejob legen Sie für den Parameter useLegacySql den Wert true fest.

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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Python in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery Python API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Standardmäßig verwendet die Python-Clientbibliothek GoogleSQL.

Zum Legacy-SQL-Dialekt wechseln

Zur Verwendung der Legacy-SQL-Syntax in einem Abfragejob legen Sie für den Parameter use_legacy_sql den Wert True fest.

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

Bevor Sie dieses Beispiel anwenden, folgen Sie den Schritten zur Einrichtung von Ruby in der BigQuery-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur BigQuery Ruby API.

Richten Sie zur Authentifizierung bei BigQuery die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Standardmäßig verwendet die Ruby-Clientbibliothek GoogleSQL.

Zum Legacy-SQL-Dialekt wechseln

Um die Legacy-SQL-Syntax in einem Abfragejob zu verwenden, übergeben Sie die Option legacy_sql: true mit Ihrer Abfrage.

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

Nächste Schritte