SQL
SQL(offizielle Aussprache [Datenbanksprachezur Definition vonDatenstruktureninrelationalen Datenbankensowie zum Bearbeiten (Einfügen, Verändern, Löschen) und Abfragen von darauf basierenden Datenbeständen.
], mitunter auch [ ]; auf Deutsch auch häufig die deutsche Aussprache der Buchstaben) ist eineDie 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 ([Edgar 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]
], Structured English Query Language) ab, welche mit Beteiligung vonSprachelemente und Beispiele
[Bearbeiten|Quelltext bearbeiten]SQL-Befehle lassen sich in fünf Kategorien unterteilen (Zuordnung nach der Theorie derDatenbanksprachenin Klammern):
- Data Query Language(DQL) – Befehle zur Abfrage und Aufbereitung der gesuchten Informationen, wird auch als Untermenge der DML klassifiziert
- Data Manipulation Language(DML) – Befehle zurDatenmanipulation(Ändern, Einfügen, Löschen vonDatensätzen) und lesendem Zugriff
- Data Definition Language(DDL) – Befehle zurDefinitiondesDatenbankschemas(Erzeugen, Ändern, Löschen vonDatenbanktabellen,Definition vonPrimärschlüsselnundFremdschlüsseln)
- Data Control Language(DCL) – Befehle für dieRechteverwaltung
- Transaction Control Language(TCL) – Befehle für dieTransaktionskontrolle
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: | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Relationen: |
|
|
|
|
Einfache Abfrage
[Bearbeiten|Quelltext bearbeiten]SELECT*
FROMStudent;
listet alle Spalten und alle Zeilen der TabelleStudent
auf.
Ergebnis:
MatrNr |
Name
|
---|---|
26120 |
Fichte
|
25403 |
Jonas
|
27103 |
Fauler
|
Abfrage mit Spaltenauswahl (,
)
[Bearbeiten|Quelltext bearbeiten]SELECTVorlNr,
Titel
FROMVorlesung;
listet die SpaltenVorlNr
undTitel
aller Zeilen der TabelleVorlesung
auf.
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 SpalteMatrNr
aus der Tabellehoert
auf. 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 SpaltenMatrNr
und Name aller Zeilen der TabelleStudent
auf.MatrNr
wird 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';
listetVorlNr
undTitel
aller derjenigen Zeilen der TabelleVorlesung
auf, deren TitelET
ist.
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 mitF
beginnt (im Beispiel:Fichte
undFauler
).
LIKE
kann 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
,Plz
undOrt
aller Studenten aus dem angegebenen Postleitzahlbereich aufsteigend sortiert nachName
auf.
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 hinterFROM
legt die Datenquellen fest: An dieser Stelle können mit Hilfe sogenannterJOIN
smehrere 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 TabellenProfessor
undVorlesung
,die den gleichen Wert im FeldPersNr
haben.Professor
en ohneVorlesung
undVorlesung
en ohneProfessor
werden 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, Vorlesung
gilt 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 KombinationenallerVorlesung
en undallerProfessor
en,bei denen der Name desProfessor
s vom Titel derVorlesung
abweicht– das sind einfach alle (keineVorlesung
heiß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 FeldPersNr
haben.Professor
en ohne Vorlesung sind im Ergebnis enthalten. Die Spalten aus derVorlesung
-Tabelle haben dann den WertNULL
.Vorlesung
en ohneProfessor
sind nicht enthalten.
Die folgende Abfrage liefert nur diejenigen Datensätze, zu denen kein passender Datensatz im linken äußeren Verbund existiert (alleProfessor
en, die keineVorlesung
en 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 derVorlesungen
proProfessor
mit 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:Nach
ORDER BY
werden Attribute angegeben, nach denen sortiert werden soll. Die Standardvoreinstellung istASC
,das bedeutet aufsteigende Sortierung,DESC
ist 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 beiDISTINCT
entfernt, ohne dassUNION DISTINCT
geschrieben werden muss beziehungsweise darf.UNION ALL
:vereinigt die Ergebnismengen. Mehrfach vorkommende Ergebnistupel bleiben erhalten. Einige Implementierungen interpretieren aberUNION
wieUNION ALL
und verstehen dasALL
mö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 TabelleVorlesung
ein. Die Werte müssen mit den Datentypen der FelderVorlNr
,Titel
undPersNr
zusammenpassen.
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 diePersNr
den Wert15
hat. Der Wert vonVorlNr
wird um1000
erhöht und der Wert vonPersNr
auf20
gesetzt.
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 diePersNr
den Wert12
hat.
Ergebnis eines nachfolgendenSELECT *
,eventuell in anderer Reihenfolge:
VorlNr |
Titel
|
PersNr
|
---|---|---|
1200
|
Netzwerke 1
|
20
|
2001
|
Datenbanken
|
20
|
6045 |
DB
|
20
|
Zusammenfassung vonINSERT
,UPDATE
undDELETE
[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];
Datendefinition
[Bearbeiten|Quelltext bearbeiten]Datenbanktabelle (CREATE TABLE
)
[Bearbeiten|Quelltext bearbeiten]DieDatenbanktabelleVorlesung
kann mit der folgendenAnweisungerzeugt werden:
CREATETABLEVorlesung(VorlNrINTNOTNULLPRIMARYKEY,TitelVARCHARNOTNULL,PersNrNOTNULL,FOREIGNKEY(PersNr)REFERENCESProfessor(PersNr));
In keinem der FelderVorlNr
,Titel
,PersNr
ist der WertNULL
erlaubt. DerFremdschlüsselPersNr
referenziertdenPrimärschlüsselPersNr
der TabelleProfessor
.Damit wird sichergestellt, dass in die TabelleVorlesung
nurDatensätzeeingefügt werden können, für die der Wert vonPersNr
in der TabelleProfessor
als Primärschlüssel vorkommt (siehereferenzielle Integrität).
Datenbankindex (CREATE INDEX
)
[Bearbeiten|Quelltext bearbeiten]Mit derAnweisung
CREATEINDEXVorlesungIndex
ONVorlesung(PersNr,Titel);
kann einDatenbankindexfür die TabelleVorlesung
definiert 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 INDEX
undCREATE 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;
Redundanz
[Bearbeiten|Quelltext bearbeiten]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 eine
SELECT
-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.
Schlüssel
[Bearbeiten|Quelltext bearbeiten]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
SQL-Datentypen
[Bearbeiten|Quelltext bearbeiten]In den oben vorgestellten Befehlen
CREATE TABLE
undALTER TABLE
wird 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 wie
SMALLINT
,TINYINT
oderBIGINT
verwendet werden. Die jeweiligen Grenzen und die verwendete Terminologie sind vom Datenbanksystem definiert. NUMERIC (n, m)
oderDECIMAL (n, m)
- Festkommazahl(positiv oder negativ) mit insgesamt maximal
n
Stellen, davonm
Nachkommastellen. Wegen der hier erfolgenden Speicherung als Dezimalzahl ist eine besonders für Geldbeträge notwendige Genauigkeit gegeben. FLOAT (m)
- Gleitkommazahl(positiv oder negativ) mit maximal
m
Nachkommastellen. REAL
- Gleitkommazahl(positiv oder negativ). Die Genauigkeit für diesen Datentyp ist jeweils vom Datenbanksystem definiert.
DOUBLE
oderDOUBLE PRECISION
- Gleitkommazahl(positiv oder negativ). Die Genauigkeit für diesen Datentyp ist jeweils vom Datenbanksystem definiert.
FLOAT
undDOUBLE
- 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 mit
n
Zeichen. VARCHAR (n)
oderCHARACTER VARYING (n)
- Zeichenkette (also Text) von variabler Länge, aber maximal
n
druckbaren und/oder nicht druckbaren Zeichen. Die VarianteVARCHAR2
ist fürOraclespezifisch, ohne dass sie sich tatsächlich unterscheidet. TEXT
- Zeichenkette (zumindest theoretisch) beliebiger Länge. In manchen Systemen synonym zu
CLOB
. 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 Werte
true
(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 maximal
n
BytesLänge. CLOB(n)
oderCHARACTER LARGE OBJECT (n)
- Zeichenketten mit maximal
n
Zeichen Länge.
Wenn es die Tabellendefinition erlaubt, können Attribute auch den Wert
NULL
annehmen, 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-AnweisungCOMMIT
beendet. 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 BefehlROLLBACK
wird 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.
Chronologie
[Bearbeiten|Quelltext bearbeiten]- 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 “.
Sprachstandard
[Bearbeiten|Quelltext bearbeiten]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.
Erweiterungen
[Bearbeiten|Quelltext bearbeiten]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.
Literatur
[Bearbeiten|Quelltext bearbeiten]- 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.
Weblinks
[Bearbeiten|Quelltext bearbeiten]- Erklärvideos zu SQL,Big Data Analytics Group, Uni Saarland
- Linkkatalog zum Thema SQLbeicurlie.org(ehemalsDMOZ)
- SQL-Grundlagen– Einführung mit Beispielen und Vergleich diverser Datenbanken
- Merkblatt SQL
- The 1995 SQL Reunion: People, Projects, and Politics– zur frühen Geschichte von SQL (englisch)
- Frei verfügbare SQL-Standard-Dokumente,z. B. SQL:2003 und SQL:2008 (englisch)
- SQL-Tutorial
- GNU SQLTutor
- SQLcoach– Freies Üben von SQL
- Interaktiver SQL-Trainer (Anmeldung notwendig)
- Blogbeitrag zu SQL-Befehlen und deren Einsatz in PHP
- SQL Tuning
- Transact-SQL Reference (Database Engine)
Siehe auch
[Bearbeiten|Quelltext bearbeiten]- Data Manipulation Language
- Data Definition Language
- Data Control Language
- Transaction Control Language
- SQL-Injection
- SchemaSQL
- Continuous Query Language
- Liste der Datenbankmanagementsysteme
- Bereichsabfrage
Einzelnachweise
[Bearbeiten|Quelltext bearbeiten]- ↑Diskussion über System R und zur Namensänderung von SEQUEL zu SQL
- ↑Michael Wagner:SQL/XML:2006 – Evaluierung der Standardkonformität ausgewählter Datenbanksysteme.Diplomica Verlag, 2010,ISBN 3-8366-9609-6,S.100.
- ↑ISO/IEC 9075 und 13249.International Organization for Standardization,abgerufen am 20. September 2018(englisch).
- ↑ISO/IEC TR 19075-8:2019.In:iso.org.Abgerufen am 24. August 2022(englisch).
- ↑Arbeitsversion des Standards von 2008(ZIP;12,7 MB)