Vorwort
Diese "Referenz" zeigt nur die allerwichtigsten SQL-Befehle. Für eine
ausführlichere Referenz empfehle ich das Buch
"SQL. Der Schlüssel zu relationalen Datenbanken".
SQL ist, nebenbei bemerkt, Case Insensitive, d.h. Groß- und
Kleinschreibung spielen keine Rolle. Aus Gründen der Übersicht
schreibe ich SQL-Statements groß - allein schon aus Abgrenzung zum
PHP-Code.
In SQL:
- Strings (und Dates) immer in Hochkomma
- Kommazahlen immer amerikanisch (nicht 12,3 sondern 12.3)
Datentypen in SQL
Die wichtigsten SQL-Datentypen sind
|
bool
|
TRUE oder FALSE
|
|
int
|
Ganzzahlen
|
|
char (<Länge>)
|
String fester Länge
|
|
varchar (<Länge>)
|
String variabler Länge mit festgesetztem Maximum
|
|
long varchar
|
(unter einigen Datenbanken: Text mit mehr als 2048 Zeichen)
|
|
dec (<Vorkommastellen>, <Nachkommastellen>)
|
Offensichtlich Festkomma. übersteigt ein Wert die Zahl der möglichen Stellen wird
der höchstmögliche Wert gespeichert (bei dec(3,3) und 4321.4321 ist das z.B. 999.999).
|
|
float (<Präzision>)
|
Fließkommazahl
|
|
date
|
Datumsangabe. Vorsicht: Datumsformate unterscheiden
sich in den Datenbanken, MySQL möchte z.B. Daten in der
Form 4 Zeichen für Jahr, 2 für Monat und 2 für Tag in der
Formatierung YYYY-MM-DD. Außerdem werden Daten meist als Strings
übergeben (also bei INSERT unbedingt auf Hochkomma achten).
Angesichts all dieser Probleme und den Schwierigkeiten, z.B.
herauszufinden wie viele Tage zwischen zwei DATEs lagen, beschränke ich
meine Programmierung auf Unix-Timestamps: Die haben den Wert int.
|
SELECT
Einfaches SELECT
select ist der erste Schritt für eine Ausgabe aus einer Datenbank.
Die Syntax ist
SELECT <Spaltenamen> FROM <Tabellennamen> [WHERE <Bedingung>]
. Es werden immer alle Zeilen einer Datenbank angesprochen, sind alle Spalten
gemeint genügt ein *, ansonsten werden Spaltennamen (genau wie Tabellennamen)
durch ein Komma getrennt.
example. select * from hauptbuch
selektiert alle Zeilen mit allen
Spalten aus hauptbuch. Mit Funktionen, die die Programmiersprachen
dann zur Verfügung stehen, können selektierte Einträge z.b. in Strings
gespeichert werden (siehe: Eine kleine ODBC-Referenz). select transaktion, datum from hauptbuch
gewährt dann nur Zugriff auf die Spalten transaktion und datum (nur wenige Spalten
auszuwählen vergrößert oft übersicht und verschnellert).
SELECT mit Bedingungen
select * from hauptbuch where (transaktion>40000)
selektiert
nur die Zeilen (alle Spalten, da *) einer Tabelle, bei denen
Transaktion>40000 ist. Ein weiteres Beispiel ist
select kundennr, letztebestellung from faktura where
(kundennr=192)
SELECT mit Sortierung
Syntax ist
<selectanweisung> order by <Schlüsselwert>[ascending/descending]
select * from hauptbuch where (transaktion>40000) order by transaktion descending
selektiert z.b. bei einer Tabelle mit den Werten
wobei descending eine fallende Reihenfolge symbolisiert,
ascending oder keine Angabe der Reihenfolge sortiert die
Selektion in die andere Richtung.
JOINS
Oft werden die Einträge aus einer Tabelle in einer anderen
Tabelle als Schlüsselwerte benutzt. Schlüsselwerte sind Werte,
die in jeweils nur einer Zeile der Tabelle vorkommen. Z.B. wäre einen
Kundendatenbank, in der jedem Kunden eine eindeutige Kundennummer
zugeordnet ist, eine Datenbank mit Schlüsselwerten. Haben wir zwei
Tabellen
Können wir in SQL auch in einem Schritt nach einem Kundennamen suchen
und den Zeitpunkt der letzten Bestellung ausgeben. Das nennt
man dann einen JOIN aus beiden Tabellen.
Um gleichnamige Spaltennamen in verschiedenen Tabellen unterscheiden zu
können schreibt man den Tabellennamen mit einem Punkt vor den
Spaltenname:
select hauptbuch.transaktion, hauptbuch.datum from
hauptbuch
sieht zwar dumm aus, das ändert sich aber bei
select * from kunden, bestellungen where ((kunden.kundennr=bestellungen.kundennr) AND (kundenname='Fr. Brisbois'))
liefert Kundennr und Bestellzeitpunkt von Andreas Mühl zurück.
Die letzte anweisung ist für konventionelle Programmierer (zumindest ging
es mir so) erst einmal schwer zu verdauen. Es zeit aber auch,
das ein where kein if ist: where wird alle Spalten aller Datenbanken
angewendet. So funktioniert die Geschichte auch wenn z.B.
Anderas Mühl in der Kundendatenbank die erste Zeile innehat,
in der Bestelldatenbank aber nur die 5te oder 1000ste.
CREATE
create ist für uns nur im Zusammenhang mit create table interessant.
Es erzeugt eine neue Tabelle in einer Datenbank.
der Syntax ist
create table <Tabellenname> <Spaltenname><Spaltentyp>[,(<Spaltenname><Spaltentyp>... ] )
z.B.:
create table kunden (kundennr int, name varchar(50))
INSERT
insert into < Tabellenname > values (<Wert>[,<Wert>...])
Beachten Sie, dass der Wert sowohl bei Datumsangaben (i.d.r in der Form 'JAHR-MO-TG') als auch bei Varchars (Strings) in Hochkomma
(') eingeschlossen sein muss.
Eine Insert-Anweisung führt logischerweise zu Fehlern, falls nicht die
gleiche Anzahl Werte in die Tabelle eingefügt werden soll, wie Spalten
vorhanden sind.
Hin und wieder passiert es, dass ein Programmierer insert into tabelle1
value (2001, 'Jahr') schreibt. Ein fehlendes s mach es dem Programmierer
da bei der Fehlersuche schwer weil (nicht das korrekte values) value
auch als Schlüsselwort erkannt wird.
DELETE
Zeilen löscht man in SQL mit
DELETE FROM <Tabellenname> WHERE < Bedingung >
Beispiel:
DELETE FROM ANTIQUES WHERE ITEM = 'Ottoman';
DROP
Drop ist das delete für ganze Tabellen. Mit
DROP <Tabellenname>
löschen Sie die ganze Tabelle. Ich verwende es oft in den
setup-Dateien, den Dateien, die Tabellen in den Datenbanken aufbauen.
Vor dem Erstellen der Tabellen versuche man sie oft zu löschen, da ein
Erstellen mit geänderten Spalten nicht möglich ist wenn die Tabelle noch
in anderer Form existiert.
ALTER
Mit
ALTER TABLE <Tabellenname> ADD/DROP COLUMN <Spaltendefinition>/<Spaltenname>
kann man Tabellen im Nachhinein ändern -- praktisch.
Spalten hinzufügen
Spalten hinzufügen kann man z.B. mit
ALTER TABLE ANTIQUES ADD COLUMN (PRICE INT);
Spalten löschen
... und Spalten löscht man mit ALTER....DROP:
ALTER TABLE ANTIQUES DROP COLUMN PRICE;
UPDATE
UPDATE <Tabellenname> SET <Variablenname>=<neuer Wert> WHERE <Bedingung>
ändert einen Eintrag in einer Datenbank (und ist als solches sehr praktisch in
Administrationsseiten wo desöfteren in den Datenbankinhalten etwas geändert wird.
Man denke nur an Preisänderungen in Online-Shops.)
UPDATE ANTIQUES SET PRICE = 500.00 WHERE ITEM = 'Chair';