Obsługiwana składnia języka SQL

Na poniższych listach przedstawiono składnię języka SQL obsługiwaną przez mechanizm bazy danych SQL w środowisku Adobe AIR. Materiał podzielono na listy objaśniające typy instrukcji, typy klauzul, wyrażenia, funkcje wbudowane oraz operatory. Opisane zostały następujące tematy:
  • Ogólna składnia języka SQL

  • Instrukcje manipulowania danymi (SELECT, INSERT, UPDATE oraz DELETE)

  • Instrukcje opisu danych (instrukcje CREATE, ALTER, oraz DROP dla tabel, indeksów, widoków i wyzwalaczy)

  • Instrukcje i klauzule specjalne

  • Funkcje wbudowane (agregujące, skalarne oraz funkcje formatowania daty/godziny)

  • Operatory

  • Parametry

  • Nieobsługiwane elementy języka SQL

  • Dodatkowe elementy języka SQL

Ogólna składnia języka SQL

Poza specyficzną składnią różnych instrukcji i wyrażeń, obowiązują następujące ogólne reguły dla składni języka SQL:
Rozróżnianie małych i wielkich liter
W instrukcjach języka SQL, włącznie z nazwami obiektów, nie jest uwzględniana wielkość liter. Jednak słowa kluczowe języka SQL są często zapisywane wielkimi literami i ta konwencja jest używana także w niniejszym dokumencie. Podczas gdy w składni języka SQL nie jest rozróżniana wielkość liter, jest ona uwzględniana w wartościach literałów i może być uwzględniania także w operacjach porównania i sortowania w sposób określony w sekwencji układania określonej dla kolumny lub operacji. Aby uzyskać więcej informacji, należy zapoznać się z opisem instrukcji COLLATE.

Białe znaki
Do oddzielania słów w instrukcjach SQL należy używać białych znaków (np. spacji, tabulacji, nowego wiersza itd.). Jednak użycie białego znaku między słowami i symbolami jest opcjonalne. Nie ma znaczenia rodzaj i liczba białych znaków użytych w instrukcji SQL. Białych znaków (np. podziałów akapitu i znaków nowego wiersza) można użyć do formatowania własnych instrukcji SQL w celu poprawienia ich czytelności, bez zmiany znaczenia instrukcji.

Instrukcje manipulowania danymi

Instrukcje manipulowania danymi są najczęściej używanymi instrukcjami języka SQL. Instrukcje są używane do pobierania, dodawania, modyfikowania i usuwania danych z tabel baz danych. Obsługiwane są następujące instrukcje manipulowania danymi: SELECT, INSERT, UPDATE oraz DELETE.

SELECT

Instrukcja SELECT służy do tworzenia zapytań do bazy danych. Wynikiem instrukcji SELECT jest zero lub więcej wierszy danych, z których każdy ma stałą liczbę kolumn. Liczba kolumn w wyniku jest określana przez nazwę kolumny wynikowej lub listę wyrażeń między słowami kluczowymi SELECT i opcjonalnie FROM.

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

Jako wyniku można użyć dowolnego wyrażenia. Jeśli wynikowym wyrażeniem jest *, do tego wyrażenia podstawione zostaną wszystkie kolumny wszystkich tabel. Jeżeli wyrażenie jest nazwą tabeli, po której występuje . * wynikiem będą wszystkie kolumny tej tabeli.

Słowo kluczowe DISTINCT powoduje zwrócenie podzbioru wierszy, w którym każdy wynikowy wiersz jest inny. Wartości NULL nie są traktowane jako różniące się między sobą. Domyślnym działaniem jest zwracanie wszystkich wynikowych wierszy, co można zrobić jawnie przy użyciu słowa kluczowego ALL.

Zapytanie zostanie wykonane na jednej lub wielu tabelach określonych po słowie kluczowym FROM. Jeśli nazwy tabel oddzielone zostały przecinkami, w zapytaniu użyte zostanie złączenie krzyżowe różnych tabel. Używając składni instrukcji JOIN, można także określić sposób, w jaki zostaną złączone tabele. Jedynym obsługiwanym typem złączeń zewnętrznych jest LEFT OUTER JOIN. Wynikiem wyrażenia z klauzulą ON w argumentach argumenty_złączenia musi być wartość logiczna. Podzapytanie ujęte w nawiasy może zostać użyte jako tabela w klauzuli FROM. Klauzula FROM może zostać pominięta; w tym wypadku wynikiem będzie pojedynczy wiersz zawierający wartości listy wyrażenia wynikowego.

Klauzula WHERE używana jest do ograniczania liczby wierszy pobieranych w zapytaniu. Wynikiem wyrażeń klauzuli WHERE muszą być wartości logiczne. Filtrowanie za pomocą klauzuli WHERE jest wykonywane przed grupowaniem, dlatego wyrażenia klauzuli WHERE nie mogą zawierać funkcji agregujących.

Klauzula GROUP BY powoduje scalenie jednego lub wielu wierszy wyniku w pojedynczy wiersz na wyjściu. Klauzula GROUP BY jest szczególnie użyteczna, gdy wynik zawiera funkcje agregujące. Wyrażenia w klauzuli GROUP BY nie muszą pojawiać się na liście wyrażeń instrukcji SELECT.

Klauzula HAVING, podobnie jak klauzula WHERE, umożliwia ograniczanie liczby wierszy zwracanych przez instrukcję. Jednak klauzula HAVING stosowana jest po wystąpieniu jakiegokolwiek grupowania określonego klauzulą GROUP BY. Wskutek tego wyrażenie klauzuli HAVING może odwoływać się do wartości zawierających funkcje agregujące. Wystąpienie wyrażenia klauzuli HAVING na liście instrukcji SELECT nie jest wymagane. Wynikiem wyrażenia klauzuli HAVING, podobnie jak dla wyrażenia klauzuli WHERE, musi być wartość logiczna.

Klauzula ORDER BY powoduje sortowanie wyjściowych wierszy. Argument lista_wyrażeń_sortowania klauzuli ORDER BY jest listą wyrażeń użytą jako klucz sortowania. Wyrażenia nie muszą być częścią wyniku dla prostej instrukcji SELECT, ale w złożonej instrukcji SELECT (instrukcji SELECT korzystającej z jednego z operatorów operatory_złożone) każde wyrażenie sortowania musi odpowiadać dokładnie jednej kolumnie wyniku. Opcjonalnie po każdym wyrażeniu może występować klauzula porządek_sortowania zawierająca słowo kluczowe COLLATE oraz nazwę funkcji porównania użytej do porządkowania tekstu i/lub słowo kluczowe ASC bądź DESC do określania porządku sortowania (rosnącego lub malejącego). Argument porządek_sortowania można pominąć; pominięcie powoduje użycie ustawienia domyślnego (porządek rosnący). Definicja klauzuli COLLATE oraz funkcje porównania znajdują się w sekcji COLLATE.

Klauzula LIMIT służy do ustawiania górnej granicy liczby wierszy zwracanych w wyniku. Ujemna wartość klauzuli LIMIT wskazuje na brak górnej granicy. Opcjonalna klauzula OFFSET, następująca po klauzuli LIMIT, określa liczbę wierszy, które zostaną pominięte na początku zestawu wyników. W złożonym zapytaniu SELECT, klauzula LIMIT może występować jedynie po końcowej instrukcji SELECT, a granica zostanie użyta do całego zapytania. Należy zauważyć, że jeśli słowo kluczowe OFFSET zostanie użyte w klauzuli LIMIT, pierwszą liczbą całkowitą jest granica, a drugą przesunięcie. Jeśli zamiast słowa kluczowego OFFSET użyty zostanie przecinek, pierwszą liczbą jest przesunięcie, a drugą granica. Ta pozorna sprzeczność jest zamierzona — powoduje uzyskanie maksymalnej zgodności z zapisem SQL używanym w starszych systemach baz danych.

Złożona instrukcja SELECT zawiera dwie lub więcej prostych instrukcji SELECT połączonych za pomocą jednego z operatorów UNION, UNION ALL, INTERSECT lub EXCEPT. W złożonym zapytaniu SELECT wszystkie składowe instrukcje SELECT muszą wskazywać tę samą liczbę kolumn wynikowych. Za końcową instrukcją SELECT (i przed pojedynczą klauzulą LIMIT, jeśli została określona) może znajdować się tylko jedna klauzula ORDER BY. Operatory UNION i UNION ALL łączą wyniki poprzedzających je i następujących po nich instrukcji SELECT w jedną tabelę. Różnica między nimi polega na tym, że wynikiem zastosowania operatora UNION są różne wiersze, natomiast dla operatora UNION ALL wiersze mogą się powtarzać. Operator INTERSECT powoduje, że na wyjściu zwrócone zostanie przecięcie wyników instrukcji SELECT poprzedzającej operator i następującej po nim. Operator EXCEPT powoduje, że na wyjściu zwrócony zostanie wynik instrukcji SELECT poprzedzającej operator po usunięciu z niego wyniku instrukcji SELECT znajdującej się za operatorem. Jeśli złożona instrukcja SELECT zawiera trzy lub więcej instrukcji, zostaną one zgrupowane od pierwszej do ostatniej.

Definicje dopuszczalnych wyrażeń znajdują się w sekcji Wyrażenia.

W środowisku AIR 2.5 i w nowszych wersjach operator CAST języka SQL jest obsługiwany podczas odczytu w celu konwertowania danych BLOB na obiekty ActionScript ByteArray. Na przykład poniższy kod umożliwia odczytanie danych, które nie są przechowywane w formacie AMF, i zachowanie ich w obiekcie ByteArray.

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

Instrukcja INSERT ma dwie podstawowe postacie i jest używana do wstawiania danych do tabel.
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

Pierwsza postać (ze słowem kluczowym VALUES) tworzy w istniejącej tabeli nowy pojedynczy wiersz. Jeśli nie został określony żaden argument lista_kolumn, liczba wartości musi być taka sama jak liczba kolumn w tabeli. Jeśli argument lista_kolumn został określony, liczba wartości musi odpowiadać liczbie kolumn. Kolumny tabeli, które nie zostały wymienione na liście kolumn, wypełniane są podczas tworzenia tabeli wartością domyślną lub wartością NULL, jeśli wartość domyślna nie została zdefiniowana.

W drugiej postaci instrukcji INSERT dane pobierane są z instrukcji SELECT. Jeśli argument lista_kolumn nie został określony, liczba kolumn wyniku instrukcji SELECT musi odpowiadać liczbie kolumn tabeli, w innym wypadku musi odpowiadać liczbie kolumn wskazanej argumentem lista_kolumn. Nowy wpis jest wykonywany w tabeli dla każdego wiersza wyniku instrukcji SELECT. Instrukcja SELECT może być instrukcją prostą lub złożoną. Definicje dopuszczalnych instrukcji SELECT znajdują się w opisie instrukcji SELECT.

Opcjonalny argument algorytm_rozw_konfliktów umożliwia użycie w poleceniu alternatywnego algorytmu rozwiązywania konfliktów ograniczeń. Objaśnienia i definicję algorytmów rozwiązywania konfliktów zawiera sekcja Instrukcje i klauzule specjalne .

Obie postacie REPLACE INTO instrukcji odpowiadają użyciu standardowej postaci instrukcji INSERT [OR algorytm_rozw_konfliktów] z algorytmem rozwiązywania konfliktów REPLACE (tj. postaci INSERT OR REPLACE...).

Obie postacie REPLACE INTO instrukcji odpowiadają użyciu standardowej postaci instrukcji INSERT [OR algorytm_rozw_konfliktów] z algorytmem rozwiązywania konfliktów REPLACE (tj. postaci INSERT OR REPLACE...).

UPDATE

Polecenie uaktualnienia zmienia istniejące rekordy w tabeli.

sql-statement  ::=  UPDATE [database-name.] table-name SET column1=value1, column2=value2,... [WHERE expr]

Polecenie to składa się ze słowa kluczowego UPDATE, po którym następuje nazwa tabeli z obiektami przeznaczonymi do aktualizacji. Po słowie kluczowym SET należy podać w postaci listy rozdzielanej przecinkami nazwę kolumny i wartość, na którą ma zostać zmieniona kolumna. Wyrażenie klauzuli WHERE podaje wiersz lub wiersze do aktualizacji rekordów.

DELETE

Polecenie delete służy do usuwania rekordów tabeli.
sql-statement  ::=  DELETE FROM [database-name.] table-name [WHERE expr]

Polecenie składa się ze słów kluczowych DELETE FROM, po których następuje nazwa tabeli, w której znajdują się rekordy do usunięcia.

Jeśli nie zostanie użyta klauzula WHERE, wszystkie wiersze tabeli zostaną usunięte. Użycie klauzuli WHERE powoduje, że usuwane są jedynie te wiersze, które odpowiadają wyrażeniu. Wynikiem wyrażenia klauzuli WHERE musi być wartość logiczna. Definicje dopuszczalnych wyrażeń znajdują się w sekcji Wyrażenia.

Instrukcje opisu danych

Instrukcje opisu danych służą do tworzenia, modyfikowania i usuwania obiektów baz danych takich jak widoki, indeksy i wyzwalacze. Obsługiwane są następujące instrukcje opisu danych:
  • Tabele:
    • CREATE TABLE

    • ALTER TABLE

    • DROP TABLE

  • Indeksy:
    • CREATE INDEX

    • DROP INDEX

  • Widoki:
    • CREATE VIEWS

    • DROP VIEWS

  • Wyzwalacze:
    • CREATE TRIGGERS

    • DROP TRIGGERS

CREATE TABLE

Instrukcja CREATE TABLE składa się ze słów kluczowych CREATE TABLE, po których następuje nazwa nowej tabeli oraz lista definicji i ograniczeń kolumn (w nawiasach). Nazwa tabeli może być identyfikatorem lub ciągiem znaków.
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]*

Każda definicja kolumny składa się z nazwy kolumny, po której następuje jej typ danych oraz jedno lub więcej opcjonalnych ograniczeń. Typ danych kolumny określa, jakie dane mogą być w niej przechowywane. Jeśli nastąpi próba zapisania wartości w kolumnie z innym typem danych, środowisko wykonawcze przekształci wartość na właściwy typ, jeśli istnieje taka możliwość, lub zgłoszony zostanie błąd. Dodatkowe informacja znajdują się w sekcji Obsługa typów danych.

Ograniczenie NOT NULL kolumny wskazuje, że kolumna nie może zawierać wartości NULL.

Ograniczenie UNIQUE powoduje utworzenie indeksu dla określonej kolumny lub kolumn. Indeks musi zawierać unikatowe klucze — dla określonej kolumny/kolumn nie mogą istnieć dwa wiersze zawierające te same wartości lub ich kombinacje. Instrukcja CREATE TABLE może posiadać wiele ograniczeń UNIQUE, łącznie z kolumnami z ograniczeniem UNIQUE w definicji kolumny i/lub ograniczeniami UNIQUE na poziomie tabeli.

Ograniczenie CHECK definiuje wyrażenie, dla którego wyznaczana jest wartość i które musi być prawdziwe, aby możliwe było wstawienie lub aktualizacja danych wiersza. Wynikiem wyrażenia klauzuli CHECK musi być wartość logiczna.

Klauzula COLLATE w definicji kolumny określa jaka funkcja porównania tekstu będzie używana podczas porównywania wpisów tekstowych dla kolumny. Domyślnie używaną funkcją porównania jest BINARY. Szczegóły klauzuli COLLATE i funkcji porównania znajdują się w sekcji COLLATE.

Ograniczenie DEFAULT określa domyślną wartość używaną podczas wykonywania instrukcji INSERT. Wartością może być NULL, stały ciąg znaków lub liczba. Wartością domyślną może być także jedno ze specjalnych słów kluczowych CURRENT_TIME, CURRENT_DATE lub CURRENT_TIMESTAMP, dla których wielkość liter nie jest rozróżniana. Jeśli wartością jest NULL, stały ciąg znaków lub liczba, wstawiana jest ona bezpośrednio do kolumny, o ile w instrukcji INSERT nie została określona wartość dla kolumny. Jeśli wartością jest CURRENT_TIME, CURRENT_DATE lub CURRENT_TIMESTAMP, do kolumny wstawiona zostanie bieżąca data i/lub czas UTC. Formatem dla wartości CURRENT_TIME jest GG:MM:SS. Formatem dla wartości CURRENT_DATE jest RRRR-MM-DD. Formatem dla wartości CURRENT_TIMESTAMP jest RRRR-MM-DD GG:MM:SS.

Określenie ograniczenia PRIMARY KEY tworzy zazwyczaj indeks UNIQUE dla odpowiedniej kolumny lub kolumn. Jeśli jednak ograniczenie PRIMARY KEY zostało ustawione dla pojedynczej kolumny z typem danych INTEGER (lub z jednym z jego synonimów, np. int), kolumna będzie używana przez bazę danych jako bieżący klucz główny tabeli. Oznacza to, że kolumna może przechowywać tylko niepowtarzalne wartości całkowite. (Należy pamiętać, że chociaż w wielu implementacjach SQLite tylko typ kolumn INTEGER powoduje używanie kolumny jako wewnętrznego klucza głównego, w Adobe AIR synonimy INTEGER takie, jak int, również powodują takie działanie.)

Jeśli tabela nie ma kolumny INTEGER PRIMARY KEY, podczas wstawiania wiersza automatycznie zostanie wygenerowany klucz z liczbą całkowitą. Do klucza głównego wiersza zawsze można uzyskać dostęp za pomocą jednej z nazw specjalnych ROWID, OID lub _ROWID_. Nazw tych można używać bez względu na to, czy kolumna INTEGER PRIMARY KEY została zadeklarowana jawnie, czy klucz główny został wygenerowany automatycznie. Jeśli jednak tabela zawiera jawną kolumnę INTEGER PRIMARY KEY, nazwa kolumny w danych wynikowych jest bieżącą nazwą kolumny, a nie nazwą specjalną.

Kolumna INTEGER PRIMARY KEY może zawierać także słowo kluczowe AUTOINCREMENT. Jeśli używane jest słowo kluczowe AUTOINCREMENT, baza danych automatycznie generuje i wstawia sekwencyjnie inkrementowany klucz oparty na liczbie całkowitej w kolumnie INTEGER PRIMARY KEY podczas wykonywania instrukcji INSERT, która nie określa jawnej wartości dla kolumny.

W instrukcji CREATE TABLE może znajdować się tylko jedno ograniczenie PRIMARY KEY. Może być częścią definicji kolumny lub pojedynczym ograniczeniem PRIMARY KEY na poziomie tabeli. Klucz główny tabeli niejawnie posiada ograniczenie NOT NULL.

Opcjonalny argument klauzula_konfliktu poprzedzony wieloma ograniczeniami umożliwia użycie domyślnie alternatywnego algorytmu rozwiązywania konfliktów dla tych ograniczeń. Ustawieniem domyślnym jest ograniczenie ABORT. Różne ograniczenia tej samej tabeli mogą posiadać inne domyślne algorytmy rozwiązywania konfliktów. Jeśli w instrukcji INSERT lub UPDATE wskazywany jest inny algorytm rozwiązywania konfliktów, zostanie on użyty zamiast algorytmu określonego w instrukcji CREATE TABLE. Dodatkowe informacje zawiera punkt dotyczący klauzuli ON CONFLICT w sekcji Instrukcje i klauzule specjalne .

Zastosowanie dodatkowych ograniczeń (np. ograniczeń FOREIGN KEY) nie skutkuje błędem, ale zostaną one zignorowane przez środowisko wykonawcze.

Jeśli między słowami CREATE i TABLE pojawi się słowo kluczowe TEMP lub TEMPORARY, utworzona w ten sposób tabela będzie widoczna jedynie w tym samym połączeniu bazy danych (w instancji SQLConnection). Jest usuwana automatycznie po zamknięciu połączenia bazy danych. Wszelkie indeksy utworzone dla tymczasowej tabeli są także tymczasowe. Tymczasowe tabele i indeksy są zapisywane w oddzielnym pliku (nie w pliku głównym bazy danych).

Jeśli określony został opcjonalny prefiks nazwa_bazy_danych, w nazwanej bazie danych utworzona zostanie tabela (baza danych podłączona do instancji SQLConnection za pomocą wywołania metody attach() z określoną nazwą bazy danych). Błędem jest określenie prefiksu nazwa_bazy_danych oraz słowa kluczowego TEMP chyba, że prefiks nazwa_bazy_danych ma wartość temp. Jeśli nie określono żadnej nazwy bazy danych i brak słowa kluczowego TEMP, tabela utworzona zostanie w głównej bazie danych (w bazie danych podłączonej do instancji SQLConnection za pomocą metody open() lub openAsync()).

Nie istnieją limity dotyczące liczby kolumn i ograniczeń w tabeli. Nie ma również limitów ilości danych w wierszu.

Instrukcja CREATE TABLE AS definiuje tabelę jako zestaw wynikowy zapytania. Nazwy kolumn tabeli są nazwami kolumn w wyniku.

Jeśli obecna jest opcjonalna klauzula IF NOT EXISTS i istnieje już inna tabela z tą samą nazwą, polecenie CREATE TABLE zostanie zignorowane przez bazę danych.

Tabelę można usunąć za pomocą instrukcji DROP TABLE, a niewielkich zmian można dokonywać za pomocą instrukcji ALTER TABLE.

ALTER TABLE

Polecenie ALTER TABLE umożliwia użytkownikom zmianę nazwy lub dodawanie nowej kolumny do istniejącej tabeli. Nie jest możliwe usunięcie kolumny z tabeli.

sql-statement ::= ALTER TABLE [database-name.] table-name alteration 
alteration    ::= RENAME TO new-table-name 
alteration    ::= ADD [COLUMN] column-def

Składnia polecenia RENAME TO służy do zmiany nazwy tabeli identyfikowanej argumentem [nazwa_bazy_danych. ] nazwa_tabeli na nowa_nazwa_tabeli. To polecenie nie może być używane do przenoszenia tabeli między dołączonymi bazami danych; służy jedynie do zmiany nazwy tabeli w tej samej bazie danych.

Jeśli tabela, której zmieniono nazwę, ma wyzwalacze lub indeksy, po zmianie pozostaną one nadal do niej dołączone. Jeśli jednak istnieją jakiekolwiek definicje widoków lub instrukcje wykonane przez wyzwalacze, które odnoszą się do tabeli, dla której zmieniono nazwę, nie zostaną one automatycznie zmodyfikowane do używania nowej nazwy tabeli. Jeśli z tabelą, dla której zmieniono nazwę, skojarzone są widoki lub wyzwalacze, należy ręcznie usunąć i ponownie utworzyć wyzwalacze lub definicje widoków, używając nowej nazwy tabeli.

Składnia polecenia ADD [COLUMN] służy do dodawania nowej kolumny do istniejącej tabeli. Nowa kolumna jest zawsze dołączana na końcu listy istniejących kolumn. Klauzula definicja_kolumny może przyjąć dowolną postać dopuszczalną w instrukcji CREATE TABLE, z następującymi zastrzeżeniami:

  • Kolumna nie może posiadać ograniczenia PRIMARY KEY lub UNIQUE.

  • Kolumna nie może posiadać wartości domyślnej CURRENT_TIME, CURRENT_DATE lub CURRENT_TIMESTAMP.

  • Jeśli zostało określone ograniczenie NOT NULL, domyślną wartością kolumny nie może być NULL.

Czas wykonania instrukcji ALTER TABLE nie jest zależny od ilości danych w tabeli.

DROP TABLE

Instrukcja DROP TABLE usuwa tabelę dodaną za pomocą instrukcji CREATE TABLE. Usuwana jest tabela o nazwie określonej argumentem nazwa_tabeli. Zostanie ona całkowicie usunięta z bazy danych i pliku dyskowego. Przywrócenie tabeli nie jest możliwe. Usuwane są również wszystkie indeksy skojarzone z tabelą.
sql-statement  ::=  DROP TABLE [IF EXISTS] [database-name.] table-name

Domyślnie instrukcja DROP TABLE nie zmniejsza rozmiaru pliku bazy danych. Pusta przestrzeń w bazie danych jest zachowywana i użyta zostanie w kolejnych operacjach INSERT. Aby usunąć wolną przestrzeń z bazy danych, należy użyć metody SQLConnection.clean(). Jeśli podczas początkowego tworzenia bazy danych parametr autoClean został ustawiony na wartość true, przestrzeń jest zwalniana automatycznie.

Opcjonalna klauzula IF EXISTS zapobiega zgłoszeniu błędu, który pojawiłby się, gdyby tabela nie istniała.

CREATE INDEX

Polecenie CREATE INDEX składa się ze słów kluczowych CREATE INDEX, po których następuje nazwa nowego indeksu, słowa kluczowego ON, nazwy uprzednio utworzonej tabeli, która ma być indeksowana, oraz listy nazw kolumn tabeli ujętej w nawiasy, której wartości są używane dla klucza indeksu.

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]

Słowo kluczowe ASC lub DESC może występować po każdej nazwie kolumny, aby wskazywać porządek sortowania, jednak wyznaczanie porządku jest ignorowane przez środowisko wykonawcze. Sortowanie jest zawsze wykonywane w porządku rosnącym.

Klauzula COLLATE występująca po każdej nazwie kolumny definiuje sekwencję porównującą dla wartości tekstowych danej kolumny. Domyślna sekwencja porównania jest sekwencją zdefiniowaną dla danej kolumny w instrukcji CREATE TABLE. Jeśli nie określono żadnej sekwencji porównania, użyta zostanie sekwencja BINARY. Definicja klauzuli COLLATE oraz funkcje porównania znajdują się w sekcji COLLATE.

Nie istnieją ograniczenia dotyczące liczby indeksów, które można dołączyć do jednej tabeli. Nie ma również ograniczeń dotyczących liczby kolumn indeksu.

DROP INDEX

Instrukcja DROP INDEX usuwa indeks dodany za pomocą instrukcji CREATE INDEX. Określony indeks zostaje całkowicie usunięty z pliku bazy danych. Jedynym sposobem przywrócenia indeksu jest ponowne wprowadzenie właściwego polecenia CREATE INDEX.

sql-statement ::= DROP INDEX [IF EXISTS] [database-name.] index-name

Domyślnie instrukcja DROP INDEX nie zmniejsza rozmiaru pliku bazy danych. Pusta przestrzeń w bazie danych jest zachowywana i użyta zostanie w kolejnych operacjach INSERT. Aby usunąć wolną przestrzeń z bazy danych, należy użyć metody SQLConnection.clean(). Jeśli podczas początkowego tworzenia bazy danych parametr autoClean został ustawiony na wartość true, przestrzeń jest zwalniana automatycznie.

CREATE VIEW

Polecenie CREATE VIEW przypisuje nazwę do predefiniowanej instrukcji SELECT. Ta nowa nazwa może być następnie użyta w klauzuli FROM następnej instrukcji SELECT w miejsce nazwy tabeli. Widoki służą zazwyczaj do uproszczenia zapytań przez połączenie złożonego (i często używanego) zestawu danych w jedną strukturę, która może być następnie używana w innych operacjach.

sql-statement ::= CREATE [TEMP | TEMPORARY] VIEW [IF NOT EXISTS] [database-name.] view-name AS select-statement

Jeśli między słowami CREATE i VIEW pojawi się słowo kluczowe TEMP lub TEMPORARY, utworzony w ten sposób widok będzie widoczny jedynie w instancji SQLConnection, która spowodowała otwarcie bazy danych, i zostanie automatycznie usunięty po zamknięciu bazy danych.

Jeśli określony został prefiks [nazwa_bazy_danych], w nazwanej bazie danych utworzony zostanie widok (baza danych podłączona do instancji SQLConnection za pomocą wywołania metody attach(), z określonym argumentem name. Błędem jest określenie prefiksu nazwa_bazy_danych oraz słowa kluczowego TEMP chyba, że prefiks [nazwa_bazy_danych] ma wartość temp. Jeśli nie określono żadnej nazwy bazy danych i brak słowa kluczowego TEMP, widok utworzony zostanie w głównej bazie danych (w bazie danych podłączonej do instancji SQLConnection za pomocą metody open() lub openAsync()).

Widoki mają atrybut tylko do odczytu. Instrukcji DELETE, INSERT ani UPDATE nie można użyć dla widoku, o ile nie zdefiniowano co najmniej jednego wyzwalacza skojarzonego typu (INSTEAD OF DELETE, INSTEAD OF INSERT, INSTEAD OF UPDATE). Aby uzyskać więcej informacji na temat tworzenia wyzwalacza dla widoku, patrz opis instrukcji CREATE TRIGGER.

Widok można usunąć z bazy danych za pomocą instrukcji DROP VIEW.

DROP VIEW

Instrukcja DROP VIEW usuwa widok utworzony za pomocą instrukcji CREATE VIEW.

sql-statement ::= DROP VIEW [IF EXISTS] view-name

Parametr nazwa_widoku jest nazwą widoku do usunięcia. Jest on usuwany z bazy danych, nie są jednak modyfikowane żadne dane w tabelach podstawowych.

CREATE TRIGGER

Instrukcja create trigger służy do dodawania wyzwalaczy do schematu bazy danych. Wyzwalacz jest operacją wykonywaną na bazie danych automatycznie (czynność_wyzwalacza) po wystąpieniu określonego zdarzenia bazy danych (zdarzenie_bazy_danych).

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]*

Wyzwalacz jest skonfigurowany tak, aby aktywował się za każdym razem po zdarzeniu DELETE, INSERT lub UPDATE konkretnej tabeli bazy danych, lub za każdym razem po wystąpieniu zdarzenia UPDATE dla jednej lub większej liczby kolumn tabeli. Wyzwalacze mają charakter stały, o ile nie zostanie użyte słowo kluczowe TEMP lub TEMPORARY. W takim przypadku wyzwalacz zostaje usunięty po zamknięciu połączenia głównej bazy danych instancji SQLConnection. Jeśli nie określono pory (za pomocą parametrów BEFORE lub AFTER), domyślnie przyjmowana jest wartość BEFORE.

Obsługiwane są wyłącznie wyzwalacze FOR EACH ROW, dlatego tekst FOR EACH ROW jest opcjonalny. W przypadku wyzwalacza FOR EACH ROW instrukcje krok_wyzwalacza są wykonywane dla każdego wstawianego, aktualizowanego lub usuwanego wiersza bazy danych; zdarzenia te powodują aktywację wyzwalacza na podstawie wartości true wyrażenia klauzuli WHEN.

Jeśli podano klauzulę WHEN, instrukcje SQL określone jako kroki_wyzwalacza są wykonywane wyłącznie dla wierszy, dla których klauzula WHEN ma wartość true. Jeśli nie została podana klauzula WHEN, instrukcje SQL są wykonywane dla wszystkich wierszy.

W treści wyzwalacza (klauzula czynność_wyzwalacza) wartości przed_zmianą i po_zmianie danej tabeli są dostępne pod nazwami tabel specjalnych OLD i NEW. Struktura tabel OLD i NEW odpowiada strukturze tabel, dla których utworzono wyzwalacz. Tabela OLD zawiera wszystkie wiersze zmodyfikowane lub usunięte w drodze aktywacji instrukcji, w ich stanie sprzed wyzwolenia operacji instrukcji. Tabela NEW zawiera wszystkie wiersze zmodyfikowane lub utworzone w drodze aktywacji instrukcji, w ich stanie po wyzwoleniu operacji instrukcji. Zarówno klauzula WHEN jak i instrukcje krok_wyzwalacza mogą uzyskiwać dostęp do wartości z wstawianych, usuwanych lub aktualizowanych wierszy za pomocą odwołań w postaci NEW.nazwa_kolumny i OLD.nazwa_kolumny, gdzie nazwa_kolumny jest nazwą kolumny z tabeli, z którą skojarzono wyzwalacz. Dostępność odwołań do tabel OLD i NEW zależy od typu zdarzenia_bazy_danych obsługiwanego przez wyzwalacz:

  • odwołania INSERT – NEW są prawidłowe

  • odwołania UPDATE – NEW i OLD są prawidłowe

  • odwołania DELETE – OLD są prawidłowe

Podana pora (BEFORE, AFTER lub INSTEAD OF) określa, kiedy względem zdarzeń wstawienia, modyfikacji lub usunięcia danego wiersza wykonywane są instrukcje krok_wyzwalacza. Klauzula ON CONFLICT może zostać określona jako część instrukcji UPDATE lub INSERT w kroku_wyzwalacza. Jeśli jednak klauzulę ON CONFLICT podano jako część instrukcji powodującej aktywację wyzwalacza, wówczas zamiast niej używana jest ta strategia obsługi konfliktu.

Ponadto poza wyzwoleniem tabeli można utworzyć wyzwalacz INSTEAD OF dla widoku. Jeśli w widoku zdefiniowany jest jeden lub większa liczba wyzwalaczy INSTEAD OF INSERT, INSTEAD OF DELETE lub INSTEAD OF UPDATE, wykonanie w widoku instrukcji skojarzonego typu (INSERT, DELETE lub UPDATE) nie jest traktowane jako błąd. W takim przypadku wykonanie w widoku instrukcji INSERT, DELETE lub UPDATE spowoduje uruchomienie skojarzonych wyzwalaczy. Wyzwalaczem jest INSTEAD OF, dlatego tabele źródłowe dla widoku nie są modyfikowane przez instrukcję, która wywołuje uruchomienie wyzwalacza. Jednak wyzwalacze mogą służyć do wykonywania operacji modyfikowania tabel źródłowych.

W przypadku tworzenia wyzwalacza w tabeli z kolumną INTEGER PRIMARY KEY należy pamiętać o jednej istotnej kwestii. Jeśli wyzwalacz BEFORE modyfikuje kolumnę INTEGER PRIMARY KEY należącą do wiersza, który ma zostać zaktualizowany przez instrukcję powodującą uruchomienie wyzwalacza, wówczas nie dochodzi do aktualizacji. Sposobem na obejście tego problemu jest utworzenie tabeli z kolumną PRIMARY KEY zamiast kolumny INTEGER PRIMARY KEY.

Wyzwalacz można usunąć za pomocą instrukcji DROP TRIGGER. Usunięcie tabeli lub widoku powoduje również automatyczne usunięcie wszystkich wyzwalaczy skojarzonych z tą tabelą lub widokiem.

Funkcja RAISE()

W instrukcji krok_wyzwalacza wyzwalacza może być używana specjalna funkcja SQL RAISE(). Ta funkcja ma następującą składnię:

raise-function  ::=  RAISE ( ABORT, error-message ) | 
                     RAISE ( FAIL, error-message ) | 
                     RAISE ( ROLLBACK, error-message ) | 
                     RAISE ( IGNORE )

Jeśli podczas wykonywania wyzwalacza zostanie wywołana jedna z tych trzech form, zostanie wykonana określona operacja przetwarzania ON CONFLICT (ABORT, FAIL lub ROLLBACK) i wykonanie bieżącej instrukcji zostaje zakończone. ROLLBACK jest traktowane jako niepowodzenie wykonania instrukcji, dlatego instancja SQLStatement, dla której wykonywana była metoda execute(), wywołuje zdarzenie error (SQLErrorEvent.ERROR). Obiekt SQLError we właściwości error obiektu wywoływanego zdarzenia zawiera właściwość details ustawioną na komunikat_o_błędzie określony w funkcji RAISE().

Po wywołaniu funkcji RAISE(IGNORE) wykonanie pozostałej części bieżącego wyzwalacza — instrukcji, która spowodowała wykonanie wyzwalacza — a także poszczególnych kolejnych wyzwalaczy, które zostałyby wykonane, zostaje zaniechane. Żadne zmiany w bazie danych nie są wycofywane. Jeśli instrukcja, które spowodowała uruchomienie wyzwalacza jest częścią wyzwalacza, wówczas wyzwalacz wznawia działanie na początku kolejnego kroku. Więcej informacji o algorytmach rozwiązywania konfliktów zawiera sekcja ON CONFLICT (algorytmy rozwiązywania konfliktów).

DROP TRIGGER

Instrukcja DROP TRIGGER usuwa wyzwalacz utworzony przez instrukcję CREATE TRIGGER.

sql-statement  ::=  DROP TRIGGER [IF EXISTS] [database-name.] trigger-name

Wyzwalacz zostaje usunięty z bazy danych. Należy zauważyć, że wyzwalacze są automatycznie usuwane w przypadku usuwania skojarzonych z nimi tabel.

Instrukcje i klauzule specjalne

W niniejszej sekcji opisano niektóre klauzule, które są rozszerzeniami SQL udostępnianymi przez środowisko wykonawcze, a także dwa elementy językowe, które mogą być używane w wielu instrukcjach, komentarzach i wyrażeniach.

COLLATE

Klauzula COLLATE jest używana w instrukcjach SELECT, CREATE TABLE i CREATE INDEX w celu określenia algorytmu porównania służącego do porównywania i sortowania wartości.

sql-statement   ::=  COLLATE collation-name 
collation-name  ::=  BINARY | NOCASE

Domyślny typ porównania dla kolumn to BINARY. Gdy porównanie BINARY jest używane z wartościami z klasy TEXT, wykonywane jest porównanie binarne — porównane są bajty w pamięci, które reprezentują wartość (bez względu na kodowanie tekstu).

Sekwencja porównania NOCASE jest stosowana tylko dla wartości z klasy TEXT. W przypadku NOCASE nie są porównywane wielkości znaków.

Dla klas typu NULL, BLOB, INTEGER oraz REAL nie są używane żadne sekwencje porównania.

Aby dla kolumny użyć porównania typu innego niż BINARY, należy określić klauzulę COLLATE jako część definicji kolumny w instrukcji CREATE TABLE. Zawsze przy porównywaniu dwóch wartości TEXT stosowana jest sekwencja porównania w celu określenia wyników porównania zgodnie z następującymi regułami:

  • W przypadku binarnych operatorów porównywania, jeśli którykolwiek z operandów jest kolumną, wówczas domyślny typ porównania kolumny określa stosowaną sekwencję porównania. Jeśli obydwa operandy są kolumnami, wówczas typ porównania operandu po lewej stronie określa używaną sekwencję porównania. Jeśli żaden z operandów nie jest kolumną, wówczas stosowana jest sekwencja porównania BINARY.

  • Operator BETWEEN...AND jest równoważny użyciu dwóch wyrażeń z operatorami >= i <=. Przykład: wyrażenie x BETWEEN y AND z jest równoważne x >= y AND x <= z. W rezultacie poprzednia reguła określania sekwencji porównania dotyczy również operatora BETWEEN...AND.

  • Operator IN działa jako operator = dla celów określania używanej sekwencji porównania. Przykład: sekwencja porównania używana dla wyrażenia x IN (y, z) jest domyślnym typem porównania x, pod warunkiem że x jest kolumną. W przeciwnym wypadku stosowane jest porównanie BINARY.

  • Do klauzuli ORDER BY, która jest częścią instrukcji SELECT można jawnie przypisywać sekwencję porównania, jaka będzie używana dla operacji sortowania. W takim przypadku zawsze używana jest jawna sekwencja porównywania. W przeciwnym wypadku, jeśli wyrażenie posortowane przez klauzulę ORDER BY jest kolumną, w celu określenia kolejności sortowania kolumny używany jest domyślny typ sortowania. Jeśli wyrażenie nie jest kolumną, stosowana jest sekwencja sortowania BINARY.

EXPLAIN

Modyfikator polecenia EXPLAIN jest niestandardowym rozszerzeniem SQL.

sql-statement  ::=  EXPLAIN sql-statement

Jeśli słowo kluczowe EXPLAIN pojawia się przed jakąkolwiek instrukcją SQL, wówczas zamiast rzeczywistego wykonania polecenia wyniki obejmują sekwencję instrukcji z maszyny wirtualnej, jakie zostałyby użyte do wykonania polecenia, gdyby słowo kluczowe EXPLAIN nie było obecne. EXPLAIN jest elementem zaawansowanym, który umożliwia programistom zmianę tekstu instrukcji SQL w ramach prób optymalizacji działania lub debugowania instrukcji, która nie działa poprawnie.

ON CONFLICT (algorytmy rozwiązywania konfliktów)

Klauzula ON CONFLICT nie jest osobnym poleceniem SQL. Jest to niestandardowa klauzula, która może się pojawiać w wielu innych poleceniach SQL.

conflict-clause     ::=  ON CONFLICT conflict-algorithm 
conflict-clause     ::=  OR conflict-algorithm 
conflict-algorithm  ::=  ROLLBACK | 
                         ABORT | 
                         FAIL | 
                         IGNORE | 
                         REPLACE

Pierwsza forma klauzuli ON CONFLICT z użyciem słów kluczowych ON CONFLICT jest używana w instrukcji CREATE TABLE. Dla instrukcji INSERT lub UPDATE używana jest druga forma, w której ON CONFLICT zostało zastąpione przez OR, dzięki czemu składnia jest bardziej naturalna. Przykład: zamiast INSERT ON CONFLICT IGNORE instrukcja ma formę INSERT OR IGNORE. Mimo że słowa kluczowe są różne, znaczenie klauzuli jest takie samo w każdej formie.

Klauzula ON CONFLICT określa algorytm, jaki jest używany w celu rozwiązania konfliktów z ograniczeniami. Istnieje pięć algorytmów: ROLLBACK, ABORT, FAIL, IGNORE i REPLACE. Algorytmem domyślnym jest ABORT. Poniżej przedstawiono wyjaśnienie dotyczące pięciu algorytmów rozwiązywania konfliktów:

ROLLBACK
Gdy dojdzie do naruszenia ograniczenia, następuje natychmiastowe wykonanie algorytmu ROLLBACK, co powoduje zakończenie bieżącej transakcji. Polecenie kończy działanie, a instancja SQLStatement wywołuje zdarzenie error. Jeśli nie jest aktywna żadna transakcja (inna niż niejawna transakcja tworzona w wyniku każdego polecenia), wówczas ten algorytm działa tak samo, jak ABORT.

ABORT
Jeśli dojdzie do naruszenia ograniczenia, polecenie wycofuje wszelkie zmiany, jakie mogło wykonać, a instancja SQLStatement wywołuje zdarzenie error. Nie jest wykonywana operacja ROLLBACK, dlatego zmiany z poprzednich poleceń w ramach danej transakcji zostaną zachowane. ABORT jest działaniem domyślnym.

FAIL
Jeśli dojdzie do naruszenia ograniczenia, działanie polecenia zostaje przerwane, a instrukcja SQLStatement wywołuje zdarzenie error. Jednak zmiany w bazie danych, jakie spowodowała instrukcja przed naruszeniem ograniczenia, zostają zachowane i nie są wycofywane. Przykład: jeśli instrukcja UPDATE napotka naruszenie ograniczenia w 100. wierszu, który aktualizuje, wówczas zmiany w pierwszych 99 wierszach zostają zachowane. Nie dochodzi do zmiany w wierszu 100. ani w kolejnych.

IGNORE
Jeśli dojdzie do naruszenia ograniczenia, wiersz, w którym doszło do naruszenia, nie jest wstawiany ani zmieniany. Ten wiersz jest ignorowany, a poza nim polecenie jest wykonywane w sposób normalny. Inne wiersze przed i po wierszu, w którym doszło do naruszenia ograniczenia, są wstawiane lub aktualizowane normalnie. Nie jest zwracany żaden błąd.

REPLACE
Jeśli dojdzie do naruszenia ograniczenia UNIQUE, istniejące wcześniej wiersze, które powodują naruszenie ograniczenia, są usuwane przed wstawieniem lub aktualizacją bieżącego wiersza. W konsekwencji zawsze dochodzi do wstawienia lub aktualizacji, a polecenie jest wykonywane normalnie. Nie jest zwracany żaden błąd. Jeśli dojdzie do naruszenia ograniczenia NOT NULL, wartość NULL jest zastępowana domyślną wartością z danej kolumny. Jeśli kolumna nie zawiera wartości domyślnej, wówczas używany jest algorytm ABORT. Jeśli dojdzie do naruszenia ograniczenia CHECK, wówczas używany jest algorytm IGNORE. Jeśli taka strategia rozwiązywania konfliktów spowoduje usunięcie wierszy w celu spełnienia ograniczenia, dla tych wierszy nie dochodzi do wywołania wyzwalaczy usuwania.

Algorytm określony w klauzuli OR instrukcji INSERT lub UPDATE zastępuje algorytm określony w instrukcji CREATE TABLE. Jeśli w instrukcji CREATE TABLE nie jest określony żaden algorytm lub wykonywana jest instrukcja INSERT albo UPDATE, używany jest algorytm ABORT.

REINDEX

Polecenie REINDEX służy do usuwania i odtwarzania jednego lub większej liczby indeksów. To polecenie jest bardzo użyteczne w przypadku zmiany definicji sekwencji porównania.

sql-statement  ::=  REINDEX collation-name 
sql-statement  ::=  REINDEX [database-name .] ( table-name | index-name )

W pierwszej formie następuje odtworzenie wszystkich indeksów w dołączonych bazach danych, w których używana jest nazwana sekwencja porównania. W drugiej formie, gdy określona jest nazwa_tabeli, odtwarzane są wszystkie indeksy skojarzone z tabelą. Jeśli określona jest nazwa_indeksu, usuwany i odtwarzany jest tylko określony indeks.

KOMENTARZE

Komentarze nie są poleceniami SQL, ale pojawiają się w zapytaniach SQL. Są traktowane przez środowisko wykonawcze jako białe znaki. Mogą zaczynać się w dowolnym miejscu, w którym możliwe jest znalezienie odstępu — także w wyrażeniach, które obejmują wiele wierszy.

comment             ::=  single-line-comment | 
                         block-comment 
single-line-comment ::=  -- single-line 
block-comment       ::=  /* multiple-lines or block [*/]

Komentarz w jednym wierszu jest oznaczony dwoma kreskami. Komentarz w jednym wierszu musi się kończyć w bieżącym wierszu.

Bloki komentarzy mogą obejmować dowolną liczbę wierszy lub mogą być osadzone w jednym wierszu. Jeśli nie istnieje separator kończący, blok komentarza rozciąga się aż do końca wprowadzanych danych. Taka sytuacja nie jest traktowana jako błąd. Nowa instrukcja SQL może rozpoczynać się w wierszu po zakończeniu bloku komentarza. Bloki komentarza mogą być osadzone w dowolnych miejscach, w których mogą występować odstępy: wewnątrz wyrażeń lub w środku innych instrukcji SQL. Nie można zagnieżdżać bloków komentarzy. Komentarze w pojedynczym wierszu, umieszczane wewnątrz bloku komentarzy, są ignorowane.

WYRAŻENIA

Wyrażenia są podpoleceniami w innych blokach SQL. Poniżej przedstawiono poprawną składnię wyrażenia w instrukcji SQL:

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

Wyrażenie to dowolna kombinacja wartości i operatorów, które w wyniku dają pojedynczą wartość. Wyrażenia mogą być dzielone na dwa typy w zależności od tego, czy ich wynikiem jest wartość logiczna (true lub false) lub wartość inna niż logiczna.

W kilku częstych sytuacjach, między innymi w klauzuli WHERE, klauzuli HAVING, wyrażeniu ON w klauzuli JOIN oraz w wyrażeniu CHECK, wynikiem wyrażenia musi być wartość logiczna. Następujące typy wyrażeń spełniają ten warunek:

  • ISNULL

  • NOTNULL

  • IN ()

  • EXISTS ()

  • LIKE

  • GLOB

  • Niektóre funkcje

  • Niektóre operatory (w szczególności operatory porównania)

Wartości literałowe

Wartość literałowa jest pisana jako liczba całkowita lub liczba zmiennoprzecinkowa. Obsługiwana jest notacja naukowa. Znak kropki . jest zawsze używany jako separator dziesiętny.

Ciąg znaków literału jest zawsze ujęty w pojedyncze cudzysłowy '. Aby umieścić pojedynczy cudzysłów w ciągu znaków, należy umieścić dwa cudzysłowy w rzędzie jak w przykładzie: ''.

Literał logiczny ma wartość true lub false. Wartości logiczne literałów są używane z danymi w kolumnach logicznych.

Literał BLOB jest ciągiem znaków zawierającym dane szesnastkowe i poprzedzonym jednym znakiem x lub X, np. X'53514697465'.

Wartością literału może być również token NULL.

Nazwa kolumny

Nazwa kolumny może być dowolną nazwą zdefiniowaną w instrukcji CREATE TABLE lub jednym z następujących identyfikatorów specjalnych: ROWID, OID lub _ROWID_. Te identyfikatory specjalne opisują unikalny losowy klucz z liczbą całkowitą (klucz wiersza) skojarzony z każdym wierszem każdej tabeli. Te identyfikatory specjalne odwołują się również do klucza wiersza, pod warunkiem że instrukcja CREATE TABLE nie definiuje kolumny rzeczywistej o takiej samej nazwie. Klucze wierszy działają jak kolumny tylko do odczytu. Klucze wierszy mogą być używane w dowolnych miejscach, w których możliwe jest użycie normalnej kolumny — wartości klucza wiersza nie można zmieniać jedynie w instrukcji UPDATE lub INSERT. Zestaw wynikowy instrukcji SELECT * FROM nie zawiera klucza wiersza.

Instrukcja SELECT

Instrukcja SELECT może pojawiać się w wyrażeniu jako operand po prawej stronie operatora IN, jako wielkość skalarna (wartość pojedynczego wyniku) lub jako operand operatora EXISTS. Jeśli jest używana jako wielkość skalarna lub operand operatora IN, instrukcja SELECT może zawierać tylko jedną kolumnę wyników. Dozwolone jest stosowanie złożonych instrukcji SELECT (połączone słowami kluczowymi takimi jak UNION lub EXCEPT). Jeśli stosowany jest operator EXISTS, kolumny w zestawie wynikowym instrukcji SELECT są ignorowane, a wyrażenie zwraca TRUE, jeśli istnieje jeden lub większa liczba wierszy oraz FALSE, jeśli zestaw wynikowy jest pusty. Jeśli żaden termin w wyrażeniu SELECT nie dotyczy wartości w zapytaniu zawierającym, wówczas wyrażenie zostaje ocenione przed dalszym przetwarzaniem, a wynik jest wykorzystywany ponownie w zależności od potrzeb. Jeśli wyrażenie SELECT nie zawiera zmiennych z zapytania zewnętrznego (określanego jako podzapytanie skorelowane), wówczas wyrażenie SELECT jest oceniane ponownie zawsze, gdy zachodzi potrzeba.

Jeśli wyrażenie SELECT jest prawym operandem operatora IN, operator IN zwraca TRUE, jeśli wynik lewego operandu jest równy którejkolwiek wartości z zestawu wynikowego instrukcji SELECT. Operator IN można poprzedzić słowem kluczowym NOT w celu zmiany sensu testu.

Jeśli instrukcja SELECT pojawia się w wyrażeniu, ale nie jest prawym operandem operatora IN, wówczas pierwszy wiersz wyniku SELECT staje się wartością używaną w wyrażeniu. Jeśli instrukcja SELECT powoduje uzyskanie więcej niż jednego wierszu wynikowego, wszystkie wiersze po pierwszym są ignorowane. Jeśli instrukcja SELECT nie zwraca żadnych wierszy, wówczas wartością SELECT jest NULL.

Wyrażenie CAST

Wyrażenie CAST zmienia typ danych wartości na określony typ. Określony typ może być nazwą dowolnego niepustego typu, który jest poprawny dla typu w definicji kolumny instrukcji CREATE TABLE. Szczegółowe informacje zawiera sekcja Obsługa typów danych.

Dodatkowe elementy wyrażeń

Następujące elementy SQL mogą również być używane w wyrażeniach:

  • Funkcje wbudowane: Funkcje agregujące, skalarne oraz funkcje formatowania daty/godziny

  • Operatory

  • Parametry

Funkcje wbudowane

Funkcje wbudowane zostały podzielone na trzy główne kategorie:
  • Funkcje agregujące

  • Funkcje skalarne

  • Funkcje formatowania daty i godziny

Oprócz tych funkcji istnieje funkcja specjalna RAISE(), która jest używana do powiadamiania o błędach w wykonywaniu wyzwalacza. Ta funkcja może być używana tylko w treści instrukcji CREATE TRIGGER. Informacje na temat funkcji RAISE() można znaleźć w sekcji CREATE TRIGGER > RAISE().

W nazwach funkcji, podobnie jak we wszystkich słowach kluczowych SQL, nie jest sprawdzana wielkość liter.

Funkcje agregujące

Funkcje agregujące wykonują operacje na wartościach z wielu wierszy. Te funkcje są używane głównie w instrukcjach SELECT w połączeniu z klauzulą GROUP BY.

AVG(X)

Zwraca wartość średnią obiektów X o wartości innej niż NULL w grupie. Ciągi znaków i wartości BLOB, które nie przypominają liczb są interpretowane jako 0. Wynik AVG() jest zawsze wartością zmiennoprzecinkową, nawet jeśli wszystkie wartości wejściowe są liczbami całkowitymi.

COUNT(X) COUNT(*)

W pierwszej formie zwracana jest liczba obiektów X o wartości różnej od NULL w grupie. W drugiej formie (z argumentem *) zwraca całkowitą liczbę wierszy w grupie.

MAX(X)

Zwraca maksymalną wartość z wszystkich wartości w grupie. W celu określenia wartości maksymalnej stosowana jest standardowa kolejność sortowania.

MIN(X)

Zwraca minimalną wartość z wszystkich wartości innych niż NULL w grupie. W celu określenia wartości minimalnej stosowana jest standardowa kolejność sortowania. Jeśli wszystkie wartości w grupie są równe NULL, zwracana jest wartość NULL.

SUM(X)

TOTAL(X)

Zwraca liczbę będącą sumą wszystkich wartości w grupie różnych od NULL. Jeśli wszystkie wartości są równe NULL, wówczas SUM() zwraca NULL, a TOTAL() zwraca 0,0. Wynikiem funkcji TOTAL() jest zawsze wartość zmiennopozycyjna. Wynikiem funkcji SUM() jest liczba całkowita, jeśli wszystkie wartości wejściowe różne od NULL są liczbami całkowitymi. Jeśli którakolwiek wartość wejściowa funkcji SUM() nie jest liczbą całkowitą i nie jest równa NULL, wówczas funkcja SUM() zwraca wartość zmiennopozycyjną. Ta wartość może być przybliżoną wartością rzeczywistej sumy.

We wszystkich wymienionych wyżej jednoargumentowych funkcjach agregujących argument można poprzedzić słowem kluczowym DISTINCT. W takim przypadku elementy zduplikowane zostaną odfiltrowane przed przekazaniem do funkcji agregującej. Na przykład wywołanie funkcji COUNT(DISTINCT x) zwróci liczbę różnych wartości z kolumny X, a nie łączną liczbę wartości kolumny x różnych od NULL.

Funkcje skalarne

Funkcje skalarne operują na wartościach w poszczególnych wierszach, po jednym wierszu naraz.

ABS(X)

Zwraca wartość bezwzględną argumentu X.

COALESCE(X, Y, ...)

Zwraca kopię pierwszego argumentu różnego od NULL. Jeśli wszystkie argumenty są równe NULL, zwracana jest wartość NULL. Funkcja wymaga co najmniej dwóch argumentów.

GLOB(X, Y)

Ta funkcja służy do implementacji składni X GLOB Y.

IFNULL(X, Y)

Zwraca kopię pierwszego argumentu różnego od NULL. Jeśli oba argumenty są równe NULL, zwracana jest wartość NULL. Ta funkcja działa tak samo, jak COALESCE().

HEX(X)

Argument jest interpretowany jako wartość typu BLOB. Wynik jest zapisem szesnastkowym zawartości tej wartości.

LAST_INSERT_ROWID()

Zwraca identyfikator wiersza (wygenerowany klucz główny) ostatniego wiersza wstawionego do bazy danych za pośrednictwem bieżącego połączenia SQLConnection. Ta wartość jest taka sama, jak wartość zwracana przez właściwość SQLConnection.lastInsertRowID .

LENGTH(X)

Zwraca długość ciągu znaków X w znakach.

LIKE(X, Y [, Z])

Ta funkcja służy do implementacji składni X LIKE Y [ESCAPE Z] w języku SQL. Jeśli jest obecna opcjonalna klauzula ESCAPE, funkcja jest wywoływana z trzema argumentami. W przeciwnym razie jest wywoływana tylko z dwoma argumentami.

LOWER(X)

Zwraca kopię ciągu znaków X, w której wszystkie znaki są zamienione na małe litery.

LTRIM(X) LTRIM(X, Y)

Zwraca ciąg utworzony przez usunięcie spacji z lewej strony ciągu X. Jeśli został podany argument Y, funkcja usuwa wszelkie znaki występujące w ciągu Y z lewej strony ciągu X.

MAX(X, Y, ...)

Zwraca argument o maksymalnej wartości. Argumenty mogą być nie tylko liczbami, lecz również ciągami znaków. Maksymalna wartość jest określana na podstawie zdefiniowanej kolejności sortowania. Należy zwrócić uwagę, że MAX() jest funkcją prostą, gdy ma 2 lub więcej argumentów, albo funkcją agregującą, gdy ma jeden argument.

MIN(X, Y, ...)

Zwraca argument o minimalnej wartości. Argumenty mogą być nie tylko liczbami, lecz również ciągami znaków. Minimalna wartość jest określana na podstawie zdefiniowanej kolejności sortowania. Należy zwrócić uwagę, że MIN() jest funkcją prostą, gdy ma 2 lub więcej argumentów, albo funkcją agregującą, gdy ma jeden argument.

NULLIF(X, Y)

Zwraca pierwszy argument, jeśli argumenty są różne; w przeciwnym razie zwraca NULL.

QUOTE(X)

Ten podprogram zwraca ciąg znaków, który jest wartością jego argumentu w postaci nadającej się do włączenia do innej instrukcji SQL. Ciągi są ujmowane w apostrofy, a wewnętrzne cudzysłowy są w razie potrzeby poprzedzane znakami zmiany znaczenia. Wartości typu BLOB są kodowane jako literały szesnastkowe. Funkcja jest użyteczna przy pisaniu wyzwalaczy, gdy zachodzi potrzeba zaimplementowania funkcji cofania/ponawiania.

RANDOM(*)

Zwraca całkowitą liczbę pseudolosową z przedziału od -9223372036854775808 do 9223372036854775807. Ta wartość losowa nie jest silna kryptograficznie.

RANDOMBLOB(N)

Zwraca N-bajtową wartość BLOB zawierającą bajty pseudolosowe. Argument N powinien być dodatnią liczbą całkowitą. Ta wartość losowa nie jest silna kryptograficznie. Jeśli wartość N jest ujemna, zwracany jest pojedynczy bajt.

ROUND(X) ROUND(X, Y)

Zaokrągla liczbę X do Y cyfr po prawej stronie kropki dziesiętnej. Jeśli argument Y zostanie pominięty, przyjmowana jest wartość 0.

RTRIM(X) RTRIM(X, Y)

Zwraca ciąg utworzony przez usunięcie spacji z prawej strony ciągu X. Jeśli został podany argument Y, funkcja usuwa wszelkie znaki występujące w ciągu Y z prawej strony ciągu X.

SUBSTR(X, Y, Z)

Zwraca fragment ciągu znaków X, który rozpoczyna się od znaku nr Y i ma długość Z znaków. Pierwszy od lewej znak ciągu X ma numer 1. Jeśli wartość Y jest ujemna, pierwszy znak fragmentu znajdowany jest poprzez odliczanie znaków od prawej, a nie od lewej strony.

TRIM(X) TRIM(X, Y)

Zwraca ciąg utworzony przez usunięcie spacji z prawej strony ciągu X. Jeśli został podany argument Y, funkcja usuwa wszelkie znaki występujące w ciągu Y z prawej strony ciągu X.

TYPEOF(X)

Zwraca typ wyrażenia X. Możliwe wartości tej funkcji to: 'null', 'integer', 'real', 'text' i 'blob'. Więcej informacji na temat typów danych zawiera sekcja Obsługa typów danych.

UPPER(X)

Zwraca kopię ciągu znaków X, w której wszystkie litery są zamienione na wielkie.

ZEROBLOB(N)

Zwraca wartość BLOB zawierającą N bajtów o wartości 0x00.

Funkcje formatowania daty i godziny

Funkcje formatowania daty i godziny to grupa funkcji skalarnych, które służą do tworzenia sformatowanych wartości daty i godziny. Należy zwrócić uwagę, że te funkcje operują na ciągach znaków i liczbach oraz zwracają ciągi znaków i liczby. Nie są przeznaczone do użycia z danymi typu DATE. W przypadku użycia tych funkcji na danych w kolumnie, której zadeklarowanym typem danych jest DATE, ich działanie będzie różne od oczekiwanego.

DATE(T, ...)

Funkcja DATE() zwraca ciąg znaków zawierający datę w następującym formacie: RRRR-MM-DD Pierwszy parametr (T) określa ciąg znaków czasu w formacie opisanym w sekcji Formaty czasu. Po ciągu znaków czasu można określić dowolną liczbę modyfikatorów. Modyfikatory są opisane w sekcji Modyfikatory.

TIME(T, ...)

Funkcja TIME () zwraca ciąg znaków zawierający godzinę w formacie GG:MM:SS. Pierwszy parametr (T) określa ciąg znaków czasu w formacie opisanym w sekcji Formaty czasu. Po ciągu znaków czasu można określić dowolną liczbę modyfikatorów. Modyfikatory są opisane w sekcji Modyfikatory.

DATETIME(T, ...)

Funkcja DATETIME() zwraca ciąg znaków zawierający datę i godzinę w formacie RRRR-MM-DD GG:MM:SS. Pierwszy parametr (T) określa ciąg znaków czasu w formacie opisanym w sekcji Formaty czasu. Po ciągu znaków czasu można określić dowolną liczbę modyfikatorów. Modyfikatory są opisane w sekcji Modyfikatory.

JULIANDAY(T, ...)

Funkcja JULIANDAY() zwraca liczbę określającą liczbę dni, jaka upłynęła od południa w Greenwich dnia 24 października 4714 p.n.e do podanej daty. Pierwszy parametr (T) określa ciąg znaków czasu w formacie opisanym w sekcji Formaty czasu. Po ciągu znaków czasu można określić dowolną liczbę modyfikatorów. Modyfikatory są opisane w sekcji Modyfikatory.

STRFTIME(F, T, ...)

Podprogram STRFTIME() zwraca datę sformatowaną zgodnie z ciągiem formatującym określonym jako pierwszy argument F. Ciąg formatujący może zawierać następujące znaki zastępowane później wartościami:

%d - dzień miesiąca

%f - sekundy jako wartość ułamkowa SS.SSS

%H - godzina 00-24

%j - dzień roku 001-366

%J - numer dnia w kalendarzu juliańskim

%m -miesiąc 01-12

%M - minuta 00-59

%s - liczba sekund od dnia 1970-01-01

%S - sekundy 00-59

%w - dzień tygodnia 0-6 (niedziela = 0)

%W - tydzień roku 00-53

%Y - rok 0000-9999

%% - %

Drugi parametr (T) określa ciąg znaków czasu w formacie opisanym w sekcji Formaty czasu. Po ciągu znaków czasu można określić dowolną liczbę modyfikatorów. Modyfikatory są opisane w sekcji Modyfikatory.

Formaty czasu

Ciąg znaków czasu może być zapisany w jednym z następujących formatów:

RRRR-MM-DD

2007-06-15

RRRR-MM-DD GG:MM

2007-06-15 07:30

RRRR-MM-DD GG:MM:SS

2007-06-15 07:30:59

RRRR-MM-DD GG:MM:SS.SSS

2007-06-15 07:30:59.152

RRRR-MM-DDTGG:MM

2007-06-15T07:30

RRRR-MM-DDTGG:MM:SS

2007-06-15T07:30:59

RRRR-MM-DDTGG:MM:SS.SSS

2007-06-15T07:30:59,152

GG:MM

07:30 (data 2000-01-01)

GG:MM:SS

07:30:59 (data 2000-01-01)

GG:MM:SS.SSS

07:30:59:152 (data 2000-01-01)

now

Bieżąca data i godzina wg czasu UCT.

DDDD.DDDD

Numer dnia w kalendarzu juliańskim jako liczba zmiennopozycyjna

Znak T w tych formatach jest literalnym znakiem „T” oddzielającym datę od godziny. Dla formatów, w których zapisana jest tylko godzina, przyjmowana jest data 2001-01-01.

Modyfikatory

Po ciągu znaków czasu może następować zero lub więcej modyfikatorów, które zmieniają datę lub zmieniają jej interpretację. Dostępne są następujące modyfikatory:

NNN days

Liczba dni, jaką należy dodać do czasu.

NNN hours

Liczba godzin, jaką należy dodać do czasu.

NNN minutes

Liczba minut, jaką należy dodać do czasu.

NNN.NNNN seconds

Liczba sekund i milisekund, jaką należy dodać do czasu.

NNN months

Liczba miesięcy, jaką należy dodać do czasu.

NNN years

Liczba lat, jaką należy dodać do czasu.

start of month

Zmienia czas na najbliższy poprzedzający go początek miesiąca.

start of year

Zmienia czas na najbliższy poprzedzający go początek roku.

start of day

Zmienia czas na najbliższy poprzedzający go początek doby.

weekday N

Zmienia czas na najbliższy następujący dzień tygodnia o określonym numerze. (0 = niedziela, 1 = poniedziałek itd.)

localtime

Konwertuje datę na czas lokalny.

utc

Konwertuje datę na uniwersalny czas skoordynowany (UTC).

Operatory

W języku SQL można używać wielu różnych operatorów, w tym typowych operatorów, które istnieją w większości języków programowania, jak również kilku operatorów specyficznych dla języka SQL.

Typowe operatory

Wymienione poniżej operatory dwuargumentowe są dozwolone w bloku kodu SQL i zostały wymienione w kolejności od najwyższego do najniższego priorytetu:

*    /    % 
+    - 
<< >> &     | 
< >=   > >= 
=    ==   !=   <> IN 
AND 
OR

Obsługiwane operatory jednoargumentowe używane jako przedrostki:

 !    ~    NOT

Operator COLLATE można interpretować jako jednoargumentowy operator będący przyrostkiem. Operator COLLATE ma najwyższy priorytet. Zawsze wiąże argumenty silniej niż którykolwiek operator jednoargumentowy będący przedrostkiem lub jakikolwiek operator dwuargumentowy.

Należy zauważyć, że istnieją dwie wersje operatorów równości i nierówności. Równość może być wyrażona jako = albo ==. Operator nierówności może mieć postać ! = lub <>.

Operator || służy do konkatenacji ciągów znaków — łączy dwa ciągi będące jego operandami.

Operator % zwraca resztę z dzielenia modulo lewego operandu przez prawy operand.

Wynikiem każdego operatora dwuargumentowego jest wartość liczbowa. Wyjątkiem jest operator konkatenacji ||, który zwraca ciąg znaków.

Operatory SQL

LIKE

Operator LIKE porównuje wartości poprzez dopasowywanie do wzorca.

expr     ::=  (column-name | expr) LIKE pattern 
pattern  ::=  '[ string | % | _ ]'

Operand po prawej stronie operatora LIKE zawiera wzorzec, a operand po lewej stronie zawiera ciąg znaków, który należy dopasować do wzorca. Symbol procentu (%) we wzorcu to znak wieloznaczny — jest dopasowany do dowolnej sekwencji złożonej z zera lub więcej znaków w ciągu. Podkreślenie (_) we wzorcu jest dopasowywane do dowolnego pojedynczego znaku w ciągu. Każdy inny znak jest dopasowywany do identycznego znaku lub swojego małego/wielkiego odpowiednika, tzn. w dopasowaniach nie jest uwzględniana wielkość liter. (Uwaga: mechanizm bazy danych rozróżnia wielkie/małe litery tylko w przypadku 7-bitowych znaków alfabetu łacińskiego. Dlatego operator LIKE uwzględnia wielkość znaków 8-bitowych z zestawu iso8859 lub znaków z zestawu UTF-8. Na przykład wyrażenie 'a' LIKE 'A' jest równe TRUE, ale 'æ' LIKE 'Æ' jest równe FALSE). Rozróżnianie wielkości liter alfabetu łacińskiego można włączać i wyłączać za pomocą właściwości SQLConnection.caseSensitiveLike.

Jeśli występuje opcjonalna klauzula ESCAPE, wyrażenie po słowie kluczowym ESCAPE musi dawać w wyniku ciąg znaków składający się z jednego znaku. Ten znak może być używany we wzorcu LIKE do dopasowywania literalnych znaków procentu lub podkreślenia. Znak zmiany znaczenia, po którym następuje symbol procentu, znak podkreślenia lub jeszcze raz znak zmiany znaczenia jest dopasowywany odpowiednio do literalnego symbolu procentu, podkreślenia lub znaku zmiany znaczenia.

GLOB

Operator GLOB jest podobny do operatora LIKE, ale obowiązują w nim znaki wieloznaczne zgodne ze składnią wzorców nazw plików w systemie Unix. W przeciwieństwie do operatora LIKE, operator GLOB działa z uwzględnieniem wielkości liter.

IN

Operator IN sprawdza, czy jego lewy operand jest równy jednej z wartości w prawym operandzie (który jest zbiorem wartości w nawiasie).

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]*

Prawy operand może być zbiorem wartości literałowych rozdzielonych przecinkami lub może być wynikiem instrukcji SELECT. Objaśnienia i informacje o ograniczeniach w użyciu instrukcji SELECT jako prawego operandu operatora IN można znaleźć w opisie wyrażeń IN instrukcji SELECT.

BETWEEN...AND

Operator BETWEEN...AND jest równoważny użyciu dwóch wyrażeń z operatorami >= i <=. Operator BETWEEN...AND jest równoważny użyciu dwóch wyrażeń z operatorami >= i <=.

NOT

Operator NOT jest operatorem negacji. Operatory GLOB, LIKE i IN mogą być poprzedzone słowem kluczowym NOT, które powoduje odwrócenie znaczenia testu (innymi słowy, powoduje sprawdzenie, czy wartość nie jest zgodna z podanym wzorcem).

Parametry

Parametr określa miejsce w wyrażeniu, które podczas wykonywania jest wypełniane poprzez przypisanie wartości do tablicy asocjacyjnej SQLStatement.parameters. Parametry mogą występować w trzech postaciach:

?

Znak zapytania oznacza parametr indeksowany. Parametrom są przypisywane wartości indeksów liczbowych (liczone od zera) odpowiadające kolejności ich występowania w instrukcji.

:AAAA

Dwukropek, po którym następuje nazwa, oznacza miejsce parametru nazwanego o nazwie AAAA. Parametry nazwane także są numerowane zgodnie z kolejnością ich występowania w instrukcji SQL. Aby uniknąć niejednoznaczności, najlepiej jest unikać jednoczesnego stosowania parametrów nazwanych i numerowanych.

@AAAA

Znak „at” jest równoważny dwukropkowi.

Nieobsługiwane elementy języka SQL

Poniżej znajduje się lista elementów standardowego języka SQL, które nie są obsługiwane w środowisku Adobe AIR:
Ograniczenia typu FOREIGN KEY
Ograniczenia FOREIGN KEY są akceptowane składniowo, ale nie są egzekwowane.

Wyzwalacze
Wyzwalacze FOR EACH STATEMENT nie są obsługiwane (wszystkie wyzwalacze muszą być typu FOR EACH ROW). Wyzwalacze INSTEAD OF nie są obsługiwane w odniesieniu do tabel (wyzwalacze INSTEAD OF są dozwolone tylko w odniesieniu do widoków). Wyzwalacze rekurencyjne — które wyzwalają same siebie — nie są obsługiwane.

ALTER TABLE
Obsługiwane są tylko warianty RENAME TABLE i ADD COLUMN polecenia ALTER TABLE. Inne rodzaje operacji ALTER TABLE, takie jak DROP COLUMN, ALTER COLUMN, ADD CONSTRAINT itd. są ignorowane.

Transakcje zagnieżdżone
Dozwolona jest tylko jedna aktywna transakcja.

RIGHT i FULL OUTER JOIN
Złączenia RIGHT OUTER JOIN i FULL OUTER JOIN nie są obsługiwane.

Widoki z możliwością aktualizacji
Widoki są przeznaczone tylko do odczytu. Nie jest dozwolone wykonywanie instrukcji DELETE, INSERT lub UPDATE na widoku. Wyzwalacz INSTEAD OF, który jest aktywowany po próbie wykonania operacji DELETE, INSERT lub UPDATE, jest obsługiwany i można go wykorzystać do aktualizacji tablic podstawowych widoku.

GRANT i REVOKE
Baza danych jest zwykłym plikiem na dysku; jedyne uprawnienia dostępu, jakie można zastosować do bazy danych, to zwykłe uprawnienia dostępu do pliku obowiązujące w bazowym systemie operacyjnym. Polecenia GRANT i REVOKE dostępne zwykle w systemach RDBMS typu klient/serwer nie są zaimplementowane.

Następujące elementy języka SQL i funkcje SQLite są obsługiwane w niektórych implementacjach języka SQLite, ale nie są obsługiwane w środowisku Adobe AIR. Większość z ich funkcjonalności można zrealizować za pomocą metod klasy SQLConnection:
Transakcyjne elementy języka SQL (BEGIN, END, COMMIT, ROLLBACK)
Ta funkcjonalność jest dostępna za pośrednictwem metod transakcyjnych klasy SQLConnection: SQLConnection.begin(), SQLConnection.commit() i SQLConnection.rollback().

ANALYZE
Ta funkcjonalność jest dostępna za pośrednictwem metody SQLConnection.analyze().

ATTACH
Ta funkcjonalność jest dostępna za pośrednictwem metody SQLConnection.attach().

COPY
Ta instrukcja nie jest obsługiwana.

CREATE VIRTUAL TABLE
Ta instrukcja nie jest obsługiwana.

DETACH
Ta funkcjonalność jest dostępna za pośrednictwem metody SQLConnection.detach().

PRAGMA
Ta instrukcja nie jest obsługiwana.

VACUUM
Ta funkcjonalność jest dostępna za pośrednictwem metody SQLConnection.compact().

Dostęp do tabel systemowych nie jest możliwy
Tabele systemowe, w tym tabela sqlite_master oraz pozostałe tabele z przedrostkiem „sqlite_”, nie są dostępne w instrukcjach SQL. Środowisko wykonawcze zawiera interfejs API zapewniający zorientowany obiektowo dostęp do danych schematu. Więcej informacji zawiera opis metody SQLConnection.loadSchema().

Funkcje do obsługi wyrażeń regularnych (MATCH() i REGEX())
Te funkcje nie są dostępne w instrukcjach SQL.

Następujące funkcje działają w środowisku Adobe AIR inaczej niż w implementacjach SQLite:

Indeksowane parametry instrukcji
W wielu implementacjach indeksy parametrów instrukcji są liczone od wartości jeden. Jednak w środowisku Adobe AIR indeksy parametrów instrukcji są liczone od zera (tj. pierwszy parametr ma indeks 0, drugi parametr ma indeks 1 itd.).

Definicje kolumn INTEGER PRIMARY KEY
W wielu implementacjach tylko kolumna zdefiniowana dokładnie jako INTEGER PRIMARY KEY jest używana jako bieżący klucz główny tabeli. W tych implementacjach używanie innego typu danych, który jest przeważnie synonimem INTEGER (np. int), nie powoduje używania kolumny jako wewnętrznego klucza głównego. Jednakże w Adobe AIR, typ danych int (oraz inne synonimy INTEGER) są uważane za ściśle równoważne z INTEGER. W rezultacie kolumna zdefiniowana jako int PRIMARY KEY jest używana jako wewnętrzny klucz główny tabeli. Więcej informacji zawierają sekcje CREATE TABLE i Powinowactwo kolumn.

Dodatkowe elementy języka SQL

Wymienione niżej typy powinowactwa kolumn domyślnie nie są obsługiwane w implementacjach SQLite, ale są obsługiwane w środowisku Adobe AIR (należy pamiętać, że tak, jak w przypadku wszystkich słów kluczowych w języku SQL, w tych nazwach typów danych nie są rozróżniane wielkości liter):
Boolean
odpowiednik klasy Boolean.

Date
odpowiednik klasy Date.

int
odpowiednik klasy int (równoważny powinowactwu kolumny INTEGER).

Liczba
odpowiednik klasy Number (równoważny powinowactwu kolumny REAL).

Object
odpowiednik klasy Object lub dowolnej podklasy, która może podlegać serializacji i deserializacji za pomocą interfejsu AMF3. (Ten warunek spełnia większość klas, w tym klasy niestandardowe, ale nie spełniają go niektóre klasy zawierające obiekty wyświetlane i obiekty, których właściwościami są obiekty wyświetlane).

Ciąg
odpowiednik klasy String (równoważny powinowactwu kolumny TEXT).

XML
odpowiednik klasy XML w języku ActionScript (E4X).

XMLList
odpowiednik klasy XMLList w języku ActionScript (E4X).

Wymienione niżej wartości literałowe domyślnie nie są obsługiwane w implementacjach SQLite, ale są obsługiwane w środowisku Adobe AIR:

true
reprezentuje literalną wartość logiczną true, używaną przy pracy z kolumnami typu BOOLEAN.

false
reprezentuje literalną wartość logiczną false, używaną przy pracy z kolumnami typu BOOLEAN.