Die Txt-Db-Api unterstützt nicht den ganzen SQL-Sprachumfang,
der unterstützte Umfang sollte jedoch
mit dem SQL Standard kompatibel sein.
Nachfolgend sind die Einschränkungen bzw. die Syntax für SQL Statements
was die Txt-Db-Api betrifft aufgeführt.
Werte in [] sind freiwillig, "..." bedeutet das beliebig viele weitere
Elemente folgen können,
| heisst das entweder der eine ODER der andere wert genommen werden kann.
Achtung: Wie auch im Standard definiert, sollten Werte
für str (String) Felder immer in die
Anführungszeichen ' ' oder " " eingeschlossen werden!
SELECT [DISTINCT]
[funktion(][tabelle.]spalte[)] [AS alias_name] [, [funktion(][tabelle].spalte[)] [AS alias_name] , ...]
FROM tabelle [AS tabellen_alias] [, tabelle2 [AS tabellen_alias], ... ]
[WHERE spalte=wert AND|OR spalte=spalte AND|OR ...] [GROUP BY spalte, ...] [ORDER BY spalte [ASC | DESC] ,...] [LIMIT [offset,]anzahl] [;]
- Siehe Syntax
- Anstelle von Spaltennnamen (spalte
in der Syntax oben) können auch direkte Werte verwendet werden.
Das können entweder Zahlen oder Strings in ' ' oder "
" sein, z.B. SELECT 1234, 'bla',
name FROM personen;
- Folgende Funktionen: UNIX_TIMESTAMP(), MD5(spalte), NOW(), ABS(spalte),
LCASE(spalte), UCASE(spalte), LOWER(spalte), UPPER(spalte)
- Die oben genannten Funktionen werden auch bei WHERE, GROUP BY und ORDER
BY unterstützt
- Folgende gruppierenden Funktionen: MAX(spalte), MIN(spalte), COUNT(spalte),
SUM(spalte), AVG(spalte)
- Anstelle einer spalte kann man für Funktionen auch direkte Werte
als Parameter angeben, z.B. md5('bla')
- * anstelle von Feldnamen
- tabelle.* anstelle von Feldnamen, auch Kombinationen möglich z.B.
SELECT personen.*, firma.Name, ort.* ...
- Aliase für Tabellen
- Im WHERE Teil werden folgende Vergleichsoperatoren unterstützt:
=,>,<,>=,<=, !=, <>, LIKE (wildcards % und _)
- Im WHERE Teil kann entweder feld=wert, wert=wert oder auch feld=feld stehen
(um tabellen verknüpft abzufragen, wie z.B. im Beispiel
unten "personen.typ_id = typen.id")
"=" steht hier nur als Beispiel, für Feld=Feld
sind alle oben genannten Vergleichsoperatoren möglich
- Im WHERE Teil können beliebige viele AND und OR verwendet werden
- Im WHERE Teil können beliebig viele Klammern verwendet und verschachtelt
werden
- DISTINCT: nur zeilen die sich eindeutig von andern unterscheiden werden
zurückgegeben
- GROUP BY: ergebniss nach den angegebenen spalten gruppieren.
- LIMIT (nur bei SELECT): offset ist ein offset beginnend bei
0 (d.h. ein offset 1 startet bei der 2. Reihe),
welches angibt ab welcher Reihe man das Ergebnis auf anzahl
Zeilen limitieren möchte.
Wenn man ein LIMIT angibt so ist anzahl obligatorisch,
das offset kann auch weggelassen werden.
Beispiel: LIMIT 4,10 (Liefert nur die Zeilen von 5 bis und mit
14 zurück => Anzahl = 10)
- Bei DISTINCT und GROUP BY wird immer der erste wert genommen,
Beispiel: "SELECT time, ip FROM log GROUP BY time"
| time | ip 10348395 | 192.168.0.1 10348395 | 192.168.0.3 |
>
|
time | ip 10348395 | 192.168.0.1 |
- Zusammenfügen von Feldern wie zB SELECT name & " "
& vorname AS ganzer_name oder
SELECT name + vorname AS ganzer_name
- Alles was nicht irgendwie unter Syntax oder Unterstützt zu finden
ist
SELECT vorname, personen.nachname, typen.typ AS personen_typ FROM personen,
typen
WHERE personen.typ_id = typen.id AND (personen.Nr>=10 OR personen.vorname='Hans')
ORDER BY vorname LIMIT 100
SELECT COUNT(t.name), AVG(t.alter) AS durchschnittsalter, k.name FROM teilnehmer
AS t, kurs AS k
WHERE t.kurs_nr=kurs.id GROUP BY k.name;
SELECT md5('bla');
ACHTUNG: Vor und nach jedem OR oder AND müssen je ein Leerschlag
(" ") stehen.
Dies damit der Parser genau zwischen AND und OR's die eventuell zu Feldnamen
gehören
oder AND und OR's die als Teil der Logik gemeint sind, unterscheiden kann
!
Das gleiche gilt für LIKE!
Ungültig: Name='Test'OR Nr>20
Gültig: Name='Test' OR Nr>20
ACHTUNG: Benutzt LIKE nur wenn es zwingend nötig ist, da LIKE
viel langsamer ist als ein
normaler String-Vergleich. Wenn man also alle Datensätze Abfragen will
wo der ort genau 'Basel'
ist sollte man es so machen: SELECT * FROM tabelle WHERE ort='Basel'
und NICHT so: SELECT * FROM tabelle WHERE ort LIKE 'Basel'
und schon GAR NICHT so: SELECT * FROM tabelle WHERE ort LIKE '%Basel%'
INSERT [INTO] tabelle [(spalte1, spalte2, spalte_n, ...)]
VALUES ( [funktion(]wert[)] [, funktion[(]wert2[)], wert_n, ...]) [;] oder
INSERT [INTO] tabelle
SET spalte= [funktion(] wert [)] [, spalte2=[funktion(]wert2[)], spalte_n=[funktion(]wert_n[)], ...] [;]
- Siehe Syntax
- Folgende Funktionen: UNIX_TIMESTAMP(), MD5(wert), NOW(), ABS(wert),
LCASE(wert), UCASE(wert), LOWER(wert), UPPER(wert)
- Als Parameter für die Funktionen werden hier logischerwesie nur
Werte und keine Spalten unterstützt.
INSERT INTO personen (vorname, nachname) VALUES ('hans','meier');
INSERT INTO passwords (user, password) VALUES ( 'user1', md5('mypassword') );
INSERT INTO personen SET vorname=upper('hans'), alter=abs(-55), eingetragen=NOW() ;
DELETE FROM tabelle [WHERE <gleich wie bei SELECT>] [;]
- Siehe Syntax
- Das löschen der ganzen Tabelle (kein WHERE angeben)
- Für den WHERE Teil gilt das gleiche wie bei SELECT (funktionen
werden also auch unterstüzt!)
- LIMIT
- Alles was nicht irgendwie unter Syntax zu finden ist
DELETE FROM personen WHERE vorname='Hans';
DELETE FROM personen WHERE passwort=md5('mypw') AND abs(alter)=abs(-5);
UPDATE tabelle SET spalte=[funktion(]wert[)] [,spalte2=[funktion(]wert2[)], spalte_n=[funktion(]wert_n[)], ...]
[WHERE <gleich wie bei SELECT>] [;]
- Siehe Syntax
- Folgende Funktionen für die Werte: UNIX_TIMESTAMP(), MD5(spalte
oder wert), NOW(), ABS(spalte oder wert),
LCASE(spalte oder wert), UCASE(spalte oder wert), LOWER(spalte
oder wert), UPPER(spalte oder wert)
- Updaten der ganzen Tabelle (kein WHERE angeben)
- Zuweisen des Wertes einer Spalte an eine andere
- Für den WHERE Teil gilt das gleiche wie bei SELECT (funktionen
werden also auch unterstüzt!)
- LIMIT
- ORDER BY
- Alles was nicht irgendwie unter Syntax zu finden ist
UPDATE personen SET vorname='Hans2000' WHERE vorname='Hans';
UPDATE personen SET vorname=nachname WHERE vorname='Hans';
UPDATE personen SET passwort=md5(passwort);
UPDATE personen SET alter=abs(-20), name=upper(name);
CREATE TABLE (spalten_name typ [DEFAULT 'defaultWert'] [, spalten_name2 typ2 [DEFAULT 'defaultWert'], ... ]) [;]
- Siehe Syntax
- DEFAULT (Den Defaultwert in ' ' setzten, auch bei Zahlen)
- Wenn für eine inc Spalte ein Defaultwert gesetzt wurde, so sind
die inc Werte des ersten
Datensatzes Defaultwert+1. Für alle weiteren Spalten
wird der Defaultwert ignoriert.
- Alles was nicht irgendwie unter Syntax zu finden ist !!
- Nur folgende Syntax (spalten_name typ , spalten_name typ , ....)
und sonst kein einiziges Keyword (ausser DEFAULT)!!
- SQL Standardtypen, typ kann nur inc (AutoWert), int (Zahl) oder
str (Text) sein.
CREATE TABLE personen (id inc, vorname str DEFAULT 'john' , nachname str);
DROP TABLE tabelle1 [, tabelle2, ...][;]
- Siehe Syntax
- 1 oder mehrere Tabellen gleichzeitig löschen
- Alles was nicht irgendwie unter Syntax zu finden ist !!
DTOP TABLE personen;
LIST TABLES [WHERE ...] [GROUP BY spalten_name, ...] [ORDER BY spalten_name [ASC | DESC] ,...] [LIMIT [offset,]anzahl] [;]
- Siehe Syntax
- Gibt alle Tabellen einer Datenbank als ResultSet Objekt zurück.
Dieses ResultSet hat eine Spalte
Namens "table" welche den Tabellennamen als
String enthält
- Für WHERE, GROUP BY, ORDER BY und LIMIT Syntax siehe SELECT
- Alles was nicht irgendwie unter Syntax zu finden ist !!
- Funktionen
LIST TABLES;
CREATE DATABASE datanbank_name [;]
- Siehe Syntax
- Nur eine Databank kann mit einem Statement erzeugt werden.
- Dieses Statement sollte NUR auf einer ROOT_DATABASE Datanbank ausgeführt
werden.
Man erhält diese mit einem $db=new Database(ROOT_DATABASE);
aufruf.
ROOT_DATABASE ist eine definierte Konstante.
- Alles was nicht irgendwie unter Syntax zu finden ist !!
CREATE DATABASE meineDatenbank;
DROP DATABASE datanbank_name [;]
- Siehe Syntax
- Nur eine Databank kann mit einem Statement gelöscht werden.
- Dieses Statement sollte NUR auf einer ROOT_DATABASE Datanbank ausgeführt
werden.
Man erhält diese mit einem $db=new Database(ROOT_DATABASE);
aufruf.
ROOT_DATABASE ist eine definierte Konstante.
- Alles was nicht irgendwie unter Syntax zu finden ist !!
DROP DATABASE meineDatenbank;