Die folgenden SQL-Syntaxbeispiele werden von der SQL-Datenbankengine in Adobe AIR unterstützt. Die Beispiele sind in verschiedene Anweisungs- und Klauseltypen, Ausdrücke, integrierte Funktionen und Operatoren unterteilt. Es werden die folgenden Themen behandelt:
-
Allgemeine SQL-Syntax
-
Datenbearbeitungsanweisungen (SELECT, INSERT, UPDATE und DELETE)
-
Datendefinitionsanweisungen (CREATE-, ALTER- und DROP-Anweisungen für Tabellen, Indizes, Ansichten und Auslöser)
-
Spezielle Anweisungen und Klauseln
-
Integrierte Funktionen (Aggregations-, Skalar- und Datums-/Uhrzeitformat-Funktionen)
-
Operatoren
-
Parameter
-
Nicht unterstützte SQL-Funktionen
-
Zusätzliche SQL-Funktionen
Allgemeine SQL-Syntax
Zusätzlich zu der spezifischen Syntax für verschiedene Anweisungen und Ausdrücke gelten folgende allgemeine Regeln der SQL-Syntax:
-
Groß-/Kleinschreibung
-
Die Groß- und Kleinschreibung ist bei SQL-Anweisungen, einschließlich der Objektnamen, nicht wichtig. Allerdings werden SQL-Schlüsselwörter in SQL-Anweisungen häufig in Großbuchstaben geschrieben. Auch im vorliegenden Dokument wird diese Konvention beachtet. Während die Groß- und Kleinschreibung in der SQL-Syntax nicht beachtet werden muss, ist dies bei literalen Textwerten in SQL der Fall. Bei Vergleich- und Sortieroperationen kann die Groß-/Kleinschreibung eine Rolle spielen, wenn dies von der für eine Spalte oder einen Vorgang definierten Überprüfungssequenz so angegeben ist. Weitere Informationen finden Sie unter COLLATE.
-
Leerraum
-
Einzelne Wörter in einer SQL-Anweisung müssen durch ein Leerraumzeichen (ein Leerzeichen, ein Tabulatorzeichen, eine neue Zeile usw.) getrennt sein. Zwischen Wörtern und Symbolen ist die Verwendung von Leerraum jedoch optional. Art und Anzahl der Leerraumzeichen ist in SQL-Anweisungen nicht relevant. Sie können SQL-Anweisungen mit Leerraumzeichen, zum Beispiel Einzügen und Zeilenumbrüchen, formatieren, um die Lesbarkeit zu verbessern. Die Bedeutung der Anweisung wird dadurch nicht geändert.
Datenbearbeitungsanweisungen
Anweisungen zur Bearbeitung von Daten gehören zu den am häufigsten verwendeten SQL-Anweisungen. Mit diesen Anweisungen werden Daten in Datenbanktabellen abgerufen, hinzugefügt, geändert und entfernt. Die folgenden Datenbearbeitungsanweisungen werden unterstützt: SELECT, INSERT, UPDATE und DELETE.
SELECT
Die SELECT-Anweisung wird zum Abfragen der Datenbank verwendet. Das Ergebnis von SELECT sind null oder mehr Datenzeilen, wobei jede Zeile eine feste Anzahl Spalten enthält. Die Anzahl der Spalten im Ergebnis wird vom result-Spaltennamen oder von der Ausdruckliste zwischen den Schlüsselwörtern SELECT und optional FROM angegeben.
sql-statement ::= SELECT [ALL | DISTINCT] result
[FROM table-list]
[WHERE expr]
[GROUP BY expr-list]
[HAVING expr]
[compound-op select-statement]*
[ORDER BY sort-expr-list]
[LIMIT integer [( OFFSET | , ) integer]]
result ::= result-column [, result-column]*
result-column ::= * | table-name . * | expr [[AS] string]
table-list ::= table [ join-op table join-args ]*
table ::= table-name [AS alias] |
( select ) [AS alias]
join-op ::= , | [NATURAL] [LEFT | RIGHT | FULL] [OUTER | INNER | CROSS] JOIN
join-args ::= [ON expr] [USING ( id-list )]
compound-op ::= UNION | UNION ALL | INTERSECT | EXCEPT
sort-expr-list ::= expr [sort-order] [, expr [sort-order]]*
sort-order ::= [COLLATE collation-name] [ASC | DESC]
collation-name ::= BINARY | NOCASE
Jeder beliebige Ausdruck kann als Ergebnis verwendet werden. Wenn ein Ergebnisausdruck * ist, werden alle Spalten aller Tabellen für diesen Ausdruck eingesetzt. Wenn der Ausdruck der Name einer Tabelle gefolgt von einem .* ist, besteht das Ergebnis aus allen Spalten in dieser Tabelle.
Das Schlüsselwort DISTINCT führt dazu, dass ein Teilsatz von Ergebniszeilen zurückgegeben wird, in dem sich alle Ergebniszeilen unterscheiden. NULL-Werte werden nicht als verschieden voneinander behandelt. Das Standardverhalten ist, dass alle Ergebniszeilen zurückgegeben werden, was durch das Schlüsselwort ALL ausgedrückt werden kann.
Die Abfrage wird für eine oder mehrere Tabellen ausgeführt, die nach dem Schlüsselwort FROM angegeben sind. Wenn mehrere Tabellennamen durch Kommas getrennt sind, verwendet die Abfrage den Kreuzverbund der einzelnen Tabellen. Mit der JOIN-Syntax kann auch angegeben werden, wie Tabellen verbunden sind. Die einzige Art eines äußeren Verbunds, der unterstützt wird, ist LEFT OUTER JOIN. Der ON-Klauselausdruck in join-args muss in einen booleschen Wert aufgelöst werden. Eine Unterabfrage in Klammern kann als Tabelle in der FROM-Klausel verwendet werden. Die gesamte FROM-Klausel kann ausgelassen werden. In diesem Fall ist das Ergebnis eine einzelne Zeile, die aus den Werten der result-Ausdruckliste besteht.
Die WHERE-Klausel wird verwendet, um die Anzahl der Zeilen zu beschränken, die die Abfrage abruft. WHERE-Klauselausdrücke müssen in einen booleschen Wert aufgelöst werden. Die WHERE-Klauselfilterung wird vor jeglicher Gruppierung ausgeführt. Deshalb können WHERE-Klauselausdrücke keine Aggregationsfunktionen enthalten.
Die GROUP BY-Klausel führt dazu, dass eine oder mehrere Zeilen des Ergebnisses in einer einzelnen Ausgabezeile zusammengefasst werden. Eine GROUP BY-Klausel ist besonders hilfreich, wenn das Ergebnis Aggregationsfunktionen enthält. Die Ausdrücke in der GROUP BY-Klausel brauchen keine Ausdrücke zu sein, die in der SELECT-Ausdruckliste aufgeführt sind.
Die HAVING-Klausel ähnelt WHERE insofern, dass sie die von der Anweisung zurückgegebenen Zeilen beschränkt. Die HAVING-Klausel wird jedoch angewendet, nachdem jegliche von einer GROUP BY-Klausel angegebene Gruppierung ausgeführt wurde. Demzufolge kann der HAVING-Ausdruck auf Werte verweisen, die Aggregationsfunktionen enthalten. Ein HAVING-Klauselausdruck muss nicht in der SELECT-Liste aufgeführt sein. Wie ein WHERE-Ausdruck muss ein HAVING-Ausdruck in einen booleschen Wert aufgelöst werden.
Die ORDER BY-Klausel führt dazu, dass die Ausgabezeilen sortiert werden. Das sort-expr-list-Argument für die ORDER BY-Klausel ist eine Liste von Ausdrücken, die als Schlüssel für die Sortierung verwendet werden. Die Ausdrücke müssen für eine einfache SELECT-Anweisung nicht Teil des Ergebnisses sein, aber in einer zusammengesetzten SELECT-Abfrage (eine SELECT-Abfrage, die einen der compound-op-Operatoren verwendet) muss jeder Sortierausdruck genau mit einer der Ergebnisspalten übereinstimmen. Jeder Sortierausdruck kann optional von einer sort-order-Klausel gefolgt werden, die aus dem Schlüsselwort COLLATE und dem Namen einer Überprüfungsfunktion besteht, die zur Sortierung von Text verwendet wird, und/oder dem Schlüsselwort ASC oder DESC, um die Sortierreihenfolge festzulegen (aufsteigend und absteigend). Wenn die sort-order-Klausel ausgelassen wird, wird die standardmäßige aufsteigende Reihenfolge verwendet. Eine Definition der COLLATE-Klausel und der Überprüfungsfunktionen finden Sie unter COLLATE.
Die LIMIT-Klausel gib eine obere Grenze für die Anzahl der im Ergebnis zurückgegebenen Zeilen zurück. Eine negative LIMIT-Klausel gibt an, dass es keine obere Grenze gibt. Der optional verwendete OFFSET hinter LIMIT legt fest, wie viele Zeilen am Anfang des Ergebnissatzes übersprungen werden. In einer zusammengesetzten SELECT-Abfrage kann die LIMIT-Klausel nur nach der letzten SELECT-Anweisung vorkommen und das Limit wird auf die gesamte Abfrage angewendet. Beachten Sie, dass bei Verwendung des OFFSET-Schlüsselwortes in der LIMIT-Klausel die erste Ganzzahl das Limit und die zweite Ganzzahl der Versatz ist. Wenn anstelle des OFFSET-Schlüsselwortes ein Komma verwendet wird, ist die erste Ganzzahl der Versatz und die zweite Ganzzahl das Limit. Dies mag widersprüchlich erscheinen, ist jedoch beabsichtigt, da so die Kompatibilität mit älteren SQL-Datenbanksystemen verbessert wird.
Eine zusammengesetzte SELECT-Abfrage wird aus zwei oder mehr einfachen SELECT-Anweisungen gebildet, die durch einen der Operatoren UNION, UNION ALL, INTERSECT oder EXCEPT verbunden sind. In einer zusammengesetzten SELECT-Abfrage müssen alle darin enthaltenen SELECT-Anweisungen dieselbe Anzahl von Ergebnisspalten angeben. Es kann nur eine einzelne ORDER BY-Klausel nach der letzten SELECT-Anweisung geben (und vor der einzigen LIMIT-Klausel, falls eine angegeben wird). Die Operatoren UNION und UNION ALL verbinden die Ergebnisse der vorstehenden und folgenden SELECT-Anweisungen in einer Tabelle. Der Unterschied liegt darin, dass mit UNION alle Ergebniszeilen eindeutig sind, mit UNION ALL können sie jedoch doppelt auftreten. Der INTERSECT-Operator nimmt den Schnittpunkt der Ergebnisse der vorstehenden und der folgenden SELECT-Anweisungen. EXCEPT nimmt das Ergebnis der vorstehenden SELECT-Anweisung, nachdem die Ergebnisse der folgenden SELECT-Anweisung entfernt wurden. Wenn drei oder mehr SELECT-Anweisungen zu einer zusammengesetzten Anweisung verbunden werden, werden sie von der ersten zur letzten gruppiert.
Eine Definition erlaubter Ausdrücke finden Sie unter „Ausdrücke“.
Ab AIR 2.5 wird der SQL-CAST-Operator beim Lesen unterstützt, um BLOB-Daten in ByteArray-Objekte in ActionScript zu konvertieren. Der folgende Code liest beispielsweise unformatierte Daten, die nicht im AMF-Format gespeichert sind, und speichert sie in einem ByteArray-Objekt:
stmt.text = "SELECT CAST(data AS ByteArray) AS data FROM pictures;";
stmt.execute();
var result:SQLResult = stmt.getResult();
var bytes:ByteArray = result.data[0].data;
INSERT
Die INSERT-Anweisung gibt es in zwei grundlegenden Formen. Mit dieser Anweisung werden Tabellen mit Daten gefüllt.
sql-statement ::= INSERT [OR conflict-algorithm] INTO [database-name.] table-name [(column-list)] VALUES (value-list) |
INSERT [OR conflict-algorithm] INTO [database-name.] table-name [(column-list)] select-statement
REPLACE INTO [database-name.] table-name [(column-list)] VALUES (value-list) |
REPLACE INTO [database-name.] table-name [(column-list)] select-statement
Die erste Form (mit dem VALUES-Schlüsselwort) erstellt eine einzelne neue Zeile in einer vorhandenen Tabelle. Wenn keine column-list angegeben wird, muss die Anzahl der Werte mit der Anzahl der Spalten in der Tabelle übereinstimmen. Wenn eine column-list angegeben wird, muss die Anzahl der Werte mit der Anzahl der angegebenen Spalten übereinstimmen. Tabellenspalten, die nicht in der Spaltenliste aufgeführt sind, werden mit dem Standardwert gefüllt, der beim Erstellen der Tabelle definiert wurde, oder mit NULL, wenn kein Standardwert definiert wurde.
Die zweite Form der INSERT-Anweisung nimmt die Daten aus einer SELECT-Anweisung. Die Anzahl der Spalten im Ergebnis der SELECT-Abfrage muss genau mit der Anzahl der Spalten in der Tabelle übereinstimmen, wenn column-list nicht angegeben wurde, oder sie muss mit der Anzahl der in column-list genannten Spalten übereinstimmen. Für jede neue Zeile im SELECT-Ergebnis erfolgt ein neuer Eintrag in der Tabelle. Die SELECT-Anweisung kann einfach oder zusammengesetzt sein. Eine Definition zulässiger SELECT-Anweisungen finden Sie unter SELECT.
Der optionale conflict-algorithm ermöglicht die Angabe eines alternativen Algorithmus zur Auflösung von Beschränkungskonflikten, der während dieses einen Befehls verwendet wird. Eine Erläuterung und eine Definition der Konfliktalgorithmen finden Sie unter
Spezielle Anweisungen und Klauseln
.
Die beiden REPLACE INTO-Formen der Anweisung entsprechen der Verwendung der standardmäßigen INSERT [OR conflict-algorithm]-Form mit dem REPLACE-Konfliktalgorithmus (d. h. INSERT OR REPLACE...-Form).
Die beiden REPLACE INTO-Formen der Anweisung entsprechen der Verwendung der standardmäßigen INSERT [OR conflict-algorithm]-Form mit dem REPLACE-Konfliktalgorithmus (d. h. INSERT OR REPLACE...-Form).
UPDATE
Der update-Befehl ändert vorhandene Datensätze in einer Tabelle.
sql-statement ::= UPDATE [database-name.] table-name SET column1=value1, column2=value2,... [WHERE expr]
Der Befehl besteht aus dem UPDATE-Schlüsselwort gefolgt von dem Namen der Tabelle, in der Sie Datensätze aktualisieren möchten. Geben Sie nach dem SET-Schlüsselwort den Namen der Spalte und den Wert, in den die Spalte geändert werden soll, in einer Liste mit Kommas als Trennzeichen an. Der WHERE-Klauselausdruck gibt die Zeilen an, in denen die Datensätze aktualisiert werden.
DELETE
Der delete-Befehl wird verwendet, um Datensätze aus einer Tabelle zu entfernen.
sql-statement ::= DELETE FROM [database-name.] table-name [WHERE expr]
Der Befehl besteht aus dem DELETE FROM-Schlüsselwort gefolgt vom Namen der Tabelle, aus der Datensätze entfernt werden sollen.
Ohne eine WHERE-Klausel werden alle Zeilen der Tabelle entfernt. Wenn eine WHERE-Klausel angegeben wird, werden nur die Zeilen entfernt, auf die der Ausdruck zutrifft. Der WHERE-Klauselausdruck muss in einen booleschen Wert aufgelöst werden. Eine Definition erlaubter Ausdrücke finden Sie unter „Ausdrücke“.
Datendefinitionsanweisungen
Anweisungen zur Datendefinition werden verwendet, um Datenbankobjekte wie Tabellen, Ansichten, Indizes und Auslöser zu erstellen, zu ändern und zu entfernen. Die folgenden Anweisungen zur Datendefinition werden unterstützt:
-
Tabellen:
-
CREATE TABLE
-
ALTER TABLE
-
DROP TABLE
-
-
-
Auslöser:
-
CREATE TRIGGERS
-
DROP TRIGGERS
CREATE TABLE
Eine CREATE TABLE-Anweisung besteht aus dem CREATE TABLE-Schlüsselwort gefolgt vom Namen der neuen Tabelle und einer Liste von Spaltendefinitionen und -beschränkungen (in Klammern). Der Tabellenname kann ein Bezeichner oder ein String sein.
sql-statement ::= CREATE [TEMP | TEMPORARY] TABLE [IF NOT EXISTS] [database-name.] table-name
( column-def [, column-def]* [, constraint]* )
sql-statement ::= CREATE [TEMP | TEMPORARY] TABLE [database-name.] table-name AS select-statement
column-def ::= name [type] [[CONSTRAINT name] column-constraint]*
type ::= typename | typename ( number ) | typename ( number , number )
column-constraint ::= NOT NULL [ conflict-clause ] |
PRIMARY KEY [sort-order] [ conflict-clause ] [AUTOINCREMENT] |
UNIQUE [conflict-clause] |
CHECK ( expr ) |
DEFAULT default-value |
COLLATE collation-name
constraint ::= PRIMARY KEY ( column-list ) [conflict-clause] |
UNIQUE ( column-list ) [conflict-clause] |
CHECK ( expr )
conflict-clause ::= ON CONFLICT conflict-algorithm
conflict-algorithm ::= ROLLBACK | ABORT | FAIL | IGNORE | REPLACE
default-value ::= NULL | string | number | CURRENT_TIME | CURRENT_DATE | CURRENT_TIMESTAMP
sort-order ::= ASC | DESC
collation-name ::= BINARY | NOCASE
column-list ::= column-name [, column-name]*
Jede Spaltendefinition ist der Name der Spalte gefolgt vom Datentyp für diese Spalte, danach ein oder mehrere optionale Spaltenbeschränkungen. Der Datentyp für die Spalte bestimmt, welche Daten in dieser Spalte gespeichert werden können. Wird versucht, einen Wert in einer Spalte mit einem anderen Datentyp zu speichern, konvertiert die Laufzeitumgebung den Wert in den geeigneten Typ, falls möglich, oder gibt einen Fehler aus. Weitere Informationen finden Sie unter „Unterstützte Datentypen“.
Die NOT NULL-Spaltenbeschränkung gibt an, dass die Spalte keine NULL-Werte enthalten darf.
Eine UNIQUE-Beschränkung führt dazu, dass eine Indexposition für die angegebene(n) Spalte(n) erstellt wird. Dieser Index muss eindeutige Schlüssel enthalten, das heißt, zwei Zeilen dürfen nicht doppelte Werte oder Wertkombinationen für die angegebene(n) Spalte(n) enthalten. Eine CREATE TABLE-Anweisung kann über mehrere UNIQUE-Beschränkungen verfügen, darunter mehrere Spalten mit einer UNIQUE-Beschränkung in der Spaltendefinition und/oder mehrere UNIQUE-Beschränkungen auf Tabellenebene.
Eine CHECK-Beschränkung definiert einen Ausdruck, der evaluiert wird und „true“ sein muss, damit die Daten einer Zeile eingefügt oder aktualisiert werden. Der CHECK-Ausdruck muss in einen booleschen Wert aufgelöst werden.
Eine COLLATE-Klausel in einer Spaltendefinition gibt an, welche Textüberprüfungsfunktion verwendet wird, wenn Texteinträge für die Spalte verglichen werden. Standardmäßig wird die BINARY-Überprüfungsfunktion verwendet. Ausführliche Informationen zur COLLATE-Klausel und zu Überprüfungsfunktionen finden Sie unter COLLATE.
Die DEFAULT-Beschränkung definiert einen Standardwert, der beim Ausführen von INSERT verwendet wird. Der Wert kann NULL, eine Stringkonstante oder eine Zahl sein. Der Standardwert kann auch eines der speziellen Schlüsselwörter sein, bei denen die Groß- und Kleinschreibung keine Rolle spielt: CURRENT_TIME, CURRENT_DATE oder CURRENT_TIMESTAMP. Wenn der Wert NULL, eine Stringkonstante oder eine Zahl ist, wird er in die Spalte eingefügt, wenn eine INSERT-Anweisung keinen Wert für die Spalte angibt. Wenn der Wert CURRENT_TIME, CURRENT_DATE oder CURRENT_TIMESTAMP ist, wird das aktuelle Datum und/oder die aktuelle Uhrzeit im UTC-Format in die Spalte eingefügt. Für CURRENT_TIME lautet das Format HH:MM:SS. Für CURRENT_DATE lautet das Format YYYY-MM-DD. Das Format für CURRENT_TIMESTAMP ist YYYY-MM-DD HH:MM:SS.
Durch die Angabe eines PRIMARY KEY wird normalerweise lediglich eine UNIQUE-Indexposition für die entsprechende(n) Spalte(n) erstellt. Wenn die PRIMARY KEY-Beschränkung jedoch für eine einzelne Spalte gilt, die den INTEGER-Datentyp (oder eines seiner Synonyme, wie z. B. int) aufweist, wird diese Spalte intern als eigentlicher Primärschlüssel für die Tabelle verwendet. Dies bedeutet, dass die Spalte nur eindeutige Ganzzahlwerte enthalten kann. (Beachten Sie, dass bei zahlreichen SQLite-Implementierungen nur der INTEGER-Spaltentyp dafür verantwortlich ist, dass die Spalte der interne Primärschlüssel ist, dass in Adobe AIR dieses Verhalten jedoch auch durch Synonyme von INTEGER, wie z. B. int, festgelegt wird.)
Wenn eine Tabelle keine INTEGER PRIMARY KEY-Spalte hat, wird automatisch ein Ganzzahlschlüssel generiert, wenn eine Zeile eingefügt wird. Auf den Primärschlüssel für eine Zeile kann immer mit einem der speziellen Namen ROWID, OID oder _ROWID_ zugegriffen werden. Diese Namen können verwendet werden unabhängig davon, ob es sich um einen ausdrücklich deklarierten INTEGER PRIMARY KEY oder einen intern generierten Wert handelt. Wenn die Tabelle jedoch über einen ausdrücklichen INTEGER PRIMARY KEY verfügt, ist der Name der Spalte in den Ergebnisdaten der tatsächliche Spaltenname, nicht der spezielle Name.
Eine INTEGER PRIMARY KEY-Spalte kann auch das AUTOINCREMENT-Schlüsselwort enthalten. Wenn das AUTOINCREMENT-Schlüsselwort verwendet wird, generiert die Datenbank automatisch einen fortlaufend inkrementierten Ganzzahlschlüssel und fügt ihn in die INTEGER PRIMARY KEY-Spalte ein, wenn eine INSERT-Anweisung keinen ausdrücklichen Wert für die Spalte festlegt.
Es kann nur eine PRIMARY KEY-Beschränkung in einer CREATE TABLE-Anweisung geben. Es kann sich um einen Teil einer Spaltendefinition handeln oder um eine PRIMARY KEY-Beschränkung auf Tabellenebene. Ein Primärschlüssel ist implizit NOT NULL.
Die optionale conflict-clause, die vielen Beschränkungen nachgestellt ist, ermöglicht die Angabe eines alternativen Algorithmus für die Auflösung von Beschränkungskonflikten für diese Beschränkung. Der Standardwert lautet ABORT. Unterschiedliche Beschränkungen innerhalb derselben Tabelle können unterschiedliche Algorithmen für die Konfliktauflösung aufweisen. Wenn eine INSERT- oder UPDATE-Anweisung einen anderen Algorithmus für die Konfliktauflösung angibt, wird dieser Algorithmus anstelle des in der CREATE TABLE-Anweisung angegebenen Algorithmus verwendet. Weitere Informationen finden Sie im Abschnitt zu ON CONFLICT unter
Spezielle Anweisungen und Klauseln
.
Zusätzliche Beschränkungen, zum Beispiel FOREIGN KEY-Beschränkungen, führen zwar nicht zu einem Fehler, werden in der Laufzeitumgebung jedoch ignoriert.
Wenn das TEMP- oder TEMPORARY-Schlüsselwort zwischen CREATE und TABLE vorkommt, ist die erstellte Tabelle nur innerhalb derselben Datenbankverbindung (SQLConnection-Instanz) sichtbar. Sie wird automatisch gelöscht, wenn die Datenbankverbindung beendet wird. Alle Indizes, die für eine temporäre Tabelle erstellt werden, sind ebenfalls temporär. Temporäre Tabellen und Indizes werden in einer separaten Datei gespeichert, die sich von der Hauptdatenbankdatei unterscheidet.
Wenn das optionale database-name-Präfix angegeben wird, wird die Tabelle in einer genannten Datenbank erstellt. (Eine Datenbank, die mit der SQLConnection-Instanz verbunden wurde, indem die attach()-Methode mit dem angegebenen Datenbanknamen aufgerufen wurde.) Es ist ein Fehler, sowohl das database-name-Präfix als auch das TEMP-Schlüsselwort anzugeben, es sei denn, das database-name-Präfix lautet „temp“. Wenn keine Datenbank angegeben wird und das TEMP-Schlüsselwort nicht vorhanden ist, wird die Tabelle in der Hauptdatenbank erstellt. (Dies ist die Datenbank, die über die open()- oder openAsync()-Methode mit der SQLConnection-Instanz verbunden wurde.)
Es gibt keine willkürlichen Grenzen für die Anzahl der Spalten oder die Anzahl der Beschränkungen in einer Tabelle. Auch die Datenmenge in einer Zeile ist nicht willkürlich begrenzt.
Die CREATE TABLE AS-Form definiert die Tabelle als Ergebnissatz einer Abfrage. Die Namen der Tabellenspalten sind die Namen der Spalten im Ergebnis.
Wenn die optionale IF NOT EXISTS-Klausel vorhanden ist und eine andere Tabelle mit demselben Namen bereits existiert, ignoriert die Datenbank den CREATE TABLE-Befehl.
Eine Tabelle kann mit der DROP TABLE-Anweisung entfernt werden und begrenzte Änderungen sind mit der ALTER TABLE-Anweisung möglich.
ALTER TABLE
Der ALTER TABLE-Befehl ermöglicht es dem Benutzer, eine vorhandene Tabelle umzubenennen oder ihr eine neue Spalte hinzuzufügen. Es ist nicht möglich, eine Spalte aus einer Tabelle zu entfernen.
sql-statement ::= ALTER TABLE [database-name.] table-name alteration
alteration ::= RENAME TO new-table-name
alteration ::= ADD [COLUMN] column-def
Die RENAME TO-Syntax wird verwendet, um die durch [database-name.] table-name angegebene Tabelle in new-table-name umzubenennen. Mit diesem Befehl kann eine Tabelle nicht zwischen verbundenen Datenbanken verschoben werden. Es ist nur möglich, eine Tabelle innerhalb derselben Datenbank umzubenennen.
Wenn die umbenannte Tabelle Auslöser oder Indizes aufweist, bleiben diese auch nach der Umbenennung mit der Tabelle verbunden. Gibt es jedoch Ansichtsdefinitionen oder Anweisungen, die von Auslösern ausgeführt werden, die sich auf die umbenannte Tabelle beziehen, werden diese nicht automatisch so geändert, dass sie den neuen Tabellennamen verwenden. Wenn mit einer umbenannten Tabelle Ansichten oder Auslöser verknüpft sind, müssen Sie die Auslöser oder Ansichtsdefinitionen entfernen und unter Verwendung des neuen Tabellennamens neu erstellen.
Mit der ADD [COLUMN]-Syntax wird einer vorhandenen Tabelle eine neue Spalte hinzugefügt. Die neue Spalte wird immer an das Ende der Liste vorhandener Spalten angehängt. Die column-def-Klausel kann jede beliebige Form annehmen, die in einer CREATE TABLE-Anweisung zulässig ist. Dabei gelten die folgenden Einschränkungen:
-
Die Spalte darf keine PRIMARY KEY- oder UNIQUE-Beschränkung aufweisen.
-
Die Spalte darf keinen Standardwert von CURRENT_TIME, CURRENT_DATE oder CURRENT_TIMESTAMP aufweisen.
-
Wenn eine NOT NULL-Beschränkung angegeben ist, muss die Spalte einen anderen Standardwert als NULL haben.
Die Ausführungszeit der ALTER TABLE-Anweisung wird von der Datenmenge in der Tabelle nicht beeinflusst.
DROP TABLE
Die DROP TABLE-Anweisung entfernt eine Tabelle, die mit einer CREATE TABLE-Anweisung erstellt wurde. Die Tabelle mit dem angegebenen table-name ist die Tabelle, die entfernt wird. Sie wird vollständig aus der Datenbank und aus der Festplattendatei entfernt. Die Tabelle kann nicht wiederhergestellt werden. Alle der Tabelle zugewiesenen Indizes werden ebenfalls gelöscht.
sql-statement ::= DROP TABLE [IF EXISTS] [database-name.] table-name
Standardmäßig verringert die DROP TABLE-Anweisung nicht die Größe der Datenbankdatei. Leerer Speicherplatz in der Datenbank wird beibehalten und in nachfolgenden INSERT-Vorgängen verwendet. Mit der SQLConnection.clean()-Methode können Sie Speicherplatz in der Datenbank freigeben. Wenn der autoClean-Parameter beim Erstellen der Datenbank mit dem Wert „true“ belegt wurde, wird der Speicherplatz automatisch freigegeben.
Die optionale IF EXISTS-Klausel unterdrückt den Fehler, der normalerweise ausgegeben wird, wenn die Tabelle nicht vorhanden ist.
CREATE INDEX
Der CREATE INDEX-Befehl besteht aus den CREATE INDEX-Schlüsselwörtern gefolgt von dem Namen des neuen Index, dem ON-Schlüsselwort, dem Namen einer zuvor erstellten Tabelle, die indiziert werden soll, und einer Liste in Klammern, in der die Namen der Tabellenspalten aufgeführt sind, die für den Indexschlüssel verwendet werden sollen.
sql-statement ::= CREATE [UNIQUE] INDEX [IF NOT EXISTS] [database-name.] index-name
ON table-name ( column-name [, column-name]* )
column-name ::= name [COLLATE collation-name] [ASC | DESC]
Jedem Spaltennamen kann das ASC- oder DESC-Schlüsselwort folgen, um die Sortierreihenfolge anzugeben, die von der Laufzeitumgebung jedoch ignoriert wird. Die Sortierung erfolgt immer in aufsteigender Reihenfolge.
Die COLLATE-Klausel, die jedem Spaltennamen nachgestellt ist, definiert eine Überprüfungssequenz, die für Textwerte in den Spalten verwendet wird. Die Standardüberprüfungssequenz ist die, die für diese Spalte in der CREATE TABLE-Anweisung definiert ist. Wenn keine Überprüfungssequenz angegeben wurde, wird BINARY verwendet. Eine Definition der COLLATE-Klausel und der Überprüfungsfunktionen finden Sie unter COLLATE.
Es gibt keine willkürlichen Grenzen für die Anzahl der Indizes, die einer einzelnen Tabelle zugeordnet werden können. Auch für die Anzahl der Spalten in einer Indexposition gibt es keine Grenzen.
DROP INDEX
Die drop index-Anweisung entfernt einen Index, der mit der CREATE INDEX-Anweisung hinzugefügt wurde. Die angegebene Indexposition wird vollständig aus der Datenbankdatei entfernt. Die Indexposition kann nur wiederhergestellt werden, indem der entsprechende CREATE INDEX-Befehl erneut eingegeben wird.
sql-statement ::= DROP INDEX [IF EXISTS] [database-name.] index-name
Standardmäßig verringert die DROP INDEX-Anweisung nicht die Größe der Datenbankdatei. Leerer Speicherplatz in der Datenbank wird beibehalten und in nachfolgenden INSERT-Vorgängen verwendet. Mit der SQLConnection.clean()-Methode können Sie Speicherplatz in der Datenbank freigeben. Wenn der autoClean-Parameter beim Erstellen der Datenbank mit dem Wert „true“ belegt wurde, wird der Speicherplatz automatisch freigegeben.
CREATE VIEW
Der CREATE VIEW-Befehl weist einer vordefinierten SELECT-Anweisung einen Namen zu. Dieser neue Name kann dann in einer FROM-Klausel einer anderen SELECT-Anweisung anstelle des Tabellennamens verwendet werden. Ansichten werden häufig zur Vereinfachung von Abfragen verwendet, indem ein komplexer (und häufig verwendeter) Satz von Daten in einer Struktur kombiniert wird, die in anderen Operationen verwendet werden kann.
sql-statement ::= CREATE [TEMP | TEMPORARY] VIEW [IF NOT EXISTS] [database-name.] view-name AS select-statement
Wenn das TEMP- oder TEMPORARY-Schlüsselwort zwischen CREATE und VIEW auftritt, ist die erstellte Ansicht nur für die SQLConnection-Instanz sichtbar, die die Datenbank geöffnet hat, und sie wird automatisch gelöscht, wenn die Datenbank geschlossen wird.
Wenn ein [database-name] angegeben wird, wird die Ansicht in der genannten Datenbank erstellt (eine Datenbank, die unter Verwendung der attach()-Methode mit dem angegebenen name-Argument mit der SQLConnection-Instanz verbunden wurde. Es ist ein Fehler, sowohl [database-name] als auch das TEMP-Schlüsselwort anzugeben, es sei denn, [database-name] lautet „temp“. Wenn keine Datenbank angegeben wird und das TEMP-Schlüsselwort nicht vorhanden ist, wird die Ansicht in der Hauptdatenbank erstellt. (Dies ist die Datenbank, die über die open()- oder openAsync()-Methode mit der SQLConnection-Instanz verbunden wurde.)
Ansichten sind schreibgeschützt. Eine DELETE-, INSERT- oder UPDATE-Anweisung kann nicht für eine Ansicht verwendet werden, es sei denn, es wurde mindestens ein Auslöser des zugeordneten Typs (INSTEAD OF DELETE, INSTEAD OF INSERT, INSTEAD OF UPDATE) definiert. Informationen zum Erstellen eines Auslösers für eine Ansicht finden Sie unter CREATE TRIGGER.
Eine Ansicht kann mit der DROP VIEW-Anweisung aus einer Datenbank entfernt werden.
DROP VIEW
Die DROP VIEW-Anweisung entfernt eine Ansicht, die mit einer CREATE VIEW-Anweisung erstellt wurde.
sql-statement ::= DROP VIEW [IF EXISTS] view-name
Der angegebene view-name ist der Name der zu entfernenden Ansicht. Sie wird aus der Datenbank entfernt, die Daten in den zugrundeliegenden Tabellen werden jedoch nicht geändert.
CREATE TRIGGER
Die create trigger-Anweisung wird verwendet, um dem Datenbankschema Auslöser hinzuzufügen. Ein Auslöser ist eine Datenbankoperation (trigger-action), die automatisch ausgeführt wird, wenn ein angegebenes Datenbankereignis (database-event) auftritt.
sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER [IF NOT EXISTS] [database-name.] trigger-name
[BEFORE | AFTER] database-event
ON table-name
trigger-action
sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER [IF NOT EXISTS] [database-name.] trigger-name
INSTEAD OF database-event
ON view-name
trigger-action
database-event ::= DELETE |
INSERT |
UPDATE |
UPDATE OF column-list
trigger-action ::= [FOR EACH ROW] [WHEN expr]
BEGIN
trigger-step ;
[ trigger-step ; ]*
END
trigger-step ::= update-statement |
insert-statement |
delete-statement |
select-statement
column-list ::= column-name [, column-name]*
Ein Auslöser wird ausgelöst, wenn eine DELETE-, INSERT- oder UPDATE-Anweisung einer bestimmten Datenbanktabelle auftritt oder wenn eine UPDATE-Anweisung von einer oder mehreren angegebenen Spalten einer Tabelle aktualisiert wird. Auslöser sind dauerhaft, sofern nicht das TEMP- oder TEMPORARY-Schlüsselwort verwendet wird. In diesem Fall wird der Auslöser entfernt, wenn die Hauptdatenbankverbindung der SQLConnection-Instanz geschlossen wird. Wenn kein Timing angegeben wird (BEFORE oder AFTER), wird standardmäßig BEFORE für den Auslöser verwendet.
Es werden nur FOR EACH ROW-Auslöser unterstützt, der Text FOR EACH ROW ist deshalb optional. Mit einem FOR EACH ROW-Auslöser werden die trigger-step-Anweisungen für jede Datenbankzeile ausgeführt, die von der Anweisung, die den Auslöser auslöst, eingefügt, aktualisiert oder gelöscht wird, wenn der WHEN-Klauselausdruck zu „true“ evaluiert wird.
Wenn eine WHEN-Klausel angegeben wird, werden die als Auslöserschritte angegebenen SQL-Anweisungen nur für Zeilen ausgeführt, für die die WHEN-Klausel mit „true“ belegt ist. Wenn keine WHEN-Klausel angegeben ist, werden die SQL-Anweisungen für alle Zeilen ausgeführt.
Im Hauptteil eines Auslösers (trigger-action-Klausel) sind die Werte der betroffenen Tabelle vor und nach der Änderung verfügbar, wenn die speziellen Tabellennamen OLD und NEW verwendet werden. Die Struktur der OLD- und NEW-Tabellen stimmt mit der Struktur der Tabelle überein, für die der Auslöser erstellt wurde. Die OLD-Tabelle enthält alle Zeilen, die von der auslösenden Anweisung geändert oder gelöscht wurden, in ihrem Zustand vor den Operationen der auslösenden Anweisung. Die NEW-Tabelle enthält alle Zeilen, die von der auslösenden Anweisung geändert oder erstellt wurden, in ihrem Zustand nach den Operationen der auslösenden Anweisung. Sowohl die WHEN-Klausel als auch die trigger-step-Anweisungen können auf Werte aus den eingefügten, gelöschten oder aktualisierten Zeilen zugreifen, indem Verweise in der Form NEW.column-name und OLD.column-name verwendet werden, wobei column-name der Name einer Spalte in der Tabelle ist, mit der der Auslöser verknüpft ist. Die Verfügbarkeit der OLD- und NEW-Tabellenverweise richtet sich nach dem database-event-Typ, den der Auslöser verarbeitet:
-
INSERT – NEW-Verweise sind gültig
-
UPDATE – NEW- und OLD-Verweise sind gültig
-
DELETE – OLD-Verweise sind gültig
Das angegebene Timing (BEFORE, AFTER oder INSTEAD OF) bestimmt, wann die trigger-step-Anweisungen in Relation zum Einfügen, Ändern oder Entfernen der zugeordneten Zeile ausgeführt werden. Eine ON CONFLICT-Klausel kann als Teil einer UPDATE- oder INSERT-Anweisung in einem trigger-step angegeben werden. Wenn jedoch eine ON CONFLICT-Klausel als Teil der Anweisung angegeben wird, die den Auslöser auslöst, wird stattdessen diese Konfliktverwaltungsrichtlinie verwendet.
Zusätzlich zu Tabellenauslösern kann in einer Ansicht ein INSTEAD OF-Auslöser erstellt werden. Wenn in einer Ansicht ein oder mehrere INSTEAD OF INSERT-, INSTEAD OF DELETE- oder INSTEAD OF UPDATE-Auslöser definiert sind, wird es nicht als Fehler betrachtet, den zugeordneten Anweisungstyp (INSERT, DELETE oder UPDATE) für die Ansicht auszuführen. In diesem Fall wird der zugeordnete Auslöser durch die Ausführung von INSERT, DELETE oder UPDATE für die Ansicht ausgelöst. Da es sich bei dem Auslöser um einen INSTEAD OF-Auslöser handelt, werden die der Ansicht zugrunde liegenden Tabellen nicht von der Anweisung geändert, die den Auslöser auslöst. Die Auslöser können jedoch verwendet werden, um Änderungen an den zugrunde liegenden Tabellen vorzunehmen.
Beim Erstellen eines Auslösers für eine Tabelle mit einer INTEGER PRIMARY KEY-Spalte ist ein wichtiger Punkt zu beachten. Wenn ein BEFORE-Auslöser die INTEGER PRIMARY KEY-Spalte einer Zeile ändert, die von der Anweisung aktualisiert werden soll, die den Auslöser auslöst, findet diese Aktualisierung nicht statt. Dies lässt sich umgehen, indem die Tabelle mit einer PRIMARY KEY-Spalte anstatt mit einer INTEGER PRIMARY KEY-Spalte erstellt wird.
Ein Auslöser kann mit der DROP TRIGGER-Anweisung entfernt werden. Wenn eine Tabelle oder Ansicht entfernt wird, werden automatisch auch alle Auslöser entfernt, die dieser Tabelle oder Ansicht zugeordnet sind.
RAISE()-Funktion
Die spezielle SQL-Funktion RAISE() kann in einer trigger-step-Anweisung eines Auslösers verwendet werden. Diese Funktion hat die folgende Syntax:
raise-function ::= RAISE ( ABORT, error-message ) |
RAISE ( FAIL, error-message ) |
RAISE ( ROLLBACK, error-message ) |
RAISE ( IGNORE )
Wenn während der Auslöserausführung eine der drei ersten Formen aufgerufen wird, wird die angegebene ON CONFLICT-Verarbeitungsaktion (ABORT, FAIL oder ROLLBACK) ausgeführt und die Ausführung der aktuellen Anweisung wird beendet. ROLLBACK wird als fehlgeschlagene Ausführung der Anweisung betrachtet. Deshalb löst die SQLStatement-Instanz, deren execute()-Methode ausgeführt wurde, ein error-Ereignis (SQLErrorEvent.ERROR) aus. Das SQLError-Objekt in der error-Eigenschaft des ausgelösten Ereignisobjekts hat für die details-Eigenschaft den Wert, der in der error-message eingestellt ist, die in der RAISE()-Funktion festgelegt ist.
Wenn RAISE(IGNORE) aufgerufen wird, werden der Rest des aktuellen Auslösers, die Anweisung, die die Ausführung des Auslösers ausgelöst hat, und alle nachfolgenden Auslöser, die ausgeführt würden, verworfen. Es werden keine Datenbankänderungen zurückgenommen. Wenn die Anweisung, die die Ausführung des Auslösers verursacht hat, selbst Teil eines Auslösers ist, nimmt dieses Auslöserprogramm seine Ausführung zu Beginn des nächsten Schritts wieder auf. Weitere Informationen zu den Algorithmen für die Konfliktauflösung finden Sie im Abschnitt ON CONFLICT (Konfliktalgorithmen).
DROP TRIGGER
Die DROP TRIGGER-Anweisung entfernt einen Auslöser, der von der CREATE TRIGGER-Anweisung erstellt wurde.
sql-statement ::= DROP TRIGGER [IF EXISTS] [database-name.] trigger-name
Der Auslöser wird aus der Datenbank entfernt. Beachten Sie, dass Auslöser automatisch entfernt werden, wenn die zugeordnete Tabelle entfernt wird.
Spezielle Anweisungen und Klauseln
In diesem Abschnitt werden verschiedene Klauseln beschrieben, die zur Laufzeit bereitgestellte SQL-Erweiterungen sind, sowie zwei Sprachelemente, die in vielen Anweisungen, Kommentaren und Ausdrücken verwendet werden können.
COLLATE
Die COLLATE-Klausel wird in SELECT-, CREATE TABLE- und CREATE INDEX-Anweisungen verwendet, um den Vergleichsalgorithmus anzugeben, der beim Vergleichen oder Sortieren von Werten verwendet wird.
sql-statement ::= COLLATE collation-name
collation-name ::= BINARY | NOCASE
Der Standardüberprüfungstyp für Spalten ist BINARY. Wenn die BINARY-Überprüfung mit Werten der TEXT-Speicherklasse verwendet wird, wird die binäre Überprüfung ausgeführt, indem die Bytes im Speicher verglichen werden, die den Wert repräsentieren, unabhängig von der Textkodierung.
Die NOCASE-Überprüfungssequenz wird nur für Werte der TEXT-Speicherklasse angewendet. Wenn sie verwendet wird, führt die NOCASE-Überprüfung einen Vergleich durch, bei dem die Groß- und Kleinschreibung nicht beachtet wird.
Für Speicherklassen des Typs NULL, BLOB, INTEGER und REAL wird keine Überprüfungssequenz verwendet.
Um einen anderen Überprüfungstyp als BINARY für eine Spalte zu verwenden, muss eine COLLATE-Klausel als Teil der Spaltendefinition in der CREATE TABLE-Anweisung angegeben werden. Wenn zwei TEXT-Werte verglichen werden, wird eine Überprüfungssequenz verwendet, um die Ergebnisse des Vergleichs gemäß den folgenden Regeln zu bestimmen:
-
Wenn bei binären Vergleichsoperatoren einer der Operanden eine Spalte ist, bestimmt der Standardvergleichstyp der Spalte die für den Vergleich zu verwendende Vergleichsreihenfolge. Wenn beide Operanden Spalten sind, bestimmt der Überprüfungstyp für den linken Operanden die verwendete Überprüfungssequenz. Wenn keiner der Operanden eine Spalte ist, wird die BINARY-Überprüfungssequenz verwendet.
-
Der Operator BETWEEN...AND entspricht der Verwendung von zwei Ausdrücken mit den Operatoren >= und <=. So entspricht der Ausdruck x BETWEEN y AND z beispielsweise x >= y AND x <= z. Deshalb wird die Vergleichsreihenfolge für den Operator BETWEEN...AND anhand der vorangehenden Regel bestimmt.
-
Der IN-Operator verhält sich wie der Operator =, um die zu verwendende Überprüfungssequenz zu bestimmen. Beispielsweise entspricht die Vergleichsreihenfolge für den Ausdruck x IN (y, z) dem Standardvergleichstyp von x, sofern x eine Spalte ist. Andernfalls wird die BINARY-Überprüfung verwendet.
-
Einer ORDER BY-Klausel, die Teil einer SELECT-Anweisung ist, kann explizit eine Überprüfungssequenz zugeordnet werden, die für den Sortiervorgang verwendet wird. In diesem Fall wird immer die explizite Überprüfungssequenz verwendet. Wenn dies nicht der Fall ist und wenn der Ausdruck, der von einer ORDER BY-Klausel sortiert wird, eine Spalte ist, richtet sich die Sortierreihenfolge nach dem Standardvergleichstyp der Spalte. Wenn es sich beim Ausdruck nicht um eine Spalte handelt, wird die BINARY-Überprüfungssequenz verwendet.
EXPLAIN
Der EXPLAIN-Befehlsmodifizierer ist eine nicht standardmäßige SQL-Erweiterung.
sql-statement ::= EXPLAIN sql-statement
Wenn das EXPLAIN-Schlüsselwort vor jeder anderen SQL-Anweisung erscheint, wird der Befehl nicht ausgeführt, sondern es wird die Abfolge der Virtual-Machine-Anweisungen angegeben, mit denen der Befehl ausgeführt worden wäre, falls das EXPLAIN-Schlüsselwort nicht vorhanden wäre. Die EXPLAIN-Funktion ist eine erweiterte Funktion und ermöglicht Entwicklern, den SQL-Anweisungstext zu ändern, um zu versuchen, die Leistung zu optimieren, oder um eine Anweisung zu debuggen, die nicht erwartungsgemäß funktioniert.
ON CONFLICT (Konfliktalgorithmen)
Die ON CONFLICT-Klausel ist kein separater SQL-Befehl. Es handelt sich um eine nicht standardmäßige Klausel, die in vielen anderen SQL-Anweisungen verwendet werden kann.
conflict-clause ::= ON CONFLICT conflict-algorithm
conflict-clause ::= OR conflict-algorithm
conflict-algorithm ::= ROLLBACK |
ABORT |
FAIL |
IGNORE |
REPLACE
Die erste Form der ON CONFLICT-Klausel, bei der die ON CONFLICT-Schlüsselwörter verwendet werden, wird in einer CREATE TABLE-Anweisung verwendet. Für eine INSERT- oder UPDATE-Anweisung wird die zweite Form verwendet, wobei ON CONFLICT durch OR ersetzt wird, um der Syntax ein natürlicheres Erscheinungsbild zu geben. Anstelle von INSERT ON CONFLICT IGNORE wird die Anweisung zum Beispiel zu INSERT OR IGNORE. Zwar unterscheiden sich die Schlüsselwörter, die Bedeutung der Klausel ist jedoch in beiden Formen dieselbe.
Die ON CONFLICT-Klausel gibt den Algorithmus an, der zur Auflösung von Beschränkungskonflikten verwendet wird. Die fünf Algorithmen sind ROLLBACK, ABORT, FAIL, IGNORE und REPLACE. Der Standardalgorithmus lautet ABORT. Nachstehend werden die fünf Konfliktalgorithmen erläutert:
-
ROLLBACK
-
Wenn eine Beschränkungsverletzung auftritt, wird sofort ROLLBACK durchgeführt, wodurch die aktuelle Transaktion beendet wird. Der Befehl wird abgebrochen und die SQLStatement-Instanz löst ein error-Ereignis aus. Wenn keine andere Transaktion aktiv ist (abgesehen von der impliziten Transaktion, die bei jedem Befehl erstellt wird), funktioniert dieser Algorithmus genau wie ABORT.
-
ABORT
-
Bei einer Beschränkungsverletzung macht der Befehl alle bereits durchgeführten Änderungen rückgängig und die SQLStatement-Instanz löst ein Fehlerereignis aus. Es wird kein ROLLBACK ausgeführt, sodass Änderungen von früheren Befehlen innerhalb einer Transaktion beibehalten werden. ABORT ist das Standardverhalten.
-
FAIL
-
Wenn eine Beschränkungsverletzung auftritt, wird der Befehl abgebrochen und die SQLStatement-Instanz löst ein Fehlerereignis aus. Änderungen an der Datenbank, die die Anweisung vorgenommen hat, bevor die Beschränkungsverletzung aufgetreten ist, werden jedoch beibehalten und nicht zurückgenommen. Beispiel: Wenn eine UPDATE-Anweisung in Zeile 100 eine Beschränkungsverletzung erkennt, werden die Änderungen der ersten 99 Zeilen beibehalten, aber an Zeile 100 und weiteren Zeilen werden keine Änderungen vorgenommen.
-
IGNORE
-
Wenn eine Beschränkung verletzt wird, wird die eine Zeile mit der Beschränkungsverletzung nicht eingefügt oder geändert. Abgesehen von dieser Zeile, die ignoriert wird, wird der Befehl wie gewohnt ausgeführt. Andere Zeilen vor und nach der Zeile mit der Beschränkungsverletzung werden normal eingefügt oder aktualisiert. Es wird kein Fehler ausgegeben.
-
REPLACE
-
Wenn eine UNIQUE-Beschränkungsverletzung auftritt, werden die bereits vorhandenen Zeilen, die die Verletzung verursacht haben, entfernt, bevor die aktuelle Zeile eingefügt oder aktualisiert wird. Das Einfügen oder Aktualisieren findet also immer statt und der Befehl wird normal ausgeführt. Es wird kein Fehler ausgegeben. Wenn eine Verletzung der NOT NULL-Beschränkung auftritt, wird der NULL-Wert durch den Standardwert für diese Spalte ersetzt. Hat die Spalte keinen Standardwert, wird der ABORT-Algorithmus verwendet. Wenn die CHECK-Beschränkung verletzt wird, wird der IGNORE-Algorithmus verwendet. Wenn diese Strategie zur Konfliktlösung Zeilen löscht, um eine Beschränkung zu erfüllen, werden keine delete-Auslöser für diese Zeilen aufgerufen.
Der in der OR-Klausel einer INSERT- oder UPDATE-Anweisung angegebene Algorithmus hat Vorrang vor allen Algorithmen, die in einer CREATE TABLE-Anweisung angegeben sind. Wenn in der CREATE TABLE-Anweisung oder in der ausgeführten INSERT- oder UPDATE-Anweisung kein Algorithmus angegeben ist, wird der ABORT-Algorithmus verwendet.
REINDEX
Mit dem REINDEX-Befehl werden Indizes gelöscht und neu erstellt. Dieser Befehl ist hilfreich, wenn die Definition einer Überprüfungssequenz geändert wurde.
sql-statement ::= REINDEX collation-name
sql-statement ::= REINDEX [database-name .] ( table-name | index-name )
In der ersten Form werden alle Indizes in allen verbundenen Datenbanken, die die genannte Überprüfungssequenz verwenden, neu erstellt. In der zweiten Form werden alle der Tabelle zugeordneten Indizes neu erstellt, wenn ein table-name angegeben wird. Wenn ein index-name angegeben wird, wird nur diese Indexposition gelöscht und neu erstellt.
KOMMENTARE
Kommentare sind keine SQL-Befehle, können aber in SQL-Abfragen vorkommen. Sie werden von der Laufzeitumgebung wie Leerraum behandelt. Kommentare können überall dort beginnen, wo Leerraum zu finden ist, auch innerhalb von Ausdrücken, die mehrere Zeilen umfassen.
comment ::= single-line-comment |
block-comment
single-line-comment ::= -- single-line
block-comment ::= /* multiple-lines or block [*/]
Einzeilige Kommentare sind durch zwei Bindestriche gekennzeichnet. Ein einzeiliger Kommentar geht nicht über das Ende der aktuellen Zeile hinaus.
Kommentarblöcke können beliebig viele Zeilen umfassen oder sich in einer einzelnen Zeile befinden. Wenn kein abschließendes Begrenzungszeichen vorhanden ist, reicht der Kommentar bis zum Ende der Eingabe. Diese Situation wird nicht als Fehler behandelt. Eine neue SQL-Anweisung kann in einer Zeile nach dem Ende eines Kommentarblocks beginnen. Kommentarblöcke können überall eingebettet werden, wo Leerraum auftreten kann, auch innerhalb von Ausdrücken und in anderen SQL-Anweisungen. Kommentarblöcke sind nicht verschachtelt. Einzeilige Kommentare innerhalb eines Kommentarblocks werden ignoriert.
AUSDRÜCKE
Ausdrücke sind Unterbefehle innerhalb anderer SQL-Blöcke. Nachstehend wird die gültige Syntax für einen Ausdruck innerhalb einer SQL-Anweisung beschrieben:
expr ::= expr binary-op expr |
expr [NOT] like-op expr [ESCAPE expr] |
unary-op expr |
( expr ) |
column-name |
table-name.column-name |
database-name.table-name.column-name |
literal-value |
parameter |
function-name( expr-list | * ) |
expr ISNULL |
expr NOTNULL |
expr [NOT] BETWEEN expr AND expr |
expr [NOT] IN ( value-list ) |
expr [NOT] IN ( select-statement ) |
expr [NOT] IN [database-name.] table-name |
[EXISTS] ( select-statement ) |
CASE [expr] ( WHEN expr THEN expr )+ [ELSE expr] END |
CAST ( expr AS type ) |
expr COLLATE collation-name
like-op ::= LIKE | GLOB
binary-op ::= see Operators
unary-op ::= see Operators
parameter ::= :param-name | @param-name | ?
value-list ::= literal-value [, literal-value]*
literal-value ::= literal-string | literal-number | literal-boolean | literal-blob | literal-null
literal-string ::= 'string value'
literal-number ::= integer | number
literal-boolean ::= true | false
literal-blob ::= X'string of hexadecimal data'
literal-null ::= NULL
Ein Ausdruck ist eine beliebige Kombination aus Werten und Operatoren, die in einen einzelnen Wert aufgelöst werden können. Ausdrücke lassen sich in zwei Grundtypen unterteilen, je nachdem, ob sie in einen booleschen Wert (true oder false) oder in einen nicht booleschen Wert aufgelöst werden.
In verschiedenen häufig vorkommenden Situationen muss der Ausdruck in einen booleschen Wert aufgelöst werden, zum Beispiel in einer WHERE-Klausel, einer HAVING-Klausel, im ON-Ausdruck in einer JOIN-Klausel und in einem CHECK-Ausdruck. Die folgenden Ausdruckstypen erfüllen diese Bedingung:
Literalwerte
Ein numerischer Literalwert wird als Ganzzahl oder als Gleitkommazahl geschrieben. Die wissenschaftliche Schreibweise wird unterstützt. Der . (Punkt) wird immer als Dezimaltrennzeichen verwendet.
Ein Stringliteral ist dadurch gekennzeichnet, dass der String in einfache Anführungszeichen ' gesetzt wird. Wenn ein String ein einfaches Anführungszeichen enthält, schreiben Sie zwei einfache Anführungszeichen hintereinander: ''.
Ein boolesches Literal ist durch den Wert true oder false gekennzeichnet. Boolesche Literalwerte werden mit dem booleschen Spaltendatentyp verwendet.
Ein BLOB-Literal ist ein Stringliteral, das hexadezimale Daten enthält und dem ein einzelnes x- oder X-Zeichen vorangestellt ist, zum Beispiel X'53514697465'.
Ein Literalwert kann auch das Token NULL sein.
Spaltenname
Ein Spaltenname kann einer der Namen sein, die in der CREATE TABLE-Anweisung definiert sind, oder einer der folgenden besonderen Bezeichner: ROWID, OID oder _ROWID_. Alle diese besonderen Bezeichner beschreiben den eindeutigen, zufälligen Ganzzahlschlüssel (den „Zeilenschlüssel“), der jeder Zeile einer jeden Tabelle zugeordnet ist. Die speziellen Bezeichner verweisen nur auf den Zeilenschlüssel, wenn die CREATE TABLE-Anweisung keine reale Spalte mit demselben Namen definiert. Zeilenschlüssel verhalten sich wie schreibgeschützte Spalten. Ein Zeilenschlüssel kann überall verwendet werden, wo auch eine reguläre Spalte verwendet werden kann, allerdings kann der Wert eines Zeilenschlüssels in einer UPDATE- oder INSERT-Anweisung nicht geändert werden. Die SELECT * FROM table-Anweisung schließt den Zeilenschlüssel nicht in ihren Ergebnissatz ein.
SELECT-Anweisung
Eine SELECT-Anweisung kann in einem Ausdruck als rechter Operand des IN-Operators, als Skalarmenge (ein einzelner Ergebniswert) oder als Operand eines EXISTS-Operators verwendet werden. Bei der Verwendung als Skalarmenge oder als Operand eines IN-Operators kann die SELECT-Anweisung nur eine einzelne Spalte in ihrem Ergebnis aufweisen. Eine zusammengesetzte SELECT-Anweisung (durch Schlüsselwörter wie UNION oder EXCEPT verbunden) ist zulässig. Mit dem EXISTS-Operator werden die Spalten im Ergebnissatz der SELECT-Anweisung ignoriert und der Ausdruck gibt TRUE zurück, wenn eine oder mehrere Zeilen vorhanden sind, bzw. FALSE, wenn der Ergebnissatz leer ist. Wenn kein Begriff im SELECT-Ausdruck auf den Wert in der enthaltenden Abfrage verweist, wird der Ausdruck einmal evaluiert, bevor eine weitere Verarbeitung erfolgt, und das Ergebnis wird wie erforderlich wiederverwendet. Wenn der SELECT-Ausdruck Variablen aus der äußeren Abfrage enthält (als korrelierte Unterabfrage bezeichnet), wird die SELECT-Anweisung jedes Mal, wenn sie benötigt wird, erneut evaluiert.
Wenn eine SELECT-Anweisung der rechte Operand des IN-Operator ist, gibt der IN-Operator den Wert TRUE zurück, wenn das Ergebnis des linken Operanden gleich einem der Werte im Ergebnissatz der SELECT-Anweisung ist. Dem IN-Operator kann das NOT-Schlüsselwort vorangestellt werden, um den Sinn des Tests umzukehren.
Wenn eine SELECT-Anweisung innerhalb eines Ausdrucks auftritt, aber nicht der rechte Operand eines IN-Operators ist, wird die erste Zeile im Ergebnis der SELECT-Anweisung als Wert im Ausdruck verwendet. Wenn die SELECT-Anweisung mehr als eine Ergebniszeile erzielt, werden alle Zeilen nach der ersten ignoriert. Wenn die SELECT-Anweisung keine Zeilen ergibt, hat die SELECT-Anweisung den Wert NULL.
CAST-Ausdruck
Ein CAST-Ausdruck ändert den Datentyp des angegebenen Werts zu dem gegebenen. Der angegebene Typ kann jeder nicht leere Typname sein, der für den Typ in einer Spaltendefinition einer CREATE TABLE-Anweisung gültig ist. Ausführliche Informationen finden Sie unter „Unterstützte Datentypen“.
Weitere Ausdruckselemente
Die folgenden SQL-Elemente können ebenfalls in Ausdrücken verwendet werden:
Integrierte Funktionen
Die integrierten Funktionen lassen sich in drei Hauptkategorien aufteilen:
Zusätzlich zu diesen Funktionen gibt es eine besondere Funktion, RAISE(), mit der eine Benachrichtigung ausgegeben wird, wenn beim Ausführen eines Auslösers ein Fehler auftritt. Diese Funktion kann nur im Hauptteil einer CREATE TRIGGER-Anweisung verwendet werden. Informationen zur RAISE()-Funktion finden Sie unter CREATE TRIGGER > RAISE().
Wie bei allen Schlüsselwörtern in SQL spielt die Groß- und Kleinschreibung bei Funktionsnamen keine Rolle.
Aggregationsfunktionen
Aggregationsfunktionen führen Operationen an Werten aus mehreren Zeilen aus. Diese Funktionen werden hauptsächlich in SELECT-Anweisungen zusammen mit der GROUP BY-Klausel verwendet.
AVG(X)
|
Gibt den Durchschnittswert aller X-Werte ungleich NULL innerhalb einer Gruppe zurück. String- und BLOB- Werte, die nicht wie Zahlen aussehen, werden als 0 interpretiert. Das Ergebnis von AVG() ist immer ein Gleitkommawert, selbst wenn alle Eingaben Ganzzahlen sind.
|
COUNT(X) COUNT(*)
|
Die Rückgabe der ersten Form gibt an, wie oft X in einer Gruppe nicht NULL ist. Die zweite Form (mit dem Argument *) gibt die Gesamtzahl der Zeilen in der Gruppe zurück.
|
MAX(X)
|
Gibt den Höchstwert aller Werte in der Gruppe zurück. Es wird die übliche Sortierreihenfolge verwendet, um den Höchstwert zu bestimmen.
|
MIN(X)
|
Gibt den kleinsten Wert aller Werte ungleich NULL in der Gruppe zurück. Es wird die übliche Sortierreihenfolge verwendet, um den niedrigsten Wert zu bestimmen. Wenn alle Werte in der Gruppe NULL sind, wird NULL zurückgegeben.
|
SUM(X)
TOTAL(X)
|
Gibt die numerische Summe aller Werte ungleich NULL in der Gruppe zurück. Wenn alle Werte NULL sind, hat SUM() den Rückgabewert NULL und TOTAL() gibt 0.0 zurück. Das Ergebnis von TOTAL() ist immer ein Gleitpunktwert. Das Ergebnis von SUM() ist ein ganzzahliger Wert, wenn alle Eingaben ungleich NULL Ganzzahlen sind. Wenn eine Eingabe für SUM() keine Ganzzahl und nicht NULL ist, gibt SUM() einen Gleitkommawert zurück. Dieser Wert kann eine Annäherung an die tatsächliche Summe sein.
|
In jeder der vorstehenden Aggregationsfunktionen, die ein einzelnes Argument verwenden, kann diesem Argument das DISTINCT-Schlüsselwort vorangestellt werden. In diesem Fall werden doppelte Elemente herausgefiltert, bevor sie an die Aggregationsfunktion übergeben werden. So gibt der Funktionsaufruf COUNT(DISTINCT x) beispielsweise die Anzahl der unterschiedlichen Werte in Spalte X anstelle der Gesamtanzahl der Werte ungleich NULL in Spalte X zurück.
Skalarfunktionen
Skalarfunktionen werden jeweils für die Werte einer Zeile ausgeführt.
ABS(X)
|
Gibt den absoluten Wert des Arguments X zurück.
|
COALESCE(X, Y, ...)
|
Gibt eine Kopie des ersten Arguments zurück, das nicht NULL ist. Wenn alle Argumente NULL sind, wird NULL zurückgegeben. Es müssen mindestens zwei Argumente vorhanden sein.
|
GLOB(X, Y)
|
Mit dieser Funktion wird die X GLOB Y-Syntax implementiert.
|
IFNULL(X, Y)
|
Gibt eine Kopie des ersten Arguments zurück, das nicht NULL ist. Wenn beide Argumente NULL sind, wird NULL zurückgegeben. Diese Funktion verhält sich wie COALESCE().
|
HEX(X)
|
Das Argument wird als Wert des BLOB-Speichertyps interpretiert. Das Ergebnis ist eine hexadezimale Darstellung des Inhalts dieses Werts.
|
LAST_INSERT_ROWID()
|
Gibt den Zeilenbezeichner (generierter Primärschlüssel) der letzten Zeile zurück, die über die aktuelle SQLConnection-Instanz eingefügt wurde. Der Wert entspricht dem Wert, der von der
SQLConnection.lastInsertRowID
-Eigenschaft zurückgegeben wird.
|
LENGTH(X)
|
Gibt die Stringlänge von X in Zeichen zurück.
|
LIKE(X, Y [, Z])
|
Mit dieser Funktion wird die X LIKE Y [ESCAPE Z]-Syntax implementiert. Wenn die optionale ESCAPE-Klausel vorhanden ist, wird die Funktion mit drei Argumenten aufgerufen. Andernfalls wird sie nur mit zwei Argumenten aufgerufen.
|
LOWER(X)
|
Gibt eine Kopie des Strings X zurück, wobei alle Zeichen in Kleinschreibung konvertiert werden.
|
LTRIM(X) LTRIM(X, Y)
|
Gibt einen String zurück, der gebildet wird, indem Leerzeichen links von X entfernt werden. Wenn ein Y-Argument angegeben wird, entfernt die Funktion die Zeichen in Y links von X.
|
MAX(X, Y, ...)
|
Gibt das Argument mit dem Höchstwert zurück. Argumente können neben Zahlen auch Strings sein. Der Höchstwert wird von der definierten Sortierreihenfolge bestimmt. Beachten Sie, dass MAX() eine einfache Funktion ist, wenn sie mindestens zwei Argumente hat, aber eine Aggregationsfunktion, wenn sie nur ein Argument hat.
|
MIN(X, Y, ...)
|
Gibt das Argument mit dem niedrigsten Wert zurück. Argumente können neben Zahlen auch Strings sein. Der niedrigste Wert wird von der definierten Sortierreihenfolge bestimmt. Beachten Sie, dass MIN() eine einfache Funktion ist, wenn sie mindestens zwei Argumente hat, aber eine Aggregationsfunktion, wenn sie nur ein Argument hat.
|
NULLIF(X, Y)
|
Gibt das erste Argument zurück, wenn die Argumente sich unterscheiden, andernfalls wird NULL zurückgegeben.
|
QUOTE(X)
|
Diese Routine gibt einen String zurück, der dem Wert ihres Arguments entspricht, der in eine andere SQL-Anweisung eingeschlossen werden kann. Strings sind in einfache Anführungszeichen gesetzt. Wenn innerhalb des Strings Anführungszeichen erforderlich sind, werden Escape-Zeichen vorangestellt. BLOB-Speicherklassen werden als hexadezimale Literale kodiert. Diese Funktion ist hilfreich, wenn Auslöser geschrieben werden, um Rückgängig-/Wiederherstellen-Funktionen zu implementieren.
|
RANDOM(*)
|
Gibt eine pseudo-zufällige Ganzzahl zwischen -9223372036854775808 und 9223372036854775807 zurück. Dieser Zufallswert ist nicht entschlüsselungsresistent.
|
RANDOMBLOB(N)
|
Gibt einen BLOB-Wert mit N Byte zurück, der pseudozufällige Byte enthält. N sollte eine positive Ganzzahl sein. Dieser Zufallswert ist nicht entschlüsselungsresistent. Wenn der Wert von N negativ ist, wird ein einzelnes Byte zurückgegeben.
|
ROUND(X) ROUND(X, Y)
|
Rundet die Zahl X auf Y Ziffern rechts vom Dezimaltrennzeichen ab. Wenn das Argument Y ausgelassen wird, wird 0 verwendet.
|
RTRIM(X) RTRIM(X, Y)
|
Gibt einen String zurück, der gebildet wird, indem Leerzeichen rechts von X entfernt werden. Wenn ein Y-Argument angegeben wird, entfernt die Funktion die Zeichen in Y rechts von X.
|
SUBSTR(X, Y, Z)
|
Gibt einen Teilstring des Eingabestrings X zurück, der mit dem Y. Zeichen beginnt und Z Zeichen lang ist. Das Zeichen ganz links von X hat die Indexposition 1. Wenn Y negativ ist, wird das erste Zeichen des Teilstrings ermittelt, indem von rechts anstelle von links gezählt wird.
|
TRIM(X) TRIM(X, Y)
|
Gibt einen String zurück, der gebildet wird, indem Leerzeichen rechts von X entfernt werden. Wenn ein Y-Argument angegeben wird, entfernt die Funktion die Zeichen in Y rechts von X.
|
TYPEOF(X)
|
Gibt den Typ des Ausdrucks X zurück. Die möglichen Rückgabewerte sind „null“, „integer“, „real“, „text“ und „blob“. Weitere Informationen zu Datentypen finden Sie unter „Unterstützte Datentypen“.
|
UPPER(X)
|
Gibt eine Kopie des Eingabestrings X zurück, wobei alle Buchstaben in Großbuchstaben umgewandelt werden.
|
ZEROBLOB(N)
|
Gibt einen BLOB mit N Byte von 0x00 zurück.
|
Datums-/Uhrzeitformat-Funktionen
Die Funktionen zur Formatierung von Datum und Uhrzeit sind eine Gruppe von Skalarfunktionen, mit denen formatierte Datums- und Uhrzeitdaten erstellt werden. Beachten Sie, dass diese Funktionen für String- und Zahlenwerte ausgeführt werden und String- und Zahlenwerte zurückgeben. Diese Funktionen sind nicht für die Verwendung mit dem DATE-Datentyp konzipiert. Wenn Sie diese Funktionen für Daten in einer Spalte verwenden, deren deklarierter Datentyp DATE ist, verhalten sie sich nicht wie erwartet.
DATE(T, ...)
|
Die DATE()-Funktion gibt einen String zurück, der das Datum im folgenden Format enthält: YYYY-MM-DD. Der erste Parameter (T) gibt einen Zeitstring in einem Format zurück, das unter „Zeitformate“ zu finden ist. Nach dem Zeitstring kann eine beliebige Anzahl von Modifizierern angegeben werden. Die Modifizierer sind unter „Modifizierer“ aufgeführt.
|
TIME(T, ...)
|
Die TIME()-Funktion gibt einen String zurück, der die Uhrzeit im Format HH:MM:SS enthält. Der erste Parameter (T) gibt einen Zeitstring in einem Format zurück, das unter „Zeitformate“ zu finden ist. Nach dem Zeitstring kann eine beliebige Anzahl von Modifizierern angegeben werden. Die Modifizierer sind unter „Modifizierer“ aufgeführt.
|
DATETIME(T, ...)
|
Die DATETIME()-Funktion gibt einen String zurück, der Datum und Uhrzeit im Format YYYY-MM-DD HH:MM:SS enthält. Der erste Parameter (T) gibt einen Zeitstring in einem Format zurück, das unter „Zeitformate“ zu finden ist. Nach dem Zeitstring kann eine beliebige Anzahl von Modifizierern angegeben werden. Die Modifizierer sind unter „Modifizierer“ aufgeführt.
|
JULIANDAY(T, ...)
|
Die JULIANDAY()-Funktion gibt eine Zahl zurück, die die Anzahl der Tage seit Mittag in Greenwich am 24. November 4714 v. Chr. und das bereitgestellte Datum angibt. Der erste Parameter (T) gibt einen Zeitstring in einem Format zurück, das unter „Zeitformate“ zu finden ist. Nach dem Zeitstring kann eine beliebige Anzahl von Modifizierern angegeben werden. Die Modifizierer sind unter „Modifizierer“ aufgeführt.
|
STRFTIME(F, T, ...)
|
Die STRFTIME()-Routine gibt das Datum zurück, das anhand des Formatstrings formatiert ist, der als das erste Argument F angegeben ist. Der Formatstring kann durch folgende Angaben ersetzt werden:
%d – Monatstag
%f – Sekunden als Bruch SS.SSS
%H – Stunde 00-24
%j – Tag des Jahres 001-366
%J – Tag in julianischer Angabe
%m – Monat 01-12
%M – Minute 00-59
%s – Sekunden seit 01.01.1970
%S – Sekunden 00-59
%w – Wochentag 0-6 (Sonntag = 0)
%W – Jahreswoche 00-53
%Y – Jahr 0000-9999
%% - %
Der zweite Parameter (T) gibt einen Zeitstring in einem Format zurück, das unter „Zeitformate“ zu finden ist. Nach dem Zeitstring kann eine beliebige Anzahl von Modifizierern angegeben werden. Die Modifizierer sind unter „Modifizierer“ aufgeführt.
|
Zeitformate
Ein Zeitstring kann in einem der folgenden Formate angegeben werden:
YYYY-MM-DD.
|
2007-06-15
|
YYYY-MM-DD HH:MM
|
2007-06-15 07:30
|
YYYY-MM-DD HH:MM:SS
|
2007-06-15 07:30:59
|
YYYY-MM-DD HH:MM:SS.SSS
|
2007-06-15 07:30:59.152
|
YYYY-MM-DDTHH:MM
|
2007-06-15T07:30
|
YYYY-MM-DDTHH:MM:SS
|
2007-06-15T07:30:59
|
YYYY-MM-DDTHH:MM:SS.SSS
|
2007-06-15T07:30:59.152
|
HH:MM
|
07:30 (Datum ist 2000-01-01)
|
HH:MM:SS
|
07:30:59 (Datum ist 2000-01-01)
|
HH:MM:SS.SSS
|
07:30:59:152 (Datum ist 2000-01-01)
|
now
|
Das aktuelle Datum und die Uhrzeit als Universal Coordinated Time (UTC).
|
DDDD.DDDD
|
Tag in julianischer Angabe als Gleitpunktzahl.
|
Das Zeichen T in diesen Formaten ist ein Literalzeichen "T", das Datum und Uhrzeit trennt. Formate, die nur die Uhrzeit enthalten, gehen vom Datum 2001-01-01 aus.
Modifizierer
Dem Zeitstring können null oder mehr Modifizierer nachgestellt werden, die das Datum oder die Interpretation des Datums ändern. Folgende Modifizierer stehen zur Verfügung:
NNN days
|
Anzahl der Tage, die der Zeit hinzugefügt werden sollen.
|
NNN hours
|
Anzahl der Stunden, die der Zeit hinzugefügt werden sollen.
|
NNN minutes
|
Anzahl der Minuten, die der Zeit hinzugefügt werden sollen.
|
NNN.NNNN seconds
|
Anzahl der Sekunden und Millisekunden, die der Zeit hinzugefügt werden sollen.
|
NNN months
|
Anzahl der Monate, die der Zeit hinzugefügt werden sollen.
|
NNN years
|
Anzahl der Jahre, die der Zeit hinzugefügt werden sollen.
|
start of month
|
Versetzt die Zeit rückwärts bis zum Anfang des Monats.
|
start of year
|
Versetzt die Zeit rückwärts bis zum Anfang des Jahres.
|
start of day
|
Versetzt die Zeit rückwärts bis zum Anfang des Tages.
|
weekday N
|
Versetzt die Zeit vorwärts bis zum angegebenen Wochentag. (0 = Sonntag, 1 = Montag usw.).
|
localtime
|
Konvertiert das Datum in die lokale Zeit.
|
utc
|
Konvertiert das Datum in die Weltzeit (UCT).
|
Operatoren
SQL unterstützt eine große Auswahl von Operatoren, darunter gebräuchliche Operatoren, die in den meisten Programmiersprachen vorkommen, aber auch verschiedene Operatoren, die nur in SQL verwendet werden.
Gebräuchliche Operatoren
Die folgenden binären Operatoren sind in einem SQL-Block zulässig und werden hier von der höchsten zur niedrigsten Priorität aufgeführt:
* / %
+ -
<< >> & |
< >= > >=
= == != <> IN
AND
OR
Unterstützte unäre Präfix-Operatoren:
! ~ NOT
Den COLLATE-Operator kann man sich als unären Postfix-Operator vorstellen. Der COLLATE-Operator hat die höchste Priorität. Er stellt immer eine festere Bindung her als jeder unäre Präfix-Operator und jeder binäre Operator.
Beachten Sie, dass es zwei Variationen der Gleichheits- und Ungleichheitsoperatoren gibt. „Ist gleich“ kann = oder == sein. „Ist nicht gleich“ kann != oder <> sein.
|| ist ein Stringverkettungsoperator – er verbindet die beiden Strings seiner Operanden.
Der Operator % gibt den Rest der Division des linken Operanden durch den rechten Operanden zurück.
Das Ergebnis jedes binären Operators ist ein numerischer Wert, mit Ausnahme des Verkettungsoperators ||, der ein Stringergebnis liefert.
SQL-Operatoren
LIKE
Der LIKE-Operator führt einen Mustervergleich aus.
expr ::= (column-name | expr) LIKE pattern
pattern ::= '[ string | % | _ ]'
Der Operand rechts vom LIKE-Operator enthält das Muster und der Operator auf der linken Seite enthält den String, der mit dem Muster verglichen wird. Das Prozentzeichen (%) im Muster ist ein Platzhalter, der einer beliebigen Folge aus null oder mehr Zeichen im String entspricht. Ein Unterstrich (_) im Muster stimmt mit einem beliebigen einzelnen Zeichen im String überein. Jedes andere Zeichen stimmt mit sich selbst bzw. mit seinem Äquivalent in Groß-/Kleinschreibung überein, da die Groß- oder Kleinschreibung keine Rolle spielt. (Hinweis: Die Datenbankengine kann Groß-/Kleinbuchstaben nur für lateinische 7-Bit-Zeichen interpretieren. Dementsprechend beachtet der LIKE-Operator die Groß-/Kleinschreibung für 8-Bit-ISO8859-Zeichen oder UTF-Zeichen. Zum Beispiel: Der Ausdruck 'a' LIKE 'A' ist TRUE, aber 'æ' LIKE 'Æ' ist FALSE). Die Beachtung der Groß-/Kleinschreibung kann für lateinische Buchstaben mit der SQLConnection.caseSensitiveLike-Eigenschaft geändert werden.
Wenn die optionale ESCAPE-Klausel vorhanden ist, muss der Ausdruck nach dem ESCAPE-Schlüsselwort in einen String evaluiert werden, der aus einem einzelnen Zeichen besteht. Dieses Zeichen kann im LIKE-Muster verwendet werden, um Prozent- oder Unterstrich-Literalzeichen zu finden. Das Escape-Zeichen, dem ein Prozentsymbol, ein Unterstrich oder ein Escape-Zeichen folgt, stimmt mit einem tatsächlichen Prozentsymbol, Unterstrich bzw. Escape-Zeichen im String überein.
GLOB
Der GLOB-Operator ähnelt LIKE, verwendet für Platzhalter jedoch die Unix-Syntax für das automatische Vervollständigen von Dateien (File Globbing). Anders als LIKE beachtet GLOB die Groß- und Kleinschreibung.
IN
Der IN-Operator berechnet, ob sein linker Operand gleich einem der Werte im rechten Operanden (ein Satz von Werten in Klammern) ist.
in-expr ::= expr [NOT] IN ( value-list ) |
expr [NOT] IN ( select-statement ) |
expr [NOT] IN [database-name.] table-name
value-list ::= literal-value [, literal-value]*
Der rechte Operand kann ein Satz von kommagetrennten Literalwerten oder das Ergebnis einer SELECT-Anweisung sein. Im Abschnitt zur SELECT-Anweisung finden Sie Erläuterungen sowie Informationen zu Beschränkungen bei der Verwendung von SELECT-Anweisung als rechter Operand des IN-Operators.
BETWEEN...AND
Der Operator BETWEEN...AND entspricht der Verwendung von zwei Ausdrücken mit den Operatoren >= und <=. So entspricht der Ausdruck x BETWEEN y AND z beispielsweise x > y AND x <= z.
NOT
Der NOT-Operator ist ein Negationsoperator. Den Operatoren GLOB, LIKE und IN kann das NOT-Schlüsselwort vorangestellt sein, um den Sinn des Tests in sein Gegenteil umzukehren (anders ausgedrückt, um zu prüfen, dass ein Wert nicht dem angegebenen Muster entspricht).
Parameter
Ein Parameter gibt im Ausdruck einen Platzhalter für einen Literalwert an, der zur Laufzeit gefüllt wird, indem dem assoziativen SQLStatement.parameters-Array ein Wert zugewiesen wird. Parameter können drei Formen annehmen:
?
|
Ein Fragezeichen gibt einen indizierten Parameter an. Parametern werden entsprechend ihrer Reihenfolge in der Anweisung numerische (auf null basierende) Indexwerte zugewiesen.
|
:AAAA
|
Ein Doppelpunkt gefolgt von einem Bezeichnernamen ist ein Platzhalter für einen benannten Parameter mit dem Namen AAAA. Benannte Parameter sind ebenfalls entsprechend ihrer Reihenfolge in der SQL-Anweisung nummeriert. Der Übersichtlichkeit halber sollten benannte und nummerierte Parameter nicht gemischt werden.
|
@AAAA
|
Das @-Zeichen entspricht einem Doppelpunkt.
|
Nicht unterstützte SQL-Funktionen
In der folgenden Liste sind die SQL-Standardelemente aufgeführt, die von Adobe AIR nicht unterstützt werden:
-
FOREIGN KEY-Beschränkungen
-
FOREIGN KEY-Beschränkungen werden analysiert, aber nicht erzwungen.
-
Auslöser
-
Auslöser des Typs FOR EACH STATEMENT werden nicht unterstützt (alle Auslöser müssen den Typ FOR EACH ROW haben). INSTEAD OF-Auslöser werden für Tabellen nicht unterstützt (INSTEAD OF-Auslöser sind nur für Ansichten zulässig). Rekursive Auslöser (d. h. Auslöser, die sich selbst auslösen) werden nicht unterstützt.
-
ALTER TABLE
-
Nur die Varianten RENAME TABLE und ADD COLUMN des ALTER TABLE-Befehls werden unterstützt. Andere Arten von ALTER TABLE-Operationen, zum Beispiel DROP COLUMN, ALTER COLUMN, ADD CONSTRAINT usw., werden ignoriert.
-
Verschachtelte Transaktionen
-
Nur eine aktive Transaktion ist zulässig.
-
RIGHT und FULL OUTER JOIN
-
RIGHT OUTER JOIN oder FULL OUTER JOIN werden nicht unterstützt.
-
Aktualisierbare Ansicht (VIEW)
-
Eine Ansicht ist schreibgeschützt. Sie können keine DELETE-, INSERT- oder UPDATE-Anweisung für eine Ansicht ausführen. Ein INSTEAD OF-Auslöser, der beim Versuch eines DELETE-, INSERT- oder UPDATE-Vorgangs für eine Ansicht ausgelöst wird, wird unterstützt und kann verwendet werden, um unterstützende Tabellen im Hauptteil des Auslösers zu aktualisieren.
-
GRANT und REVOKE
-
Eine Datenbank ist eine reguläre Festplattendatei, auf die nur die normalen Dateizugriffsberechtigungen des zugrunde liegenden Betriebssystems angewendet werden können. Die Befehle GRANT und REVOKE, die häufig in Client/Server-RDBMS verwendet werden, werden nicht implementiert.
Die folgenden SQL-Elemente und SQLite-Funktionen werden in einigen SQLite-Implementierungen unterstützt, jedoch nicht von Adobe AIR. Der Großteil dieser Funktionalität ist über Methoden der SQLConnection-Klasse verfügbar:
-
Transaktionsbezogene SQL-Elemente (BEGIN, END, COMMIT, ROLLBACK)
-
Diese Funktionalität steht über die transaktionsbezogenen Methoden der SQLConnection-Klasse zur Verfügung: SQLConnection.begin(), SQLConnection.commit() und SQLConnection.rollback().
-
ANALYZE
-
Diese Funktionalität steht mit der SQLConnection.analyze()-Methode zur Verfügung.
-
ATTACH
-
Diese Funktionalität steht mit der SQLConnection.attach()-Methode zur Verfügung.
-
COPY
-
Diese Anweisung wird nicht unterstützt.
-
CREATE VIRTUAL TABLE
-
Diese Anweisung wird nicht unterstützt.
-
DETACH
-
Diese Funktionalität steht mit der SQLConnection.detach()-Methode zur Verfügung.
-
PRAGMA
-
Diese Anweisung wird nicht unterstützt.
-
VACUUM
-
Diese Funktionalität steht mit der SQLConnection.compact()-Methode zur Verfügung.
-
Zugriff auf Systemtabellen nicht verfügbar
-
Die Systemtabellen, einschließlich sqlite_master und anderen Tabellen mit dem Präfix "sqlite_", sind in SQL-Anweisungen nicht verfügbar. Die Laufzeitumgebung enthält eine Schema-API, die den objektorientierten Zugriff auf Schemadaten ermöglicht. Weitere Informationen hierzu finden Sie im Abschnitt zur SQLConnection.loadSchema()-Methode.
-
Funktionen für reguläre Ausdrücke (MATCH() und REGEX())
-
Diese Funktionen stehen in SQL-Anweisungen nicht zur Verfügung.
Die folgende Funktionalität unterscheidet sich zwischen vielen SQLite-Implementierungen und Adobe AIR:
-
Indizierte Anweisungsparameter
-
In vielen Implementierungen sind indizierte Anweisungsparameter eins-basiert. In Adobe AIR sind indizierte Anweisungsparameter jedoch null-basiert (der erste Parameter hat den Index 0, der zweite hat den Index 1 usw.).
-
INTEGER PRIMARY KEY-Spaltendefinitionen
-
Bei vielen Implementierungen werden nur Spalten, die genau als INTEGER PRIMARY KEY definiert sind, als tatsächlicher Primärschlüssel der Tabelle verwendet. Werden in solchen Implementierungen andere Datentypen synonym für INTEGER verwendet (z. B. int), wird die betreffende Spalte nicht als interner Primärschlüssel verwendet. In Adobe AIR gilt jedoch der int-Datentyp (sowie andere Synonyme für INTEGER) als genau äquivalent mit INTEGER. Demzufolge wird eine als int PRIMARY KEY definierte Spalte als interner Primärschlüssel für die Tabelle verwendet. Weitere Informationen finden Sie unter CREATE TABLE und im Abschnitt zur Spaltenaffinität.
Zusätzliche SQL-Funktionen
Die folgenden Spaltenaffinitätstypen werden standardmäßig nicht von SQLite unterstützt, jedoch in Adobe AIR (beachten Sie, dass bei diesen Datentypen die Groß- und Kleinschreibung wie bei allen Schlüsselwörtern in SQL nicht wichtig ist):
-
Boolean
-
entspricht der Boolean-Klasse.
-
Date
-
entspricht der Date-Klasse.
-
int
-
entspricht der int-Klasse (äquivalent zur INTEGER-Spaltenaffinität).
-
Number
-
entspricht der Number-Klasse (äquivalent zur REAL-Spaltenaffinität).
-
Object
-
entspricht der Object-Klasse oder einer beliebigen Unterklasse, die mit AMF3 serialisiert und deserialisiert werden kann. (Dazu gehören die meisten Klassen, wie zum Beispiel benutzerdefinierte Klassen; einige Klassen, darunter Anzeigeobjekte und Objekte, die Anzeigeobjekte als Eigenschaften enthalten, sind jedoch ausgeschlossen.)
-
String
-
entspricht der String-Klasse (äquivalent zur TEXT-Spaltenaffinität).
-
XML
-
entspricht der ActionScript (E4X) XML-Klasse.
-
XMLList
-
entspricht der ActionScript (E4X) XMLList-Klasse.
Die folgenden Literalwerte werden standardmäßig in SQLite nicht unterstützt, werden jedoch in Adobe AIR unterstützt:
-
true
-
repräsentiert den booleschen Literalwert true für die Arbeit mit BOOLEAN-Spalten.
-
false
-
repräsentiert den booleschen Literalwert false für die Arbeit mit BOOLEAN-Spalten.
|
|
|