מבוא ל-SQL ב-BigQuery

במאמר הזה מפורטת סקירה כללית של המשפטים הנתמכים ושל דיאלקטים של SQL ב-BigQuery.

‫GoogleSQL היא שפת שאילתות מובְנית (SQL) שתואמת לתקן ANSI, וכוללת את סוגי ההצהרות הנתמכים הבאים:

דיאלקטים של BigQuery SQL

‫BigQuery תומך בדיאלקט GoogleSQL, שהוא הדיאלקט המומלץ לכל הפרויקטים החדשים. יש גם ניב SQL מדור קודם עם הגבלות מסוימות. מומלץ לעבור מ-SQL מדור קודם ל-GoogleSQL.

שינוי הניב שמוגדר כברירת מחדל

הממשק שבו אתם משתמשים כדי להריץ שאילתות על הנתונים קובע את דיאלקט השאילתות שמוגדר כברירת מחדל. כדי לעבור לדיאלקט אחר:

המסוף

ניב ברירת המחדל של Cloud de Confiance המסוף הוא GoogleSQL. כדי לשנות את הדיאלקט ל-SQL מדור קודם:

  1. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. בעורך השאילתות, לוחצים על הלחצן More > Query settings (עוד > הגדרות השאילתה).

  3. בקטע אפשרויות מתקדמות, בשדה ניב SQL, לוחצים על גרסה קודמת ואז על שמירה. האפשרות הזו מגדירה את האפשרות של SQL מדור קודם לשאילתה הזו. כשלוחצים על add_box SQL Query כדי ליצור שאילתה חדשה, צריך לבחור שוב באפשרות של SQL מדור קודם.

SQL

דיאלקט ברירת המחדל של SQL הוא GoogleSQL. אפשר להגדיר את דיאלקט ה-SQL על ידי הוספת הקידומת #standardSQL או #legacySQL כחלק מהשאילתה. קידומות השאילתות האלה לא תלויות באותיות רישיות, הן צריכות להופיע לפני השאילתה ולהיות מופרדות ממנה באמצעות תו מעבר שורה. בדוגמה הבאה, הדיאלקט מוגדר ל-SQL מדור קודם והשאילתה מופעלת על מערך הנתונים natality:

  1. במסוף Cloud de Confiance , עוברים לדף BigQuery.

    כניסה ל-BigQuery

  2. מזינים את ההצהרה הבאה בעורך השאילתות:

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

  3. לוחצים על הפעלה.

מידע נוסף על הרצת שאילתות זמין במאמר הרצת שאילתה אינטראקטיבית.

BQ

דיאלקט ברירת המחדל של השאילתה בכלי שורת הפקודה bq הוא SQL מדור קודם. כדי לעבור לניב GoogleSQL, מוסיפים את הדגל --use_legacy_sql=false או --nouse_legacy_sql להצהרה בשורת הפקודה.

מעבר לניב GoogleSQL

כדי להשתמש בתחביר GoogleSQL בעבודת שאילתה, צריך להגדיר את הפרמטר use_legacy_sql לערך false.

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

הגדרת GoogleSQL כניב ברירת המחדל

אפשר להגדיר את GoogleSQL כדיאלקט ברירת המחדל בכלי שורת הפקודה ובמעטפת האינטראקטיבית על ידי עריכת קובץ התצורה של כלי שורת הפקודה: .bigqueryrc.

מידע נוסף על .bigqueryrc זמין במאמר בנושא הגדרת ערכי ברירת מחדל לדגלים ספציפיים לפקודות.

כדי להגדיר את --use_legacy_sql=false ב-.bigqueryrc:

  1. פותחים את .bigqueryrc בכלי לעריכת טקסט. כברירת מחדל, .bigqueryrc צריך להיות בספריית המשתמשים, לדוגמה, $HOME/.bigqueryrc.
  2. מוסיפים את הטקסט הבא לקובץ. בדוגמה הזו, GoogleSQL מוגדר כתחביר ברירת המחדל לשאילתות ולפקודה mk (שמשמשת ליצירת תצוגה). אם כבר הגדרתם ערכי ברירת מחדל לדגלי הפקודות query או mk, אתם לא צריכים להוסיף שוב את [query] או [mk].

    [query]
    --use_legacy_sql=false
    [mk]
    --use_legacy_sql=false
    
  3. שומרים את הקובץ וסוגרים אותו.

  4. אם אתם משתמשים במעטפת האינטראקטיבית, אתם צריכים לצאת ולהפעיל אותה מחדש כדי שהשינויים יחולו.

למידע על תגים זמינים בשורת הפקודה, ראו חומרי עזר לכלי שורת הפקודה של BigQuery.

C#‎

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי C#הוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery C# API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

כברירת מחדל, ספריית C# ‎ משתמשת ב-GoogleSQL.

מעבר לניב SQL מדור קודם

כדי להשתמש בתחביר SQL מדור קודם בעבודת שאילתה, מגדירים את הפרמטר UseLegacySql לערך 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

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Go API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

כברירת מחדל, ספריית הלקוח של Go משתמשת ב-GoogleSQL.

מעבר לניב SQL מדור קודם

כדי להשתמש בתחביר SQL מדור קודם בעבודת שאילתה, מגדירים את המאפיין UseLegacySQL בהגדרת השאילתה לערך 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

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Javaהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Java API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

כברירת מחדל, ספריית הלקוח של Java משתמשת ב-GoogleSQL.

מעבר לניב SQL מדור קודם

כדי להשתמש בתחביר SQL מדור קודם בעבודת שאילתה, מגדירים את הפרמטר useLegacySql לערך 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

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Node.js API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

כברירת מחדל, ספריית הלקוח Node.js משתמשת ב-GoogleSQL.

מעבר לניב SQL מדור קודם

כדי להשתמש בתחביר SQL מדור קודם בעבודת שאילתה, מגדירים את הפרמטר useLegacySql לערך 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

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי PHPהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery PHP API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

כברירת מחדל, ספריית הלקוח של PHP משתמשת ב-GoogleSQL.

מעבר לניב SQL מדור קודם

כדי להשתמש בתחביר SQL מדור קודם בעבודת שאילתה, מגדירים את הפרמטר useLegacySql לערך 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

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Python API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

כברירת מחדל, ספריית הלקוח של Python משתמשת ב-GoogleSQL.

מעבר לניב SQL מדור קודם

כדי להשתמש בתחביר SQL מדור קודם בעבודת שאילתה, מגדירים את הפרמטר use_legacy_sql לערך 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

לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Rubyהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Ruby API.

כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.

כברירת מחדל, ספריית הלקוח של Ruby משתמשת ב-GoogleSQL.

מעבר לניב SQL מדור קודם

כדי להשתמש בתחביר SQL מדור קודם במשימת שאילתה, מעבירים את האפשרות legacy_sql: true עם השאילתה.

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

המאמרים הבאים