SQL

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

SQL(offizielle Aussprache [ɛskjuːˈɛl], mitunter auch [ˈsiːkwəl]; auf Deutsch auch häufig die deutsche Aussprache der Buchstaben) ist eineDatenbanksprachezur Definition vonDatenstruktureninrelationalen Datenbankensowie zum Bearbeiten (Einfügen, Verändern, Löschen) und Abfragen von darauf basierenden Datenbeständen.

Die Sprache basiert auf derrelationalen Algebra,ihreSyntaxist relativ einfach aufgebaut undsemantischan die englische Umgangssprache angelehnt. Ein gemeinsames Gremium vonISOundIECstandardisiertdie Sprache unter Mitwirkung nationaler Normungsgremien wieANSIoderDIN.Durch den Einsatz von SQL strebt man die Unabhängigkeit der Anwendungen vom eingesetztenDatenbankmanagementsysteman.

Die BezeichnungSQLwird im allgemeinen Sprachgebrauch als Abkürzung für „Structured Query Language“(auf Deutsch: „Strukturierte Abfrage-Sprache “) aufgefasst, obwohl sie laut Standard ein eigenständiger Name ist. Die Bezeichnung leitet sich von dem Vorgänger SEQUEL ([ˈsiːkwəl], Structured English Query Language) ab, welche mit Beteiligung vonEdgar F. Codd(IBM) in den 1970er Jahren vonDonald D. ChamberlinundRaymond F. Boyceentwickelt wurde. SEQUEL wurde später in SQL umbenannt, weil SEQUEL ein eingetragenes Warenzeichen derHawker SiddeleyAircraft Company ist.[1]

Sprachelemente und Beispiele

[Bearbeiten|Quelltext bearbeiten]
Bestandteile von SQL

SQL-Befehle lassen sich in fünf Kategorien unterteilen (Zuordnung nach der Theorie derDatenbanksprachenin Klammern):

Die Bezeichnung SQL bezieht sich auf das englische Wort “query”(deutsch: „Abfrage“). Mit Abfragen werden die in einer Datenbank gespeicherten Daten abgerufen, also dem Benutzer oder einer Anwendersoftware zur Verfügung gestellt.

Das Ergebnis einer Abfrage sieht wiederum aus wie eine Tabelle und kann oft auch wie eine Tabelle angezeigt, bearbeitet und weiterverwendet werden.

Die grundlegenden Befehle und Begriffe werden anhand des folgenden Beispiels erklärt:

ER-Diagramm: SQL-Beispiel
Relationen:
Student
MatrNr Name
26120 Fichte
25403 Jonas
27103 Fauler
hoert
MatrNr VorlNr
25403 5001
26120 5001
26120 5045
Vorlesung
VorlNr Titel PersNr
5001 ET 15
5022 IT 12
5045 DB 12
Professor
PersNr Name
12 Wirth
15 Tesla
20 Urlauber
SELECT*
FROMStudent;

listet alle Spalten und alle Zeilen der TabelleStudentauf.

Ergebnis:

MatrNr Name
26120 Fichte
25403 Jonas
27103 Fauler

Abfrage mit Spaltenauswahl (,)

[Bearbeiten|Quelltext bearbeiten]
SELECTVorlNr,
Titel
FROMVorlesung;

listet die SpaltenVorlNrundTitelaller Zeilen der TabelleVorlesungauf.

Ergebnis:

VorlNr Titel
5001 ET
5022 IT
5045 DB

Abfrage mit eindeutigen Werten (DISTINCT)

[Bearbeiten|Quelltext bearbeiten]
SELECTDISTINCTMatrNr
FROMhoert;

listet nur unterschiedliche Einträge der SpalteMatrNraus der Tabellehoertauf. Dies zeigt die Matrikelnummern aller Studenten, die mindestens eine Vorlesung hören, wobei mehrfach auftretende Matrikelnummern nur einmal ausgegeben werden.

Ergebnis:

MatrNr
25403
26120

Abfrage mit Umbenennung (AS)

[Bearbeiten|Quelltext bearbeiten]
SELECTMatrNrASMatrikelnummer,
Name
FROMStudent;

listet die SpaltenMatrNrund Name aller Zeilen der TabelleStudentauf.MatrNrwird beim Anzeigeergebnis als Matrikelnummer aufgeführt.

Ergebnis:

Matrikelnummer Name
26120 Fichte
25403 Jonas
27103 Fauler

Abfrage mit Filter (WHERE)

[Bearbeiten|Quelltext bearbeiten]
SELECTVorlNr,
Titel
FROMVorlesung
WHERETitel='ET';

listetVorlNrundTitelaller derjenigen Zeilen der TabelleVorlesungauf, deren TitelETist.

Die solchermaßen strukturierte, häufig verwendete Anweisung wird nach den Anfangsbuchstaben auch als „SFW-Block “bezeichnet.

Ergebnis:

VorlNr Titel
5001 ET

Abfrage mit Filter nach Inhalt (WHERE... LIKE...)

[Bearbeiten|Quelltext bearbeiten]
SELECTName
FROMStudent
WHERENameLIKE'F%';

listet die Namen aller Studenten auf, deren Name mitFbeginnt (im Beispiel:FichteundFauler).

LIKEkann mit verschiedenenPlatzhalternverwendet werden:_steht für ein einzelnes beliebiges Zeichen,%steht für eine beliebige Zeichenfolge. Manche Datenbanksysteme bieten weitere solcherWildcard-Zeichen an, etwa für Zeichenmengen.

Ergebnis:

Name
Fichte
Fauler

Abfrage mit Filter und Sortierung (ORDER BY)

[Bearbeiten|Quelltext bearbeiten]
SELECTVorname,
Name,
StrasseNr,
Plz,
Ort
FROMStudent
WHEREPlz='20095'
ORDERBYName;

listetVorname,Name,StrasseNr,PlzundOrtaller Studenten aus dem angegebenen Postleitzahlbereich aufsteigend sortiert nachNameauf.

Abfrage mit verknüpften Tabellen (,undINNER JOIN)

[Bearbeiten|Quelltext bearbeiten]
SELECTVorlesung.VorlNr,
Vorlesung.Titel,
Professor.PersNr,
Professor.Name
FROMProfessor,
Vorlesung
WHEREProfessor.PersNr=Vorlesung.PersNr;

Die Aufzählung hinterFROMlegt die Datenquellen fest: An dieser Stelle können mit Hilfe sogenannterJOINsmehrere Tabellen miteinander verknüpft werden, so dass Daten aus verschiedenen Tabellen zusammengeführt und angezeigt werden.

In diesem Beispiel wird ein „innerer natürlicher Verbund “(NATURAL INNER JOIN) verwendet: alle Datensätze aus den TabellenProfessorundVorlesung,die den gleichen Wert im FeldPersNrhaben.Professoren ohneVorlesungundVorlesungen ohneProfessorwerden damit nicht angezeigt.

Dies ist äquivalent zu:

SELECTVorlesung.VorlNr,
Vorlesung.Titel,
Professor.PersNr,
Professor.Name
FROMProfessor
INNERJOINVorlesung
ONProfessor.PersNr=Vorlesung.PersNr;

Vorsicht: Nicht alle Implementierungen verstehen beide Schreibweisen, dieOracle-SchreibweiseFROM Professor, Vorlesunggilt als veraltet und ist weniger verbreitet. Sie entspricht auch nicht dem ANSI-Standard und sollte deshalb vermieden werden. Aus historischen Gründen ist sie jedoch noch häufig anzutreffen.

Tabellen können nicht nur über Schlüsselfelder, sondern über beliebige Felder miteinander verknüpft werden, wie das folgende, fachlich unsinnige Beispiel zeigt:

SELECTVorlesung.Titel,
Professor.Name
FROMProfessor,
Vorlesung
WHEREProfessor.Name<>Vorlesung.Titel

Das Ergebnis enthält die KombinationenallerVorlesungen undallerProfessoren,bei denen der Name desProfessors vom Titel derVorlesungabweicht– das sind einfach alle (keineVorlesungheißt wie einProfessor):

Titel Name
ET Tesla
ET Wirth
ET Urlauber
IT Tesla
IT Wirth
IT Urlauber
DB Tesla
DB Wirth
DB Urlauber

Linker äußerer Verbund (LEFT OUTER JOIN)

[Bearbeiten|Quelltext bearbeiten]
SELECTProfessor.PersNr,
Professor.Name,
Vorlesung.VorlNr,
Vorlesung.Titel
FROMProfessor
LEFTOUTERJOINVorlesung
ONProfessor.PersNr=Vorlesung.PersNr;

ergibt alle Datensätze der TabelleProfessor,verbunden mit den Datensätzen der TabelleVorlesung,die den jeweils gleichen Wert im FeldPersNrhaben.Professoren ohne Vorlesung sind im Ergebnis enthalten. Die Spalten aus derVorlesung-Tabelle haben dann den WertNULL.Vorlesungen ohneProfessorsind nicht enthalten.

Die folgende Abfrage liefert nur diejenigen Datensätze, zu denen kein passender Datensatz im linken äußeren Verbund existiert (alleProfessoren, die keineVorlesungen halten):

SELECTProfessor.PersNr,
Professor.Name
FROMProfessor
LEFTOUTERJOINVorlesung
ONProfessor.PersNr=Vorlesung.PersNr
WHEREVorlesung.PersNrISNULL;

Das Gleiche kann mittels einer Unterabfrage erreicht werden:

SELECTProfessor.PersNr,
Professor.Name
FROMProfessor
WHERENOTEXISTS(SELECT*
FROMVorlesung
WHEREPersNr=Professor.PersNr);

Gruppierung mit Aggregat-Funktionen (GROUP BY)

[Bearbeiten|Quelltext bearbeiten]
SELECTProfessor.PersNr,
Professor.Name,
COUNT(Vorlesung.PersNr)ASAnzahl
FROMProfessor
LEFTOUTERJOINVorlesung
ONProfessor.PersNr=Vorlesung.PersNr
GROUPBYProfessor.Name,
Professor.PersNr;

zählt die Anzahl derVorlesungenproProfessormit Hilfe derAggregat-FunktionCOUNT.

Bemerkung:COUNT(Professor.PersNr)oderCOUNT(*)wären falsch (NULL-Wertesollen nicht mitgezählt werden).

Zusammenfassung einesSELECT

[Bearbeiten|Quelltext bearbeiten]

Zusammengefasst kann man die wichtigsten Elemente einer SQL-SELECT-Abfrage etwa so beschreiben:

SELECT[DISTINCT]Auswahlliste[ASSpaltenalias]
FROMQuelle[[AS]Tabellenalias],evtl.mitJOIN-Verknüpfungen
[WHEREWhere-Klausel]
[GROUPBYeinodermehrereGroup-by-Attribute]
[HAVINGHaving-Klausel]
[ORDERBYeinodermehrereSortierungsattributemit[ASC|DESC]];

Erläuterung:

  • DISTINCT:gibt an, dass aus der Ergebnisrelation gleicheErgebnistupelentfernt werden sollen. Es wird also jeder Datensatz nur einmal ausgegeben, auch wenn er mehrfach in der Tabelle vorkommt. Sonst liefert SQL eineMultimengezurück.
  • Auswahlliste:bestimmt, welche Spalten derQuelleauszugeben sind (*für alle) und obAggregatsfunktionenanzuwenden sind. Wie bei allen anderen Aufzählungen werden die einzelnen Elemente mit Komma (,) voneinander getrennt.
  • Quelle:gibt an, wo die Daten herkommen. Es könnenRelationenundSichtenangegeben werden und miteinander alskartesisches Produktoder als Verbund (JOIN,ab SQL-92) verknüpft werden. Mit der zusätzlichen Angabe eines Namens können Relationen für die Abfrage umbenannt werden (vgl.Beispiele).
  • WHERE-Klausel:bestimmt Bedingungen, auch Filter genannt, unter denen die Daten ausgegeben werden sollen. In SQL ist hier auch die Angabe von Unterabfragen möglich, so dass SQLstreng relational vollständigwird.
  • GROUP BY-Attribut:legt fest, ob unterschiedliche Werte als einzelne Zeilen ausgegeben werden sollen (GROUP BY= Gruppierung) oder aber die Feldwerte der Zeilen durch Aggregationen wie Addition (SUM), Durchschnitt (AVG), Minimum (MIN), Maximum (MAX) zu einem Ergebniswert zusammengefasst werden, der sich auf die Gruppierung bezieht.
  • HAVING-Klausel:ist wie dieWHERE-Klausel, nur dass sich die angegebene Bedingung auf das Ergebnis einer Aggregationsfunktion bezieht, zum BeispielHAVING SUM (Betrag) > 0.
  • Sortierungsattribut:NachORDER BYwerden Attribute angegeben, nach denen sortiert werden soll. Die Standardvoreinstellung istASC,das bedeutet aufsteigende Sortierung,DESCist absteigende Sortierung.

Mengenoperatorenkönnen auf mehrereSELECT-Abfragen angewandt werden, die gleich viele Attribute haben und bei denen die Datentypen der Attribute übereinstimmen:

  • UNION:vereinigt die Ergebnismengen. In einigen Implementierungen werden mehrfach vorkommende Ergebnistupel wie beiDISTINCTentfernt, ohne dassUNION DISTINCTgeschrieben werden muss beziehungsweise darf.
  • UNION ALL:vereinigt die Ergebnismengen. Mehrfach vorkommende Ergebnistupel bleiben erhalten. Einige Implementierungen interpretieren aberUNIONwieUNION ALLund verstehen dasALLmöglicherweise nicht und geben eine Fehlermeldung aus.
  • EXCEPT:liefert die Tupel, die in einer ersten, jedoch nicht in einer zweiten Ergebnismenge enthalten sind. Mehrfach vorkommende Ergebnistupel werden entfernt.
  • MINUS:ein analoger Operator wieEXCEPT,der in manchen SQL-Dialekten alternativ benutzt wird.
  • INTERSECT:liefert die Schnittmenge zweier Ergebnismengen. Mehrfach vorkommende Ergebnistupel werden entfernt.

Einfügen von Datensätzen (INSERT INTO... VALUES...)

[Bearbeiten|Quelltext bearbeiten]
INSERTINTOVorlesung(VorlNr,Titel,PersNr)VALUES(1000,'Softwareentwicklung 1',12);
INSERTINTOVorlesung(VorlNr,Titel,PersNr)VALUES(1600,'Algorithmen',12);
INSERTINTOVorlesung(VorlNr,Titel,PersNr)VALUES(1200,'Netzwerke 1',20);
INSERTINTOVorlesung(VorlNr,Titel,PersNr)VALUES(1001,'Datenbanken',15);

fügt vier Datensätze in die TabelleVorlesungein. Die Werte müssen mit den Datentypen der FelderVorlNr,TitelundPersNrzusammenpassen.

SELECT*
FROMVorlesung;

liefert dann zum Beispiel das Ergebnis (die Reihenfolge kann auch anders sein):

VorlNr Titel PersNr
1001 Datenbanken 15
1000 Softwareentwicklung 1 12
1200 Netzwerke 1 20
5001 ET 12
5022 IT 12
1600 Algorithmen 12
5045 DB 15

Ändern von Datensätzen (UPDATE)

[Bearbeiten|Quelltext bearbeiten]
UPDATEVorlesung
SETVorlNr=VorlNr+1000,
PersNr=20
WHEREPersNr=15;

ändert alle Datensätze, für diePersNrden Wert15hat. Der Wert vonVorlNrwird um1000erhöht und der Wert vonPersNrauf20gesetzt.

Ergebnis eines nachfolgendenSELECT *ist, eventuell mit anderer Reihenfolge:

VorlNr Titel PersNr
1000 Softwareentwicklung 1 12
1200 Netzwerke 1 20
1600 Algorithmen 12
2001 Datenbanken 20
5001 ET 12
5022 IT 12
6045 DB 20

Löschen von Datensätzen (DELETE)

[Bearbeiten|Quelltext bearbeiten]
DELETEFROMVorlesung
WHEREPersNr=12;

löscht alle Datensätze, für diePersNrden Wert12hat.

Ergebnis eines nachfolgendenSELECT *,eventuell in anderer Reihenfolge:

VorlNr Titel PersNr
1200 Netzwerke 1 20
2001 Datenbanken 20
6045 DB 20

Zusammenfassung vonINSERT,UPDATEundDELETE

[Bearbeiten|Quelltext bearbeiten]

Verallgemeinert sehen die Änderungsanweisungen wie folgt aus.

INSERT-Anweisung:

INSERTINTOQuelle[(Auswahlliste)]
VALUES(Werteliste)|SELECT<Auswahlkriterien>;

UPDATE-Anweisung:

UPDATEQuelleSETZuweisungsliste
[FROMFrom-Klausel]
[WHEREAuswahlbedingung];

DELETE-Anweisung:

DELETEFROMQuelle
[WHEREAuswahlbedingung];

Datenbanktabelle (CREATE TABLE)

[Bearbeiten|Quelltext bearbeiten]

DieDatenbanktabelleVorlesungkann mit der folgendenAnweisungerzeugt werden:

CREATETABLEVorlesung(VorlNrINTNOTNULLPRIMARYKEY,TitelVARCHARNOTNULL,PersNrNOTNULL,FOREIGNKEY(PersNr)REFERENCESProfessor(PersNr));

In keinem der FelderVorlNr,Titel,PersNrist der WertNULLerlaubt. DerFremdschlüsselPersNrreferenziertdenPrimärschlüsselPersNrder TabelleProfessor.Damit wird sichergestellt, dass in die TabelleVorlesungnurDatensätzeeingefügt werden können, für die der Wert vonPersNrin der TabelleProfessorals Primärschlüssel vorkommt (siehereferenzielle Integrität).

Datenbankindex (CREATE INDEX)

[Bearbeiten|Quelltext bearbeiten]

Mit derAnweisung

CREATEINDEXVorlesungIndex
ONVorlesung(PersNr,Titel);

kann einDatenbankindexfür die TabelleVorlesungdefiniert werden, der vom Datenbanksystem bei der Ausführung von Abfragen zur Beschleunigung verwendet werden kann. Ob das sinnvoll ist, entscheidet das Datenbanksystem eigenständig durch komplexe Auswertungen und Analysen für jede Abfrage erneut.

Sicht (CREATE VIEW)

[Bearbeiten|Quelltext bearbeiten]

EineSichtist im Wesentlichen ein Alias für eineDatenbankabfrage.Sie kann wie eineDatenbanktabelleverwendet werden. DieAnweisung

CREATEVIEWVorlesungssichtAS
SELECTVorlesung.VorlNr,
Vorlesung.Titel,
Professor.PersNr,
Professor.Name
FROMProfessor
INNERJOINVorlesung
ONProfessor.PersNr=Vorlesung.PersNr;

speichert die definierte Abfrage als Sicht. Die Abfrage

SELECTTitel,
Name
FROMVorlesungssicht
WHEREVorlNr<5000;

verwendet dieseSichtund könnte zum Beispiel folgendes Ergebnis liefern:

Titel Name
Softwareentwicklung 1 Wirth
Netzwerke 1 Urlauber
Algorithmen Wirth
Datenbanken Urlauber

Zusammenfassung vonCREATE TABLE,CREATE INDEXundCREATE VIEW

[Bearbeiten|Quelltext bearbeiten]

Zusammengefasst sind die wichtigsten Elemente der Definition einerDatenbanktabelle,einesDatenbankindexoder einerSichtwie folgt anzugeben:

CREATETABLETabellenname(Attributdefinition[PRIMARYKEY])[,FOREIGNKEY(Attributliste)REFERENCESTabellenname(Attributliste)]);
DROPTABLETabellenname;
ALTERTABLETabellenname(Attributdefinition[PRIMARYKEY])[,FOREIGNKEY(Attributliste)REFERENCESTabellenname(Attributliste)]);

CREATEINDEXIndexnameONTabellenname(Attributliste);
DROPINDEXIndexname;

CREATEVIEWSichtname[(Attributliste)]ASSELECT<Auswahlkriterien>;
DROPVIEWSichtname;

EinGrundsatzdesDatenbankdesignsist, dass in einer Datenbank keineRedundanzenauftreten sollen. Dies bedeutet, dass jede Information, also zum Beispiel eine Adresse, nur genau einmal gespeichert wird.

Beispiel:in der Teilnehmerliste einer Vorlesung werden die Adressen nicht erneut erfasst, sondern nur indirekt über die Matrikelnummer. Um dennoch eine Teilnehmerliste mit Adressen zu erstellen, erfolgt eineSELECT-Abfrage, in der die Teilnehmertabelle mit der Studententabelle verknüpft wird (siehe oben:JOIN).

In manchen Fällen ist diePerformanceeiner Datenbank besser, wenn sie nicht (vollständig) normalisiert wird. In diesem Falle werden in der Praxis oft Redundanzen bewusst in Kauf genommen, um zeitaufwändige und komplexeJoinszu verkürzen und so die Geschwindigkeit der Abfragen zu erhöhen. Man spricht auch von einer Denormalisierung einer Datenbank. Wann (und ob überhaupt) eine Denormalisierung sinnvoll ist, ist umstritten und hängt von den Umständen ab.

Während die Informationen auf viele Tabellen verteilt werden müssen, um Redundanzen zu vermeiden, sind Schlüssel das Mittel, um diese verstreuten Informationen miteinander zu verknüpfen.

So hat in der Regel jeder Datensatz eine eindeutige Nummer oder ein anderes eindeutiges Feld, um ihn zu identifizieren. Diese Identifikationen werden als Schlüssel bezeichnet.

Wenn dieser Datensatz in anderen Zusammenhängen benötigt wird, wird lediglich sein Schlüssel angegeben. So werden bei der Erfassung von Vorlesungsteilnehmern nicht deren Namen und Adressen, sondern nur deren jeweilige Matrikelnummer erfasst, aus der sich alle weiteren Personalien ergeben.

So kann es sein, dass manche Datensätze nur aus Schlüsseln (meist Zahlen) bestehen, die erst in Verbindung mit Verknüpfungen verständlich werden. Der eigene Schlüssel des Datensatzes wird dabei als Primärschlüssel bezeichnet. Andere Schlüssel im Datensatz, die auf die Primärschlüssel anderer Tabellen verweisen, werden als Fremdschlüssel bezeichnet.

Schlüssel können auch aus einer Kombination mehrerer Angaben bestehen. Zum Beispiel können die Teilnehmer einer Vorlesung durch die eindeutige Kombination von Vorlesungsnummer und Studentennummer identifiziert werden, so dass die doppelte Anmeldung eines Studenten zu einer Vorlesung ausgeschlossen ist.

Referenzielle Integrität

[Bearbeiten|Quelltext bearbeiten]

Referenzielle Integrität bedeutet, dass Datensätze, die von anderen Datensätzen verwendet werden, in der Datenbank auch vollständig vorhanden sind.

Im obigen Beispiel bedeutet dies, dass in der Teilnehmertabelle nur Matrikel-Nummern gespeichert sind, die es in der Studenten-Tabelle auch tatsächlich gibt.

Diese wichtige Funktionalität kann (und sollte) bereits von der Datenbank überwacht werden, so dass zum Beispiel

  • nur vorhandene Matrikelnummern in die Teilnehmertabelle eingetragen werden können,
  • der Versuch, den Datensatz eines Studenten, der schon eine Vorlesung belegt hat, zulöschen,entweder verhindert wird (Fehlermeldung) oder der Datensatz auch gleich aus der Teilnehmertabelle entfernt wird (Löschweitergabe) und
  • der Versuch, die Matrikelnummer eines Studenten, der schon eine Vorlesung belegt hat, zuändern,entweder verhindert wird (Fehlermeldung) oder der Eintrag in der Teilnehmertabelle gleich mitgeändert wird (Aktualisierungsweitergabe).

Widersprüchlichkeit von Daten wird allgemein alsDateninkonsistenzbezeichnet. Diese besteht, wenn Daten bspw. dieIntegritätsbedingungen(z. B.ConstraintsoderFremdschlüsselbeziehungen) nicht erfüllen.

Ursachen für Dateninkonsistenzen können Fehler bei der Analyse des Datenmodells, fehlendeNormalisierungdesERModer Fehler in der Programmierung sein.

Zum letzteren gehören dieLost-Update-Phänomene sowie die Verarbeitung von zwischenzeitlich veralteten Zwischenergebnissen. Dies tritt vor allem bei der Online-Verarbeitung auf, da dem Nutzer angezeigte Werte nicht in einer Transaktion gekapselt werden können.

Beispiel:
TransaktionAliest Wertx
TransaktionBverringert Wertxum 10
TransaktionAerhöht den gespeicherten Wert vonxum eins und schreibt zurück
Ergebnis x' = x+1
Die Änderung vonBist verloren gegangen

In den oben vorgestellten Befehlen CREATE TABLEundALTER TABLEwird bei der Definition jeder Spalte angegeben, welchenDatentypdie Werte dieser Spalte annehmen können. Dazu liefert SQL eine ganze Reihe standardisierter Datentypen mit. Die einzelnen DBMS-Hersteller haben diese Liste jedoch um eine Unzahl weiterer Datentypen erweitert. Die wichtigsten Standarddatentypen sind:

INTEGER
Ganze Zahl(positiv oder negativ), wobei je nach Zahl der verwendeten Bits Bezeichnungen wieSMALLINT,TINYINToderBIGINTverwendet werden. Die jeweiligen Grenzen und die verwendete Terminologie sind vom Datenbanksystem definiert.
NUMERIC (n, m)oderDECIMAL (n, m)
Festkommazahl(positiv oder negativ) mit insgesamt maximalnStellen, davonmNachkommastellen. Wegen der hier erfolgenden Speicherung als Dezimalzahl ist eine besonders für Geldbeträge notwendige Genauigkeit gegeben.
FLOAT (m)
Gleitkommazahl(positiv oder negativ) mit maximalmNachkommastellen.
REAL
Gleitkommazahl(positiv oder negativ). Die Genauigkeit für diesen Datentyp ist jeweils vom Datenbanksystem definiert.
DOUBLEoderDOUBLE PRECISION
Gleitkommazahl(positiv oder negativ). Die Genauigkeit für diesen Datentyp ist jeweils vom Datenbanksystem definiert.
FLOATundDOUBLE
sind für technisch-wissenschaftliche Werte geeignet und umfassen auch die Exponentialdarstellung. Wegen der Speicherung im Binärformat sind sie aber für Geldbeträge nicht geeignet, weil sich beispielsweise der Wert 0,10 € (entspricht 10 Cent) nicht exakt abbilden lässt.
CHARACTER (n)oderCHAR (n)
ZeichenketteText mitnZeichen.
VARCHAR (n)oderCHARACTER VARYING (n)
Zeichenkette (also Text) von variabler Länge, aber maximalndruckbaren und/oder nicht druckbaren Zeichen. Die VarianteVARCHAR2ist fürOraclespezifisch, ohne dass sie sich tatsächlich unterscheidet.
TEXT
Zeichenkette (zumindest theoretisch) beliebiger Länge. In manchen Systemen synonym zuCLOB.
DATE
Datum (ohne Zeitangabe)
TIME
Zeitangabe (evtl. inklusive Zeitzone)
TIMESTAMP
Zeitstempel (umfasst Datum und Uhrzeit; evtl. inklusive Zeitzone), meistens mit Millisekundenauflösung, teilweise auch mikrosekundengenau
BOOLEAN
Boolesche Variable(kann die Wertetrue(wahr) oderfalse(falsch) oderNULL(unbekannt) annehmen). Dieser Datentyp ist laut SQL:2003 optional und nicht alle DBMS stellen diesen Datentyp bereit.
BLOB(n)oderBINARY LARGE OBJECT (n)
Binärdaten von maximalnBytesLänge.
CLOB(n)oderCHARACTER LARGE OBJECT (n)
Zeichenketten mit maximalnZeichen Länge.

Wenn es die Tabellendefinition erlaubt, können Attribute auch den Wert NULLannehmen, wenn kein Wert bekannt ist oder aus anderen Gründen kein Wert gespeichert werden soll. Der NULL-Wert ist von allen anderen möglichen Werten des Datentyps verschieden.

Transaktion, Commit und Rollback

[Bearbeiten|Quelltext bearbeiten]

Eine Transaktion bezeichnet eine Menge von Datenbankänderungen, die zusammen ausgeführt werden (müssen). So ist beispielsweise die Buchung (als Transaktion) eines Geldbetrags durch zwei atomare Datenbankoperationen „Abbuchen des Geldbetrages von Konto A “und „Buchung des Geldbetrages auf Konto B “gekennzeichnet. Kann die vollständige Abarbeitung der elementaren Datenbankoperationen der Transaktion nicht durchgeführt werden (z. B. aufgrund eines Fehlers), müssen alle durchgeführten Änderungen an dem Datenbestand auf den Ausgangszustand zurückgesetzt werden.

Der Vorgang, der alle Änderungen einer Transaktion zurücksetzt, wird als Rollback bezeichnet. Der Begriff Commit bezeichnet das Ausführen einer Transaktion. Transaktionen sind eine Möglichkeit, die Konsistenz des Datenbestandes zu sichern. Im Beispiel der doppelten Kontenführung wird durch das Verhindern von ungültigen Teilbuchungen eine ausgeglichene Kontobilanz gewährleistet.

Datenbanken erlauben es zum Teil, bestimmte Befehle außerhalb einer Transaktion auszuführen. Darunter fällt insbesondere das Laden von Daten in Tabellen oder das Exportieren von Daten mittels Utilities. MancheDBMSerlauben das temporäre Abschalten der Transaktionslogik sowie einiger Kontrollen zur Erhöhung der Verarbeitungsgeschwindigkeit. Dies muss allerdings meist durch einen expliziten Befehl erzwungen werden, um ein versehentliches Ändern von Daten außerhalb einer Transaktion zu vermeiden. Solche Änderungen können, falls eine Datenbankwiederherstellung erforderlich ist, zu schweren Problemen oder gar Datenverlusten führen. Eine Transaktion wird mit der SQL-AnweisungCOMMITbeendet. Alle Änderungen der Transaktion werdenpersistentgemacht, und das DBMS stellt durch geeignete (interne) Mittel (z. B. Logging) sicher, dass diese Änderungen nicht verloren gehen.

Mit dem BefehlROLLBACKwird eine Transaktion ebenfalls beendet, es werden jedoch alle Änderungen seit Beginn der Transaktion rückgängig gemacht. Das heißt, der Zustand des Systems (in Bezug auf die Änderungen der Transaktion) ist der gleiche wie vor der Transaktion.

Programmieren mit SQL

[Bearbeiten|Quelltext bearbeiten]

Programmierschnittstelle

[Bearbeiten|Quelltext bearbeiten]

Das ursprüngliche SQL war keineTuring-vollständigeProgrammiersprache,es ermöglichte also nicht die Realisierung von beliebigenComputerprogrammen.Mittlerweile lässt es sich mit anderen Programmiersprachen kombinieren, um eineProgrammierungim engeren Sinne zu ermöglichen. Hierfür gibt es unterschiedliche Techniken.

  • MitEmbedded SQLkönnen SQL-Anweisungen im Quelltext eines Programms, typischerweise inC,C++,COBOL,Ada,Pascalo. Ä. geschrieben, eingebettet werden. Während der Programmvorbereitung übersetzt einPrecompilerdie SQL-Befehle in Funktionsaufrufe. Embedded SQL ist Teil des ANSI-SQL-Standards. Beispiele für Implementierungen:SQLJfürJava,Pro*CfürC,C++,ADOundADO.NET.
  • HerkömmlicheProgrammierschnittstellenerlauben die direkte Übergabe von SQL-Befehlen an Datenbanksysteme über Funktionsaufrufe. Beispiele:ODBC,JDBC,ADO.
  • Persistenz-Frameworkswie etwaHibernateoderiBATISabstrahieren vom Datenbankzugriff und ermöglichenobjektorientierteVerarbeitung von relationalen Datenbanken in einer objektorientierten Programmiersprache (z. B.JavaoderC#)
  • Mit dem Teil 4SQL/PSMdes Standards werden Konstrukte wie IF-Blöcke und Schleifen bereitgestellt. Er wird in den Datenbanksystemen in unterschiedlicher Ausprägung und mit Hersteller-spezifischen Erweiterungen implementiert, z. B.PL/SQLinOracleoderTransact-SQLimMS SQL Server.

Statisches und dynamisches SQL

[Bearbeiten|Quelltext bearbeiten]

Unabhängig von der verwendeten Programmiertechnik wird zwischenstatischemunddynamischemSQL unterschieden.

  • Beistatischem SQList die SQL-Anweisung dem Datenbanksystem zum Zeitpunkt der Programmübersetzung bekannt und festgelegt (z. B. wenn die Abfrage eines Kontos vorformuliert ist und zur Laufzeit nur die Kontonummer eingesetzt wird).
  • Beidynamischem SQList die SQL-Anweisung dem Datenbanksystem erst zum Zeitpunkt der Programmausführung bekannt (z. B. weil der Benutzer die komplette Abfrage eingibt). So sind z. B. alle SQL-Anweisungen, die mittelsSQL/CLIoderJDBCausgeführt werden grundsätzlich dynamisch. Ausgeführt werden dynamische SQL-Anweisungen im Allgemeinen mit execute immediate (SQL-String).

Bei dynamischem SQLmussdas Datenbanksystem die SQL-Anweisung zur Laufzeit des Programms interpretieren und den Zugriffspfad optimieren. Da dieser sogenannte Parse-Vorgang Zeit in Anspruch nimmt, puffern viele Datenbanksysteme die bereits geparsten SQL-Anweisungen, um mehrfaches Parsen gleicher Abfragen zu vermeiden. Bei statischem SQLkannschon bei der Übersetzung der Programme bzw. beim Binden der SQL-Anweisungen an eine Datenbank (sogenanntesBindder SQL-Befehle) der optimale Zugriffsweg bestimmt werden. Damit sind kürzestmögliche Laufzeiten der Anwendungsprogramme möglich, allerdings muss der Zugriffsweg aller betroffenen Programme neu bestimmt werden, wenn sich Voraussetzungen (z. B. Statistiken) ändern (Rebind). DieBind-Phase ist heute vor allem imGroßrechner-Umfeld bekannt, die meisten Datenbanksysteme optimieren hingegen zur Laufzeit.

  • etwa 1975:SEQUEL=Structured English Query Language,der Vorläufer vonSQL,wird für das ProjektSystem RvonIBMentwickelt.
  • 1979:SQLgelangt mitOracle V2erstmals durchRelational Software Inc.auf den Markt.
  • 1986:SQL1wird vonANSIals Standard verabschiedet.
  • 1987:SQL1wird von derInternationalen Organisation für Normung(ISO) als Standard verabschiedet und 1989 nochmals überarbeitet.
  • 1992: Der StandardSQL2oderSQL-92wird von der ISO verabschiedet.
  • 1999:SQL3oderSQL:1999wird verabschiedet. Im Rahmen dieser Überarbeitung werden weitere wichtige Features (wie etwaTriggeroder rekursive Abfragen) hinzugefügt.
  • 2003:SQL:2003.Als neue Features werden aufgenommenSQL/XML,Window functions, Sequences.
  • 2006:SQL/XML:2006.Erweiterungen fürSQL/XML[2].
  • 2008:SQL:2008bzw. ISO/IEC 9075:2008. Als neue Features werden aufgenommen INSTEAD OF-Trigger, TRUNCATE-Statement und FETCH Klausel.
  • 2011:SQL:2011bzw. ISO/IEC 9075:2011. Als neue Features werden aufgenommen „Zeitbezogene Daten “(PERIOD FOR). Es gibt Erweiterungen für Window functions und die FETCH-Klausel.
  • 2016:SQL:2016bzw. ISO/IEC 9075:2016. Als neue Features werden aufgenommen JSON und „row pattern matching “.
  • 2019:SQL/MDA:2019.Erweiterungen für einen Datentyp „mehrdimensionales Feld “.

Ziel der Standardisierung ist es,Anwendungsprogrammeso erstellen zu können, dass sie vom verwendeten Datenbanksystem unabhängig sind. Heutige Datenbanksystemeimplementierenmehr oder weniger große Teile des Sprachstandards. Darüber hinaus stellen sie oftmals herstellerspezifische Erweiterungen bereit, die nicht dem Standard-Sprachumfang entsprechen. In der Vor-SQL-Zeit strebte man die Portabilität von Anwendungen über diekompatible Schnittstellean.

Der Standard besteht insgesamt aus zehn einzelnen Publikationen:[3]

  • ISO/IEC 9075-1:2016 Part 1: Framework (SQL/Framework)
  • ISO/IEC 9075-2:2016 Part 2: Foundation (SQL/Foundation)
  • ISO/IEC 9075-3:2016 Part 3: Call-Level Interface (SQL/CLI)
  • ISO/IEC 9075-4:2016 Part 4: Persistent stored modules (SQL/PSM)
  • ISO/IEC 9075-9:2016 Part 9: Management of External Data (SQL/MED)
  • ISO/IEC 9075-10:2016 Part 10: Object language bindings (SQL/OLB)
  • ISO/IEC 9075-11:2016 Part 11: Information and definition schemas (SQL/Schemata)
  • ISO/IEC 9075-13:2016 Part 13: SQL Routines and types using the Java TM programming language (SQL/JRT)
  • ISO/IEC 9075-14:2016 Part 14: XML-Related Specifications (SQL/XML)
  • ISO/IEC 9075-15:2019 Part 15: Multi-dimensional arrays (SQL/MDA)

Ein weiterer Teil befindet sich derzeit (2019) in Entwicklung:

  • ISO/IEC 9075-16:20xx Part 16: Property Graph Queries (SQL/PGQ)

Der Standard wird durch sechs, ebenfalls standardisierteSQL multimedia and application packagesergänzt:

  • ISO/IEC 13249-1:2016 Part 1: Framework
  • ISO/IEC 13249-2:2003 Part 2: Full-Text
  • ISO/IEC 13249-3:2016 Part 3: Spatial
  • ISO/IEC 13249-5:2003 Part 5: Still image
  • ISO/IEC 13249-6:2006 Part 6: Data mining
  • ISO/IEC 13249-7:2013 Part 7: History

Weiterhin existieren eine Reihe Technical Reports, die eine Einführung zu den einzelnen Themen bieten.

  • ISO/IEC TR 19075-1:2011 Part 1: XQuery Regular Expression Support in SQLDownload
  • ISO/IEC TR 19075-2:2015 Part 2: SQL Support for Time-Related InformationDownload
  • ISO/IEC TR 19075-3:2015 Part 3: SQL Embedded in Programs using the JavaTM programming languageDownload
  • ISO/IEC TR 19075-4:2015 Part 4: SQL with Routines and types using the JavaTM programming languageDownload
  • ISO/IEC TR 19075-5:2016 Part 5: Row Pattern Recognition in SQLDownload
  • ISO/IEC TR 19075-6:2017 Part 6: SQL support for JavaScript Object Notation (JSON)Download
  • ISO/IEC TR 19075-7:2017 Part 7: Polymorphic table functions in SQLDownload
  • ISO/IEC TR 19075-8:2019 Part 8: Multi-dimensional arrays (SQL/MDA) (wurde zurückgezogen[4])

Ein weiterer Teil befindet sich derzeit (2019) in Entwicklung:

  • ISO/IEC TR 19075-9:20xx Part 9: Online Analytic Processing (OLAP) capabilities

Der offizielle Standard ist nicht frei verfügbar, jedoch existiert ein Zip-Archiv mit einer Arbeitsversion von 2008.[5]Die Technical Reports sind kostenlos von ISO erhältlich.

Die beiden ersten Teile des SQL StandardsSQL/FrameworkundSQL/Foundationlegen die Kernfunktionalitäten fest. In den weiteren Teilen werden spezifische Aspekte der Sprache definiert.

  • Teil 4: BeiSQL/PSMhandelt es sich um die Erweiterung um prozedurale Konstrukte. Sie ermöglichen unter anderem das Programmieren von Schleifen (FOR, WHILE, REPEAT UNTIL, LOOP), Cursorn, Exception-Handling, Triggern und eigenen Funktionen. Oracle implementiert diese Funktionalität unter dem NamenPL/SQL,DB2 verwendet den BegriffSQL/PL,PostgreSQL nennt esPL/pgSQL.
  • Teil 14:SQL/XMLermöglicht es,XML-Dokumente in SQL-Datenbanken zu speichern, mitXPathin SQL/XML:2003 undXQueryab SQL/XML:2006 abzufragen und relationale Datenbankinhalte als XML zu exportieren. Um die ursprünglichen Arbeiten an diesem Teil des Standards zu beschleunigen, hatte sich im Jahr 2000 eine informelle Arbeitsgruppe gebildet (IBM, Oracle,…), die unter dem NamenThe SQLX Groupund unter der BezeichnungSQLXdie Kernfunktionalitäten festlegte. Deren Arbeit ist in den jetzigen Standard eingeflossen.

Als Ergänzung zum SQL-Standard existiert mitISO/IEC 13249: SQL multimedia and application packageseine Norm, die für die AnwendungsfälleText,Geografische Daten,Bilder,Data miningundMetadatenspezialisierte Schnittstellen in SQL Syntax festlegt.

  • Donald D. Chamberlin, Raymond F. Boyce:SEQUEL: A Structured English Query Language.In:SIGMOD Workshop.Vol. 1 1974, S. 249–264.
  • Donald D. Chamberlin, Morton M. Astrahan, Kapali P. Eswaran, Patricia P. Griffiths, Raymond A. Lorie, James W. Mehl, Phyllis Reisner, Bradford W. Wade:SEQUEL 2: A Unified Approach to Data Definition, Manipulation, and Control.In:IBM Journal of Research and Development.20(6) 1976, S. 560–575.
  • Günter Matthiessen, Michael Unterstein:Relationale Datenbanken und SQL in Theorie und PraxisSpringer Vieweg,ISBN 978-3-642-28985-9.
  • Edwin Schicker:Datenbanken und SQL – Eine praxisorientierte Einführung.Teubner,ISBN 3-519-02991-X.
  • 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.
  • H. Faeskorn-Woyke, B. Bertelsmeier, P. Riemer, E. Bauer:Datenbanksysteme, Theorie und Praxis mit SQL2003, Oracle und MySQL.Pearson-Studium,ISBN 978-3-8273-7266-6.
  • 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.
  • A. Kemper,A. Eickler:Datenbanksysteme – Eine Einführung.Oldenbourg,ISBN 3-486-25053-1.
  • Marcus Throll, Oliver Bartosch:Einstieg in SQL 2008.2. Auflage. Galileo Computing,ISBN 978-3-8362-1039-3inklusive Übungssoftware SQL-Teacher
  • Marco Skulschus:SQL und relationale DatenbankenComelio Medien,ISBN 978-3-939701-11-8.
  • Michael Wagner:SQL/XML:2006 – Evaluierung der Standardkonformität ausgewählter Datenbanksysteme1. Auflage. Diplomica Verlag,ISBN 3-8366-9609-6.
  • Christian F. G. Schendera:SQL mit SAS. Band 1: PROC SQL für Einsteiger.Oldenbourg Wissenschaftsverlag, München 2011,ISBN 978-3-486-59840-7.
  • Christian F. G. Schendera:SQL mit SAS. Band 2: Fortgeschrittenes PROC SQL.Oldenbourg Wissenschaftsverlag, München 2012,ISBN 978-3-486-59836-0.
  • C. J. Date,Hugh Darwen:A Guide to the SQL standard: a users guide to the standard database language SQL, 4th ed.,Addison-Wesley, USA 1997,ISBN 978-0-201-96426-4
  • Jim Melton:Advanced SQL:1999: Understanding Object-Relational and Other Advanced Features, 1st ed.,Morgan Kaufmann, USA, 2002,ISBN 978-1558606777.
Wikibooks: SQL– Lern- und Lehrmaterialien
  1. Diskussion über System R und zur Namensänderung von SEQUEL zu SQL
  2. Michael Wagner:SQL/XML:2006 – Evaluierung der Standardkonformität ausgewählter Datenbanksysteme.Diplomica Verlag, 2010,ISBN 3-8366-9609-6,S.100.
  3. ISO/IEC 9075 und 13249.International Organization for Standardization,abgerufen am 20. September 2018(englisch).
  4. ISO/IEC TR 19075-8:2019.In:iso.org.Abgerufen am 24. August 2022(englisch).
  5. Arbeitsversion des Standards von 2008(ZIP;12,7 MB)