SQL
SELECT * FROM Adressen;
: Listet die Werte aller Spalten aus der Tabelle Adressen auf.
SELECT Name, Vorname, Postleitzahl FROM Adressen;
: ''Projektion'': Listet nur die Spalten ''Name'', ''Vorname'' und ''Postleitzahl'' der Tabelle ''Adressen'' auf.
SELECT Name, Vorname, Postleitzahl AS PLZ FROM Adressen;
: ''Projektion'' mit ''Umbenennung'': Die Spalte ''Postleitzahl'' heißt in der Ergebnisrelation jetzt ''PLZ''.
SELECT Name, Vorname FROM Adressen WHERE Ort='Hannover';
: ''Selektion'': Listet nur die Hannoveraner auf.
SELECT a.Name, a.Vorname, a.Plz, a.Ort FROM Adressen a INNER JOIN Namenliste n ON a.Name=n.Name AND a.Vorname=n.Vorname;
: ''Natürlicher Verbund'': Listet die Werte der Spalten ''Name'', ''Vorname'', ''Plz'' und ''Ort'' aus der Tabelle ''Adressen'' für alle Namen die auch in der Tabelle ''Namenliste'' vorkommen auf.
SELECT a.StrasseFROM Adressen a LEFT OUTER JOIN Leute l ON l.Strasse=a.StrasseWHERE l.Strasse IS [[Nullwert|NULL]];
: ''Äußerer linker Theta-Verbund'': Listet alle Straßen auf, in denen niemand wohnt.
SELECT a.StrasseFROM Adressen aWHERE NOT EXISTS (SELECT * FROM Leute WHERE Strasse=a.Strasse)
: ''Unterabfrage'' mit ''Existenz-Quantor'': Das gleiche mit einer Unterabfrage.
SELECT Jahr, Quartal, SUM(Betrag) AS Umsatz FROM Rechnung GROUP BY Jahr, Quartal;
: ''Gruppierung'' und ''Aggregation'': Summiert die Spalte ''Betrag'' der Tabelle ''Rechnung'' und listet das Ergebnis Quartalsweise.
SELECT verkaeufer, SUM(Betrag) AS UmsatzsummeFROM RechnungGROUP BY verkaeuferHAVING COUNT(*) >= 100
: Listet die Verkäufer mit ihrem Gesamtumsatz auf, die mindestens 100 Rechnungen generiert haben.
===Data Manipulation Language: INSERT, UPDATE, DELETE ===
Die DML enthält Befehle zur Datenmanipulation. Syntax:
INSERT INTO ''Relation'' ['(' (''Attribut'')+ ')'] VALUES '('(Konstanten)+')'
INSERT INTO ''Relation'' ['(' (''Attribut'')+ ')'] ''SFW-Block''
UPDATE ''Relation'' SET (''Attribut''=''Ausdruck'')+ WHERE ''Where-Klausel''
DELETE FROM ''Relation'' [WHERE ''Where-Klausel'']
* Mit INSERT können explizit konstruierte Tupel oder die Ergebnisse eines SFW-Blocks in eine Relation eingefügt werden.
* ''Ausdruck'' aus der UPDATE-Anweisung kann insbesondere auch auf das zu manipulierende Attribut bezug nehmen wie z. B. in UPDATE Personal SET Gehalt=Gehalt*2 WHERE Abteilung='EDV'
* Wird bei DELETE die WHERE-Klausel weg gelassen, wird die '''ganze''' Relation gelöscht, aber nicht das Schema.
Beispiele:
insert into Adressen (Name, Vorname, Ort) values ('Schroeder', 'Kurt', 'Köln');
: Fügt eine Zeile mit den geg. Werten für die Spalten ''Name'', ''Vorname'' und ''Ort'' in die Tabelle ''Adressen'' hinzu.
insert into Adressen values ('Schroeder', 'Knut', 'Köln');
: Beim insert-Statement kann die erste Klammer mit den Attribut-Namen auch weggelassen und direkt mit values() die Werte eingefügt werden. Allerdings müssen dann die Werte in der gleichen Reihenfolge wie in der Tabellendefinition angegeben werden.
insert into Adressen (Name, Vorname, Ort) select Nachname, Vorname, Ort from Alte_Adressen;
: Lädt alle Adressen aus der Tabelle ''Alte_Adressen'' in die Tabelle ''Adressen''.
insert into Kursteilnahme (Id_Person, Id_Kurs) select 55, Id_Kurs from Kursteilnahme where Id_Person = 27;
: Übernimmt alle der Person 27 zugeordneten Einträge aus der Tabelle ''Kursteilnahme'' auch für Person 55.
update Adressen set Ort='Berlin', Telefon='030...' where Name='Schroeder';
: Ändert den Wert in der Spalte ''Ort'' aller Einträge auf "Berlin" (Telefon auf ... usw), wenn der Wert in der Spalte ''Name'' "Schroeder" lautet.
delete from Adressen;
: Löscht alle Zeilen aus der Tabelle ''Adressen''.
delete from Adressen where name='Müller';
: Löscht alle Zeilen aus der Tabelle ''Adressen'', deren Wert in der Spalte ''Name'' "Müller" lautet.
truncate table Adressen;
: Leert die Relation, wird aber nur von einigen [[DBMS]] unterstützt. Im Gegensatz zu ''delete'' nicht [[Transaktion (Informatik)|transaktional]].
=== Data Definition Language: CREATE, ALTER, DROP ===
Die DDL enthält Befehle zur Datendefinition. Syntax (primary key und foreign key sind Teil der SQL-89 IDL bzw. SQL-92 und werden von manchen Datenbanken nicht unterstützt):
CREATE TABLE ''Relation'' '(' (''Attribut-Definition'')+ ')'
CREATE TABLE ''Relation'' '(' (''Attribut-Definition'' [PRIMARY KEY])+
[, FOREIGN KEY '(' (''Attribut'')+ ')' REFERENCES ''Relation'' '(' (''Attribut'')+ ')'] ')'
DROP TABLE ''Relation''
ALTER TABLE ''Relation'' ''Alter-Definition''
CREATE INDEX ''Index-Name'' ON ''Relation'' '(' (''Attribut'')+ ')'
DROP INDEX ''Index-Name''
CREATE VIEW ''Sicht'' ['(' (Attribut)+ ')'] AS ''SFW-Block'' [WITH CHECK OPTION]
DROP VIEW ''Sicht''
* Die Attribut-Definition enthält den Namen des Attributes, den Datentyp, sowie optionale Angaben wie NOT [[Nullwert|NULL]]. In SQL-92 können benutzerdefinierte Wertebereiche sowie Defaultwerte angegeben werden.
* Bei CREATE TABLE können ab SQL-92 außerdem mittels der CHECK-Klausel noch Integritätsbedingungen bei den Attributen oder für die Tabelle angegeben werden.
* Die Alter-Definition ist ADD ''Attribut-Definition''. In SQL-92 gibt es noch ALTER ''Attribut'' ''Default-Wert'' oder DROP ''Attribut''. Da SQL-92 sehr restriktiv bezüglich der ALTER-Anweisung ist, ist dies eine der Anweisungen, die von den Herstellern universell erweitert wurde, so dass beliebige Änderungen möglich sind wie durch eine Folge von DROP und ADD-Anweisungen.
* Bei der Definition einer Sicht können neue Attributnamen vergeben werden. ''SFW-Block'' ist eine beliebige SQL-Abfrage, WITH CHECK OPTION gibt an, ob gewisse Änderungsoperationen erlaubt sein sollen (vgl. [[Sicht (Datenbank)|Sichten]]).
* Die CREATE-Anweisung wird in modernen DBMS dazu benutzt, außer Relationen, Indizies und Sichten alle möglichen anderen Objekte zu kreieren.
Beispiele:
create table Laender (
Kuerzel_ISO character(2) primary key,
Land_Name varchar(50) NOT [[Nullwert|NULL]]);
: Erzeugt eine neue Tabelle namens ''Laender'' mit den Spalten ''Kuerzel_ISO'' und ''Land_Name'', wobei ''Kuerzel_ISO'' der [[Primärschlüssel]] ist und in keiner der Spalten leere Felder erlaubt sind.
alter table Laender add Kuerzel_Auto varchar(3);
: Definiert eine neue Spalte namens ''Kuerzel_Auto'' in der Tabelle ''Laender''.
drop table Adressen;
: Löscht die gesamte Tabelle ''Adressen''.
create index idx_Adressen on Adressen (Name);
: Legt einen [[Datenbankindex|Index]] auf die Spalte ''Name'' der Tabelle ''Adressen''. Der Index bekommt die Bezeichnung ''idx_Adressen'' und beschleunigt die Suche nach Datensätzen in der Tabelle ''Adressen'', wenn der ''Name'' als Suchkriterium angegeben wird.
drop index idx_Adressen;
: Löscht den Index ''idx_Adressen''.
=== Data Control Language: GRANT and REVOKE ===
Die DCL enthält Befehle zur Vergabe von Rechten. Die Befehle manipulieren [[Access Control List]]s auf Datenbankobjekten. Syntax:
GRANT (''Operation'')+ ON ''Relation'' TO (PUBLIC|''Benutzer'') [WITH GRANT OPTION]
REVOKE (''Operation'')+ ON ''Relation'' FROM (PUBLIC|''Benutzer'')
* ''Relation'' kann insbesondere auch eine Sicht sein.
* WITH GRANT OPTION erlaubt es den neuen Rechteinhabern, das Recht weiter zu geben.
* PUBLIC bezeichnet alle Benutzer.
* Der Datenbankadministrator (DBA) hat alle Rechte. Der Besitzer eines Objektes hat auch alle Rechte an diesem Objekt.
* Die Kommandos zur Rechteverwaltung sind in SQL spezifiziert, nicht jedoch die zur Benutzerverwaltung. Daher implementiert jedes DBMS seine eigene Benutzerverwaltung, die Rollennamen und/oder Benutzergruppen kennen mag oder auch nicht.
* In modernen DBMS können Rechte auf alles mögliche vergeben werden, nicht nur auf einzelne Tabellen.
Beispiele:
grant select,update on table Adressen to groupx;
: Gestattet dem Benutzer bzw. der Gruppe ''groupx'' einen lesenden und ändernden Zugriff auf die Tabelle ''Adressen''.
revoke execute on procedure DSN8ED6 from public;
: Entzieht allen nicht explizit berechtigten Benutzern das Recht, die Stored-Procedure ''DSN8ED6'' auszuführen. Berechtigungen, die einem Benutzer oder einer Gruppe erteilt wurden, bleiben bestehen.
== SQL-Datentypen ==
In den oben vorgestellten Befehlen create table und alter table wird bei der Definition jeder Spalte angegeben, welches Datenformat sie unterstützen soll. Dazu liefert SQL eine ganze Reihe standardisierter [[Datentyp]]en mit. Die einzelnen DBMS-Hersteller haben diese Liste jedoch um eine Unzahl weiterer Datentypen erweitert, woraus die nützlichsten wohl TEXT und BLOB sein dürften. Die wichtigsten Standarddatentypen sind:
[[Integer (Datentyp)|integer]]
: [[Ganze Zahl]] (positiv oder negativ)
number (n)
: Ganze Zahl (positiv oder negativ) mit maximal n Stellen
number (n, m) oder decimal (n,m)
: [[Festkommazahl]] (positiv oder negativ) mit maximal n Stellen, davon m nach dem Komma
float (m)
: [[Gleitkommazahl]] (positiv oder negativ) mit maximal m Stellen nach dem Komma
character (n) oder char (n)
: [[Zeichenkette]] (also Text) mit n druckbaren und/oder nicht druckbaren Zeichen
varchar (n), varchar2 (n)
: Zeichenkette (also Text) von variabler Länge, aber maximal n druckbaren und/oder nicht druckbaren Zeichen. Die Variante varchar2 ist für [[Oracle (Datenbanksystem)|Oracle]] spezifisch.
date
: Datum (bei Oracle inklusive Uhrzeit)
boolean
: [[Boolesche Variable]] (kann die Werte true (wahr) oder false (falsch) annehmen). Dieser Datentyp fehlt in Oracle.
raw (n)
: Binärdaten von maximal n [[Byte]]s Länge.
== Fachbegriffe ==
Die folgenden Fachbegriffe sind zum Verständnis von SQL hilfreich. Sie sind jedoch auch als eigenständige Begriffe der [[Informatik]] bedeutsam und werden nicht nur im Kontext von SQL verwendet.
=== [[Schlüssel (Datenbank)|Primärschlüssel]] ===
In jeder [[Tabelle]] sollte grundsätzlich ein [[Primärschlüssel]] (primary key) definiert werden. Dieser ist häufig der natürliche [[Schlüssel (Datenbank)|Schlüssel]] der Tabelle, wenn er eindeutig ("unique") ist; es kann auch ein künstlicher Schlüssel sein, beispielsweise ein [[Zähler (Technik)|Zähler]], der pro [[Datensatz]] hoch gezählt wird. Über den Primärschlüssel kann jeder [[Datensatz]] innerhalb der Tabelle eindeutig identifiziert werden. Ein Primärschlüssel kann auch aus mehreren Attributen (Spalten) der Tabelle bestehen (zusammengesetzter Primärschlüssel).
Der Primärschlüssel muss aus einem Merkmal oder einer minimalen Merkmalskombination (bei zusammengesetzten Primärschlüsseln) bestehen. Die Bedingung der minimalen Merkmalskombination bei zusammengesetzten Primärschlüsseln bedeutet, dass ein Teil (Merkmal) des zusammengesetzten Schlüssels nicht reichen darf, um ein Tupel eindeutig zu identifizieren.
=== Fremdschlüssel ===
[[Fremdschlüssel]] (auch ''Foreign Key'' genannt) bezeichnen im Bereich der relationalen Datenbanken ein Attribut einer Relation (Tabelle), das auf den [[Primärschlüssel]] einer anderen Relation verweist.
Ein Fremdschlüssel kann, muss aber nicht Primärschlüssel seiner Relation sein.
=== [[Transaktion (Informatik)|Transaktion]], [[Commit]] und [[Rollback]] ===
[[Login|Loggt]] man sich in eine [[Datenbank]] ein, kann man, die erforderlichen Privilegien vorausgesetzt, Änderungen an den [[Tabelle]]n oder den [[Daten]] vornehmen. Grundsätzlich ist in einer relationalen Datenbank alles innerhalb einer Transaktion zu sehen.
Datenbanken erlauben es zum Teil, bestimmte Befehle außerhalb einer Transaktion auszuführen. Darunter fällt insbesondere das Laden von Tabellen, oder das Entfernen von Daten mittels Utilities. Manche [[DBMS]] erlauben das temporäre Abschalten der Transaktionslogik sowie einiger Kontrollen zur Erhöhung der Verarbeitungsgeschwindigkeit. Dies muss allerdings meist durch einen Befehl erzwungen werden, um ein versehentliches Ändern von Daten außerhalb einer [[Transaktion (Informatik)|Transaktion]] zu vermeiden. Solche Änderungen können, falls eine Datenbankwiederherstellung erforderlich ist, zu schweren Problemen oder Datenverlust führen.
Eine Transaktion beendet man mit dem Befehl [[Commit]].
Mit dem Befehl [[Rollback]] wird die Transaktion ebenfalls beendet, es werden jedoch alle (Daten-)Änderungen seit Beginn der Transaktion wieder rückgängig gemacht. Technische Änderungen bleiben in der Regel erhalten (so genannte ''Kompaktierung'', ''compaction'').
=== [[Dateninkonsistenz]] ===
Erfüllen [[Daten]] bspw. die [[Integritätsbedingung]]en oder [[Fremdschlüssel]]bestimmungen nicht, so nennt man dies [[Dateninkonsistenz]]. So können Referenzen einer Tabelle auf Records einer anderen verweisen. Wurde dieser Eintrag nun gelöscht, so sind die Daten in der ersten Tabelle inkonsistent, weil ein Zeiger auf einen nicht-vorhandenen Record referenziert.
Der häufigste Grund für Dateninkonsistenzen ist die falsche Analyse des Datenmodells während der [[Normalisierung_(Datenbank)|Normalisierung]] des [[Entity-Relationship-Modell|ERM]] oder Fehler in der Programmierung.
Zum letzteren gehören die ''Lost-Update''-Phänomene sowie die Verarbeitung von zwischenzeitlich veralteten Zwischenergebnissen. Dies tritt vor allem bei Online-Verarbeitung auf, da dem Nutzer angezeigte Werte nicht transaktionsmäßig gekapselt werden können.
Beispiel:
Transaktion ''A'' liest Wert ''x''
Transaktion ''B'' verringert Wert ''x'' um 10
Transaktion ''A'' erhöht den gespeicherten Wert von ''x'' um eins und schreibt zurück
Ergebnis x' = x+1
Die Änderung von ''B'' ist verloren gegangen
=== [[Referenzielle Integrität]] ===
Von referenzieller Integrität spricht man, wenn jeder Fremdschlüssel einer Tabelle einen entsprechenden Primärschlüssel einer anderen Tabelle zugeordnet, oder der Wert des Fremdschlüssels [[Nullwert|NULL]] ist. Die referenzielle Integrität garantiert die Existenz des Schlüssels in der referenzierten Tabelle.
Um [[Dateninkonsistenz]]en zu vermeiden, können Beziehungen zwischen [[Tabelle]]n definiert werden. Zusätzlich können Regeln angegeben werden, wie abhängige Daten beim Löschen oder Ändern eines Datensatzes behandelt werden sollen. Beim Löschen kann zum Beispiel durch Kaskadierung ein Datensatz und alle abhängigen Daten gelöscht werden.
Folgende Änderungsregeln sind möglich:
(1) Zurückweisen der Änderungsoperation: (default)
D.h. ein [[Primärschlüssel]] kann nicht gelöscht werden, wenn noch abhängige Objekte bestehen.
(2) Propagieren der Änderungen: CASCADE
D.h. bei "ON DELETE CASCADE" werden ebenfalls alle abhängigen Datenzeilen gelöscht.
(3) Verweise auf Nullwert setzen: SET NULL
D.h. die entsprechenden Werte der abhängigen [[Fremdschlüssel]] werden auf [[Nullwert|NULL]] gesetzt.
Ein Update von [[Primärschlüssel]]n (PK-Update) ist zwar von [[Codd]] vorgesehen, widerspricht jedoch der grundsätzlichen Idee des Schlüssels, da ein Primärschlüssel stets unveränderlich sein sollte.
=== [[Redundanz (Information)|Redundanz]] ===
Ein [[Grundsatz]] einer [[Datenbanksystem|Datenbank]] ist, dass innerhalb einer Datenbank kaum [[Redundanz (Information)|Redundanzen]] auftreten sollen. Man spricht dann von einer [[Redundanz|redundanzfreien]] Datenbank. Dies geschieht durch die [[Normalisierung (Datenbank)|Normalisierung]].
Da eine Datenbank, die allen Anforderungen der 3. oder sogar 5. Normalform entspricht, in der Praxis bedingt durch Performanceprobleme nicht zu verwenden wäre, werden nachträglich Redundanzen bewusst in Kauf genommen, um zeitaufwändige und komplexe [[Join]]s zu verkürzen und so die Geschwindigkeit der Abfragen zu erhöhen. Man spricht auch von einer Denormalisierung einer Datenbank.
Ein Merkmal der Redundanz ist, wenn einzelne Werte innerhalb einer Tabelle oder Datenbank ohne Informationsverlust weggelassen werden können. Redundanz kostet nicht nur Speicherplatz sondern kann Ursache für Anomalien (z. B. Update-, Insert-, Delete-Anomalien) sein, diese werden auch als „Mutationsanomalien“ bezeichnet.
== Statisches und dynamisches SQL ==
Die meisten Datenbanken, die SQL unterstützen, unterscheiden zwischen ''statischem'' und ''dynamischem'' SQL.
Bei statischem SQL sind die SQL-Anweisungen fest in einem Anwendungsprogramm kodiert (so genanntes [[Embedded SQL]]). Während der Programmvorbereitung übersetzt ein [[Precompiler]] die SQL-Befehle in Funktionsaufrufe, anschließend definiert ein [[Anfrageoptimierer]] den besten Zugriffspfad auf die Daten und speichert diesen im Datenbanksystem ab.
Dynamisches SQL wird dagegen während der Laufzeit eines Programms interpretiert und der Zugriffspfad wird bei jedem Durchlauf neu optimiert. Da im Durchschnitt der Parsevorgang einer SQL-Anweisung etwa ein Drittel der gesamten Laufzeit in Anspruch nimmt, puffern jedoch viele [[Datenbanken]] die bereits geparsten SQL-Anweisungen, um so, falls sie sich wiederholen, die Zeit für ein erneutes Parsen zu sparen.
Beide Arten von SQL haben ihre Vor- und Nachteile: Statisches SQL mit voroptimierten Zugriffen verhindert unliebsame Überraschungen, da der Ausführungsplan nur bei einem sogenannten [[Rebind]] neu berechnet wird und die Existenz der Objekte, die syntaktische Korrektheit und die Berechtigungen schon beim ''Binden'' geprüft werden. Heute wird es jedoch fast nur noch (und dort auch vorwiegend) in [[Mainframe]] Umgebungen verwendet. In den meisten anderen Umgebungen kommt dynamisches SQL zum Einsatz, welches erlaubt Abfragen innerhalb eines Programms zu generieren. Mit dem [[SQLJ]]-Standard wird zunehmend auch in [[Java (Programmiersprache)|Java]] statisches SQL eingesetzt. Darüber hinaus hat [[JDBC]] die Möglichkeit der ''prepared Statements''. Der Ausführungsplan von statischem wie dynamischem SQL wird (falls ein kostenbasierter [[Anfrageoptimierer]] verwendet wird) anhand von vorhandenen Tabellenstatistiken berechnet. Fehlen diese Statistiken oder sind sie falsch bzw. veraltet, ist der Ausführungsplan unperformant und führt meist zu unnötig langen [[Antwortzeit]]en. Die meisten [[RDBMS]] bieten dafür jedoch Befehle an, die in regelmäßigen Abständen die Tabellenstatistiken neu berechnen. == Erweiterungen == Es existieren eine Vielzahl von Erweiterungen des SQL-Standards. ''SQL/XML'' ist ein ANSI und ISO Standard (ISO/IEC 9075-14), der es ermöglicht, [[XML]]-Dokumente in SQL-Datenbanken zu speichern, mit [[XPath]] und [[XQuery]] abzufragen und relationale Datenbankinhalte als XML zu exportieren [http://www.sqlx.org/]. Der ISO-Standard ist nicht frei verfügbar, jedoch gibt es ein [http://www.wiscorp.com/sql/sql_2003_standard.zip Zip-Archiv] mit einer Draft-Version von 2003. ''[[PL SQL | PL/SQL]]'' ist eine prozedurale Programmiersprache von und für Oracle. Sie bietet viele Erweiterungen zu den Standard-SQL-Sprachelementen. Sie erlaubt unter anderem das Programmieren von Schleifen (FOR, WHILE, REPEAT UNTIL), Cursor, Exception-Handling, Trigger und eigenen Funktionen. == Geschichte == ; ca. 1975 : [[SEQUEL]], Vorläufer von '''SQL''' wird für das Projekt [[System R]] von [[IBM]] entwickelt. ; 1981 : '''SQL''' gelangt mit '''SQL/Data Systems''' erstmals durch [[IBM]] auf den Markt. ; 1986 : '''SQL1''' wird von [[ANSI]] als Standard verabschiedet. ; 1987 : '''SQL1''' wird jetzt auch von [[ISO]] als Standard verabschiedet und 1989 nochmals überarbeitet. ; 1992 : Der '''SQL2''' bzw. '''SQL-92''' Standard wird von der [[ISO]] verabschiedet. ; 1999 : '''SQL3''' bzw. '''SQL:1999''' wird verabschiedet. ; 2003 :'''SQL:2003''' wird von der [[ISO]] als Nachfolger des SQL:1999 Standards verabschiedet. == Siehe auch == * [[Datenbank (Liste)]] * [[SQL-Injektion]] * [[SchemaSQL]] * [[Nullwert]] * [[Continuous Query Language]] == Literatur == * Donald D. Chamberlin, Raymond F. Boyce: ''SEQUEL: A structured English query language. Proceedings of the 1974 ACM SIGFIDET workshop on Data description, acces and control.'' * Günter Matthiessen, Michael Unterstein: ''Relationale Datenbanken und SQL – Konzepte der Entwicklung und Anwendung.'' Addison-Wesley, ISBN 3-8273-2085-2 * Edwin Schicker: ''Datenbanken und SQL – Eine praxisorientierte Einführung.'' Teubner, ISBN 3-519-02991-X
(Obwohl bereits etwas betagt, ist dieses Buch gerade als wissenschaftlich fundierte und trotzdem leicht verständliche Einführung in SQL sehr zu empfehlen.) * Oliver Bartosch, Markus Throll: ''Einstieg in SQL.'' Galileo Press, ISBN 3-89842-497-9 * Daniel Warner, Günter Leitenbauer: ''SQL.'' Franzis, ISBN 3-7723-7527-8 * Jörg Fritze, Jürgen Marsch: ''Erfolgreiche Datenbankanwendung mit SQL3. Praxisorientierte Anleitung – effizienter Einsatz – inklusive SQL-Tuning.'' Vieweg Verlag, ISBN 3-528-55210-7 * Can Türker: ''SQL 1999 & SQL 2003.'' Dpunkt Verlag, ISBN 3-89864-219-4 * Gregor Kuhlmann, Friedrich Müllmerstadt: ''SQL.'' Rowohlt, ISBN 3-499-61245-3 * Michael J. Hernandez, John L. Viescas: ''Go To SQL.'' Addison-Wesley, ISBN 3-8273-1772-X == Weblinks == {{Wikibooks|SQL}} * [http://sqlzoo.net/de/ SQLzoo] * [http://www.w3schools.com/sql/ SQL-Tutorial aus der W3 Schule (Englisch)] * [http://www.inweb.de/chetan/Deutsch/Ressourcen/SQL.html SQL-Kurzreferenz] * [http://aam.ugpl.de/?q=sql_hilfe/select SQL-Einführung und Referenz] * [http://www.techonthenet.com/sql/index.php SQL-Einführung und kleine Referenz (techonthenet, Englisch)] * [http://www.thefreecountry.com/documentation/onlinesql.shtml Free Tutorials] [[Kategorie:Datenbanksprache]] [[ar:SQL]] [[ca:SQL]] [[cs:SQL]] [[da:Structured Query Language]] [[en:SQL]] [[eo:SQL]] [[es:SQL]] [[fi:SQL]] [[fr:Structured Query Language]] [[he:SQL]] [[hu:SQL programozási nyelv]] [[ia:SQL]] [[id:SQL]] [[is:SQL]] [[it:SQL]] [[ja:SQL]] [[ku:SQL]] [[lt:SQL]] [[nl:SQL]] [[no:Structured Query Language]] [[pl:SQL]] [[pt:SQL]] [[ru:SQL]] [[sk:SQL]] [[sl:SQL]] [[sv:SQL]] [[th:SQL]] [[tr:SQL]] [[uk:Мова програмування SQL]] [[vi:SQL]] [[zh:SQL]]
Diese Version des Artikels stammt vom 06.03.2006.
Der Inhalt dieser Seite basiert auf dem Artikel „SQL“ aus der freien Enzyklop�die Wikipedia und ist unter der GNU-Lizenz f�r freie Dokumentation ver�ffentlicht. Auf der Wikipedia-Seite ist eine Liste der Autoren einzusehen.