FirebirdSQL logo

Hintergrund zu Firebirds SQL-Sprache

Zu Beginn, ein paar Punkte über die Eigenschaften die im Hintergrund von Firebirds Sprache eine Rolle spielen.

SQL Bestandteile

Verschiedene Teilmengen von SQL gehören wiederum in verschiedene Aktivitätsbereiche.Die Teilmengen in Firebirds Sprachimplementation sind:

  • Dynamic SQL (DSQL)

  • Procedural SQL (PSQL)

  • Embedded SQL (ESQL)

  • Interactive SQL (ISQL)

Dynamic SQL macht den Hauptteil der Sprache aus, der in Abschnitt (SQL/Foundation) 2 der SQL-Spezifikation beschrieben wird.DSQL repräsentiert Statements, die von Anwendungen über die Firebird API durch die Datenbank verarbeitet werden.

Procedural SQL erweitert Dynamic SQL, um zusammengesetzte Anweisungen zu ermöglichen, die lokale Variablen, Zuweisungen, Bedingungen, Schleifen und andere prozedurale Konstrukte enthalten.PSQL entspricht dem Teil 4 (SQL/PSM) Teil der SQL-Spezifikationen.Ursprünglich waren PSQL-Erweiterungen nur in persistent gespeicherten Modulen (Prozeduren und Trigger) verfügbar, aber in neueren Versionen wurden sie auch in Dynamic SQL aufgetaucht (siehe EXECUTE BLOCK).

Embedded SQL definiert die DSQL-Untermenge, die von Firebird gpre unterstützt wird, der Anwendung, mit der Sie SQL-Konstrukte in Ihre Host-Programmiersprache (C, C++, Pascal, Cobol usw.) einbetten und diese eingebetteten Konstrukte in die richtigen Firebird-API-Aufrufe vorverarbeiten können.

Note

Nur ein Teil der in DSQL implementierten Anweisungen und Ausdrücke wird in ESQL unterstützt.

Interactive ISQL bezieht sich auf die Sprache, die mit Firebird isql ausgeführt werden kann, der Befehlszeilenanwendung für den interaktiven Zugriff auf Datenbanken.Als normale Client-Anwendung ist ihre Muttersprache DSQL.Es bietet auch einige zusätzliche Befehle, die außerhalb seiner spezifischen Umgebung nicht verfügbar sind.

Sowohl DSQL- als auch PSQL-Teilmengen werden in dieser Referenz vollständig vorgestellt.Weder ESQL- noch ISQL-Varianten werden hier beschrieben, sofern nicht explizit erwähnt.

docnext count = 9

SQL-Dialekte

SQL-Dialekt ist ein Begriff, der die spezifischen Funktionen der SQL-Sprache definiert, die beim Zugriff auf eine Datenbank verfügbar sind.SQL-Dialekte können auf Datenbankebene definiert und auf Verbindungsebene angegeben werden.Drei Dialekte stehen zur Verfügung:

  • Dialekt 1 dient ausschließlich dazu, die Abwärtskompatibilität mit Legacy-Datenbanken aus sehr alten InterBase-Versionen, v.5 und darunter, zu ermöglichen.Dialekt 1-Datenbanken behalten bestimmte Sprachfunktionen bei, die sich von Dialekt 3 unterscheiden, dem Standard für Firebird-Datenbanken.

    • Datums- und Uhrzeitinformationen werden im Datentyp DATE gespeichert.Ein Datentyp TIMESTAMP ist ebenfalls verfügbar, der mit dieser DATE-Implementierung identisch ist.

    • Anführungszeichen können als Alternative zu Apostrophen zum Trennen von Zeichenfolgendaten verwendet werden.Dies steht im Gegensatz zum SQL-Standard – doppelte Anführungszeichen sind sowohl in Standard-SQL als auch in Dialekt 3 für einen bestimmten syntaktischen Zweck reserviert.Strings in doppelten Anführungszeichen sind daher streng zu vermeiden.

    • Die Genauigkeit für die Datentypen NUMERIC und DECIMAL ist kleiner als in Dialekt 3 und wenn die Genauigkeit einer festen Dezimalzahl größer als 9 ist, speichert Firebird sie intern als langen Gleitkommawert.

    • Der Datentyp BIGINT (64-Bit-Ganzzahl) wird nicht unterstützt.

    • Bei Bezeichnern wird die Groß-/Kleinschreibung nicht beachtet und müssen immer den Regeln für normale Bezeichner entsprechen — siehe Abschnitt [fblangref40-structure-identifiers-de] weiter unten.

    • Obwohl Generatorwerte als 64-Bit-Ganzzahlen gespeichert werden, gibt eine Dialekt-1-Client-Anfrage, beispielsweise SELECT GEN_ID (MyGen, 1) den Generatorwert auf 32 Bit gekürzt zurück.

  • Dialekt 2 ist nur über die Firebird-Client-Verbindung verfügbar und kann nicht in der Datenbank eingestellt werden.Es soll das Debuggen möglicher Probleme mit Altdaten bei der Migration einer Datenbank von Dialekt 1 auf 3 unterstützen.

  • In Dialekt 3-Datenbanken,

    • Zahlen (Datentypen DECIMAL und NUMERIC) werden intern als lange Festkommawerte (skalierte Ganzzahlen) gespeichert, wenn die Genauigkeit größer als 9 ist.

    • Der Datentyp TIME ist nur zum Speichern von Uhrzeitdaten verfügbar.

    • Der Datentyp DATE speichert nur Datumsinformationen.

    • Der 64-Bit-Integer-Datentyp BIGINT ist verfügbar.

    • Doppelte Anführungszeichen sind für die Abgrenzung nicht regulärer Bezeichner reserviert, um Objektnamen zu ermöglichen, bei denen die Groß-/Kleinschreibung beachtet wird oder die auf andere Weise nicht die Anforderungen für reguläre Bezeichner erfüllen.

    • Alle Strings müssen durch einfache Anführungszeichen (Apostrophe) getrennt werden.

    • Generatorwerte werden als 64-Bit-Ganzzahlen gespeichert.

Important

Für neu entwickelte Datenbanken und Anwendungen wird die Verwendung von Dialect 3 dringend empfohlen.Sowohl Datenbank- als auch Verbindungsdialekte sollten übereinstimmen, außer unter Migrationsbedingungen mit Dialekt 2.

Diese Referenz beschreibt die Semantik von SQL Dialect 3, sofern nicht anders angegeben.

Fehlerbedingungen

Die Verarbeitung jeder SQL-Anweisung wird entweder erfolgreich abgeschlossen oder schlägt aufgrund einer bestimmten Fehlerbedingung fehl.Die Fehlerbehandlung kann sowohl auf der Clientseite der Anwendung als auch auf der Serverseite mit PSQL erfolgen.

Grundelemente: Aussagen, Klauseln, Schlüsselwörter

Das primäre Konstrukt in SQL ist die Anweisung.Eine Anweisung definiert, was das Datenbankverwaltungssystem mit einem bestimmten Daten- oder Metadatenobjekt tun soll.Komplexere Anweisungen enthalten einfachere Konstrukte — Klauseln und Optionen.

Klauseln

Eine Klausel definiert eine bestimmte Art von Direktive in einer Anweisung.Zum Beispiel spezifiziert die Klausel WHERE in einer SELECT-Anweisung und in einigen anderen Datenmanipulationsanweisungen (UPDATE, DELETE) Kriterien zum Durchsuchen einer oder mehrerer Tabellen nach den Zeilen, die ausgewählt, aktualisiert oder gelöscht werden sollen .Die ORDER BY-Klausel gibt an, wie die Ausgabedaten — die Ergebnismenge — sortiert werden sollen.

Optionen

Optionen sind die einfachsten Konstrukte und werden in Verbindung mit bestimmten Schlüsselwörtern angegeben, um eine Qualifizierung für Klauselelemente bereitzustellen.Wenn alternative Optionen verfügbar sind, ist es üblich, dass eine von ihnen die Standardeinstellung ist, die verwendet wird, wenn für diese Option nichts angegeben ist.Zum Beispiel gibt die SELECT-Anweisung alle Zeilen zurück, die den Suchkriterien entsprechen, es sei denn, die DISTINCT-Option beschränkt die Ausgabe auf nicht duplizierte Zeilen.

Schlüsselwörter

Alle Wörter, die im SQL-Lexikon enthalten sind, sind Schlüsselwörter.Einige Schlüsselwörter sind reserviert, was bedeutet, dass ihre Verwendung als Bezeichner für Datenbankobjekte, Parameternamen oder Variablen in einigen oder allen Kontexten verboten ist.Nicht reservierte Schlüsselwörter können als Bezeichner verwendet werden, obwohl dies nicht empfohlen wird.Von Zeit zu Zeit können nicht reservierte Schlüsselwörter reserviert werden, wenn eine neue Sprachfunktion eingeführt wird.

Die folgende Anweisung wird beispielsweise ohne Fehler ausgeführt, da ABS zwar ein Schlüsselwort, aber kein reserviertes Wort ist.

CREATE TABLE T (ABS INT NOT NULL);

Im Gegenteil, die folgende Anweisung gibt einen Fehler zurück, da ADD sowohl ein Schlüsselwort als auch ein reserviertes Wort ist.

CREATE TABLE T (ADD INT NOT NULL);

Siehe die Liste der reservierten Wörter und Schlüsselwörter im Kapitel Reservierte Wörter und Schlüsselwörter.

Bezeichner

Alle Datenbankobjekte haben Namen, die oft als Identifier bezeichnet werden.Die maximale Bezeichnerlänge beträgt 63 Zeichen Zeichensatz UTF8 (252 Byte).

Note

Es ist möglich, die tatsächliche maximale Identifier-Länge durch Konfiguration einzuschränken.Weitere Informationen finden Sie in den Firebird 4.0 Versionshinweisen.In dieser Sprachreferenz gehen wir von der Standardkonfiguration von 63 Zeichen (252 Byte) aus.

Als Bezeichner sind zwei Arten von Namen gültig: reguläre Namen, ähnlich den Variablennamen in regulären Programmiersprachen, und getrennte Namen, die für SQL spezifisch sind.Um gültig zu sein, muss jeder Bezeichnertyp einer Reihe von Regeln entsprechen, wie folgt:

Regeln für reguläre Objektbezeichner

  • Länge darf 63 Zeichen nicht überschreiten

  • Der Name muss mit einem alphabetischen 7-Bit-ASCII-Zeichen ohne Akzent beginnen.Es können weitere 7-Bit-ASCII-Buchstaben, Ziffern, Unterstriche oder Dollarzeichen folgen.Andere Zeichen, einschließlich Leerzeichen, sind nicht gültig.Bei dem Namen wird die Groß-/Kleinschreibung nicht beachtet, dh er kann in Groß- oder Kleinschreibung deklariert und verwendet werden.Somit sind aus Sicht des Systems die folgenden Namen gleich:

    fullname
    FULLNAME
    FuLlNaMe
    FullName
Reguläre Namenssyntax
<name> ::=
  <letter> | <name><letter> | <name><digit> | <name>_ | <name>$

<letter> ::= <upper letter> | <lower letter>

<upper letter> ::= A | B | C | D | E | F | G | H | I | J | K | L | M |
                   N | O | P | Q | R | S | T | U | V | W | X | Y | Z

<lower letter> ::= a | b | c | d | e | f | g | h | i | j | k | l | m |
                   n | o | p | q | r | s | t | u | v | w | x | y | z

<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Regeln für getrennte Objektbezeichner

  • Länge darf 63 Zeichen im Zeichensatz UTF8 (252 Byte) nicht überschreiten.Bezeichner werden im Zeichensatz UTF8 gespeichert, dh Zeichen außerhalb des ASCII-Bereichs werden mit 2 bis 4 Byte gespeichert.

  • Der gesamte String muss in doppelte Anführungszeichen eingeschlossen werden, z.B. "anIdentifier"

  • Es kann jedes Zeichen aus dem UTF8-Zeichensatz enthalten, einschließlich Akzentzeichen, Leerzeichen und Sonderzeichen

  • Ein Bezeichner kann ein reserviertes Wort sein

  • Bei Bezeichnern mit Trennzeichen muss die Groß-/Kleinschreibung in allen Kontexten beachtet werden

  • Nachgestellte Leerzeichen in durch Trennzeichen getrennten Namen werden wie bei jeder Stringkonstanten entfernt

  • Begrenzte Bezeichner sind nur in Dialekt 3 verfügbar.Weitere Informationen zu Dialekten finden Sie unter [fblangref40-structure-dialects-de]

Getrennte Namenssyntax
<delimited name> ::= "<permitted_character>[<permitted_character> ...]"
Note

Ein durch Trennzeichen getrennter Bezeichner wie "FULLNAME" entspricht den regulären Bezeichnern FULLNAME, fullname, FullName und so weiter.Der Grund dafür ist, dass Firebird reguläre Bezeichner in Großbuchstaben speichert, unabhängig davon, wie sie definiert oder deklariert wurden.Begrenzte Bezeichner werden immer nach der genauen Schreibweise ihrer Definition oder Deklaration gespeichert.Somit unterscheidet sich "FullName" (quoted) von FullName (unquoted, d.h. regulär), das als FULLNAME in den Metadaten gespeichert wird.

Literale

Literale werden verwendet, um Daten direkt darzustellen.Beispiele für Standardtypen von Literalen sind:

integer        - 0, -34, 45, 0X080000000;
fixed-point    - 0.0, -3.14
floating-point - 3.23e-23;
string         - 'text', 'don''t!';
binary string  - x'48656C6C6F20776F726C64'
date           - DATE '2018-01-19';
time           - TIME '15:12:56';
timestamp      - TIMESTAMP '2018-01-19 13:32:02';
boolean        - true, false, unknown
null state     - null

Details zu Literalen für jeden Datentyp werden im Abschnitt Konstanten des Kapitels Allgemeine Sprachelemente behandelt.

Operatoren und Sonderzeichen

Eine Reihe von Sonderzeichen ist für die Verwendung als Operatoren oder Trennzeichen reserviert.

<special char> ::=
    <space> | " | % | & | ' | ( | ) | * | + | , | -
  | . | / | : | ; | < | = | > | ? | [ | ] | ^ | { | }

Einige dieser Zeichen können einzeln oder in Kombination als Operatoren (arithmetisch, string, logisch), als Trennzeichen für SQL-Befehle, als Anführungszeichen für Bezeichner und als Begrenzung von String-Literalen oder Kommentaren verwendet werden.

Operatorsyntax
<operator> ::=
    <string concatenation operator>
  | <arithmetic operator>
  | <comparison operator>
  | <logical operator>

<string concatentation operator> ::= "||"

<arithmetic operator> ::= * | / | + | - |

<comparison operator> ::=
    =  | <> | != | ~= | ^= | > | < | >= | <=
  | !> | ~> | ^> | !< | ~< | ^<

<logical operator> ::= NOT | AND | OR

Weitere Informationen zu Operatoren finden Sie unter Ausdrücke.

Bemerkungen

Kommentare können in SQL-Skripten, SQL-Anweisungen und PSQL-Modulen vorhanden sein.Ein Kommentar kann ein beliebiger Text sein, der vom Code-Autor angegeben wird und normalerweise verwendet wird, um zu dokumentieren, wie bestimmte Teile des Codes funktionieren.Der Parser ignoriert den Text von Kommentaren.

Firebird unterstützt zwei Arten von Kommentaren: block und in-line.

Syntax
<comment> ::= <block comment> | <single-line comment>

<block comment> ::=
  /* <character>[<character> …] */

<single-line comment> ::=
  -- <character>[<character> …]<end line>

Blockkommentare beginnen mit dem Zeichenpaar /* und enden mit dem Zeichenpaar */.Text in Blockkommentaren kann beliebig lang sein und mehrere Zeilen belegen.

Inline-Kommentare beginnen mit einem Bindestrich-Paar -- und werden bis zum Ende der aktuellen Zeile fortgesetzt.

Beispiele
CREATE PROCEDURE P(APARAM INT)
  RETURNS (B INT)
AS
BEGIN
  /* This text will be ignored during the execution of the statement
     since it is a comment
  */
  B = A + 1; -- In-line comment
  SUSPEND;
END