Structured Query Language

Structured Query Language

SQL (das Kürzel für Structured Query Language; offizielle Aussprache [ɛskjuːˈɛl], häufig auch [ˈsiːkwəl] →SEQUEL), ist eine Datenbanksprache zur Definition, Abfrage und Manipulation von Daten in relationalen Datenbanken. SQL ist von ANSI und ISO standardisiert und wird von fast allen gängigen Datenbanksystemen unterstützt. SQL umfasst die folgenden Datenbanksprachen: Data Manipulation Language, Data Definition Language, Data Control Language.

Die Syntax von SQL ist relativ einfach aufgebaut und semantisch an die englische Umgangssprache angelehnt. SQL stellt eine Reihe von Befehlen zur Definition von Datenstrukturen nach der relationalen Algebra, zur Manipulation von Datenbeständen (Einfügen, Bearbeiten und Löschen von Datensätzen) und zur Abfrage von Daten zur Verfügung. Durch seine Rolle als Quasi-Standard ist SQL von großer Bedeutung, da eine weitgehende Unabhängigkeit von der benutzten Software erzielt werden kann.

Die meisten heute verbreiteten Datenbanksysteme implementieren Teile des SQL-Sprachstandards. Dadurch ist es möglich, Anwendungsprogramme zu erstellen, die vom verwendeten Datenbanksystem unabhängig sind. In der Vor-SQL-Zeit gelang dies mit dem System der kompatiblen Schnittstellen. Viele SQL-Implementierungen bieten darüber hinaus noch herstellerspezifische Erweiterungen, die nicht dem Standard-Sprachumfang entsprechen, was zur Folge hat, dass von den Herstellern parallel entwickelte gleiche Funktionen unterschiedliche Sprachelemente benutzen.

1986 wurde der erste SQL-Standard vom ANSI verabschiedet (der dann 1987 von der ISO ratifiziert wurde). 1992 wurde der Standard überarbeitet und als SQL-92 (oder auch SQL2) veröffentlicht. Alle aktuellen Datenbanksysteme halten sich im wesentlichen an diese Standardversion. Die Version SQL:1999 (ISO/IEC 9075:1999, auch SQL3 genannt) ist noch nicht in allen Datenbanksystemen implementiert. Das gilt auch für die nächste Version SQL:2003. Der aktuelle Standard wurde 2008 unter SQL:2008 verabschiedet.

Inhaltsverzeichnis

Sprachelemente und Beispiele

SQL-Befehle lassen sich in drei Kategorien unterteilen (Zuordnung nach der Theorie der Datenbanksprachen in Klammern):

Im weiteren Verlauf des Abschnitts werden viele SQL-Befehle erklärt; Grundlage ist dabei das folgende Beispiel:

ERD:

Relationen:
Student
MatrNr Name
26120 Fichte
25403 Jonas
hört
MatrNr VorlNr
25403 5022
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

Abfrage: SELECT

Die SELECT-Anweisung startet eine Abfrage. Aufgrund der Syntax kann eine SELECT-Anweisung auch als „SFW-Block“ (SELECT, FROM, WHERE) bezeichnet werden. Syntax (unvollständig):

 SELECT [DISTINCT] Auswahlliste
 FROM Quelle
 [WHERE Where-Klausel]
 [GROUP BY (Group-by-Attribut)+
  [HAVING Having-Klausel]]
 [ORDER BY (Sortierungsattribut [ASC|DESC])+];
  • DISTINCT gibt an, dass aus der Ergebnisrelation gleiche Ergebnistupel entfernt werden sollen. Es wird also jeder Datensatz nur einmal ausgegeben, auch wenn er mehrfach in der Tabelle vorkommt. Sonst liefert SQL eine Multimenge zurück.
  • Auswahlliste bestimmt, welche Spalten der Quelle auszugeben sind (* für alle) und ob Aggregatfunktionen anzuwenden sind. Wie bei allen anderen Aufzählungen werden die einzelnen Elemente mit Komma voneinander getrennt.
  • Quelle gibt an, wo die Daten herkommen. Es können Relationen und Sichten angegeben werden und miteinander als kartesisches Produkt oder als Verbund (JOIN, ab SQL-92) verknüpft werden. Mit der zusätzlichen Angabe eines Namens können Tupelvariablen besetzt werden, d. h. Relationen für die Abfrage umbenannt werden (vgl. Beispiele).
  • Where-Klausel bestimmt Bedingungen, unter denen die Daten ausgegeben werden sollen. In SQL ist hier auch die Angabe von Unterabfragen möglich, so dass SQL streng relational vollständig wird.
  • Group-by-Attribut legt fest, ob unterschiedliche Werte als einzelne Zeilen ausgegeben werden sollen ("GROUP BY" = Gruppierung) oder aber die Feldwerte der Zeilen durch Addition ("SUM"), Durchschnitt ("AVG"), Minimum ("MIN"), Maximum ("MAX") o.ä. zu einem Ergebniswert zusammengefasst werden, der sich dann auf die Gruppierung bezieht.
  • Having-Klausel ist wie die Where-Klausel, nur dass sich die angegebene Bedingung auf das Ergebnis einer Aggregationsfunktion bezieht (z. B. HAVING SUM (Betrag > 0).
  • Sortierungsattribut: nach ORDER BY werden Attribute angegeben, nach denen sortiert werden soll. ASC gibt dabei aufsteigende (Standard), DESC absteigende Sortierung an.

Mengenoperatoren können auf mehrere SFW-Blöcke angewandt werden, die gleich viele Attribute haben und bei denen die Datentypen der Attribute übereinstimmen:

  • UNION vereinigt die Ergebnismengen. Mehrfach vorkommende Ergebnistupel werden wie bei DISTINCT entfernt.
  • UNION ALL vereinigt die Ergebnismengen. Mehrfach vorkommende Ergebnistupel bleiben erhalten.
  • EXCEPT liefert die Tupel, die in A, jedoch nicht in B enthalten sind. Mehrfach vorkommende Ergebnistupel werden entfernt.
  • MINUS ist ein analoger Operator für EXCEPT, der von manchen SQL-Dialekten alternativ benutzt wird.
  • INTERSECT liefert die Schnittmenge zweier Ergebnismengen. Mehrfach vorkommende Ergebnistupel werden entfernt.

Beispiele:

SELECT *
FROM   Student
listet die Werte aller Spalten aus der Tabelle Student auf.
SELECT MatrNr
FROM   Student
Projektion: Listet die Spalte MatrNr der Tabelle Student auf.
SELECT DISTINCT PersNr
FROM   Professor
Projektion: Listet die vorhandenen, verschiedenen Ausprägungen der Spalte PersNr aus der Tabelle Professor auf.
SELECT MatrNr AS Matrikelnummer, Name
FROM   Student
Umbenennung: Die Spalte MatrNr heißt in der Ergebnisrelation jetzt Matrikelnummer.
SELECT VorlNr, Titel
FROM   Vorlesung
WHERE  PersNr = 12
Selektion: Listet alle Vorlesungen des Professors mit der Personalnummer '12' auf.
SELECT a.VorlNr, a.Titel, b.PersNr, b.Name
FROM   Professor b, Vorlesung a
WHERE  b.PersNr = a.PersNr
Innerer natürlicher Verbund: Alle Datensätze aus den Tabellen Professor und Vorlesung, die den gleichen Wert im Feld PersNr haben. Professoren ohne Vorlesung und Vorlesungen ohne Professor sind nicht enthalten. Dies ist äquivalent zu:
SELECT a.VorlNr, a.Titel, b.PersNr, b.Name
FROM   Professor b INNER JOIN Vorlesung a
       ON b.PersNr = a.PersNr
Innerer natürlicher Verbund: Alle Datensätze aus den Tabellen Professor und Vorlesung, die den gleichen Wert im Feld PersNr haben. Professoren ohne Vorlesung und Vorlesungen ohne Professor sind nicht enthalten.
SELECT a.VorlNr, a.Titel, b.PersNr, b.Name
FROM   Professor b LEFT OUTER JOIN Vorlesung a
       ON b.PersNr = a.PersNr
Äußerer linker natürlicher Verbund: Alle Datensätze der Tabelle Professor und alle Datensätze aus beiden Tabellen, die den gleichen Wert im Feld PersNr haben. Professoren ohne Vorlesung sind enthalten, Vorlesungen ohne Professor sind nicht enthalten.
SELECT b.PersNr, b.Name
FROM   Professor b LEFT OUTER JOIN Vorlesung a 
       ON b.PersNr = a.PersNr 
WHERE  a.PersNr IS NULL
Äußerer linker natürlicher Verbund, Selektion und Projektion: Alle Professoren, die keine Vorlesungen halten.
SELECT a.PersNr, a.Name
FROM   Professor a
WHERE  NOT EXISTS (SELECT * FROM Vorlesung WHERE PersNr = a.PersNr)
Unterabfrage mit Existenz-Quantor: Das gleiche mittels einer Unterabfrage.
SELECT   COUNT(b.PersNr) AS Anzahl, a.PersNr, a.Name
FROM     Professor a LEFT OUTER JOIN Vorlesung b
         ON a.PersNr = b.PersNr
GROUP BY a.Name, a.PersNr
Äußerer linker natürlicher Verbund und Gruppierung, Aggregation: Zählt die Anzahl der Vorlesungen pro Professor.
Merke: COUNT(a.PersNr) oder COUNT(*) wären falsch (Nullwerte sollen nicht mitgezählt werden).

Manipulationsbefehle: INSERT, UPDATE, DELETE

Syntax (unvollständig):

INSERT INTO Relation [( Attribut+ )] VALUES ( ( Konstante+ ) )+
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. Dabei kann jeweils mehr als 1 Zeile verarbeitet 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 weggelassen, werden alle Tupel gelöscht, aber nicht das Relationsschema.

Beispiele:

INSERT INTO Student (MatrNr,Name) VALUES (27123, 'Meier')
Fügt eine Zeile mit den geg. Werten für die Spalten MatrNr und Name in die Tabelle Student hinzu.
INSERT INTO Student (MatrNr,Name) VALUES (27124, 'Schulz'), (27125, 'Schmidt')
Fügt zwei Zeilen mit den angegebenen Werten für die Spalten MatrNr und Name in die Tabelle Student hinzu.
INSERT INTO Student VALUES (27126, 'Schmidt')
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. Zusätzlich müssen Werte für alle Spalten der Tabelle bereitgestellt werden.
INSERT INTO Student (MatrNr,Name) SELECT MatrNr, Name FROM Student_alt
Lädt alle Studenten aus der Tabelle Student_alt in die Tabelle Student.
UPDATE Student SET Name='Meier' WHERE MatrNr = 27124
Ändert den Wert der Spalte Name in der Tabelle Student für eine bestimmte MatrNr.
DELETE FROM Student
Löscht alle Zeilen aus der Tabelle Student.
DELETE FROM Student WHERE MatrNr = 27124
Löscht die Zeile mit der MatrNr 27124 aus der Tabelle Student.

Datendefinition: CREATE, ALTER, DROP

Syntax (primary key und foreign key sind Teil der SQL-89 IDL bzw. SQL-92 und werden von manchen Datenbanksystemen 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 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. Sichten). Eine ORDER BY Klausel ist in Sichtdefinitionen nicht zulässig, da Sichten wieder Relationen sind, und Relationen sind (Multi-)Mengen, also per Definition nicht sortiert.
  • Die CREATE-Anweisung wird in modernen DBMS dazu benutzt, außer Relationen, Indizes und Sichten alle möglichen anderen Objekte zu kreieren.
  • Der SQL-Standard definiert Indizes überhaupt nicht, so dass die entsprechenden CREATE INDEX und DROP INDEX Anweisungen immer produktspezifische Erweiterungen sind. Allerdings verwenden die meisten DBMS die gleiche oder eine sehr ähnliche Syntax.

Beispiele:

CREATE TABLE Student (
  MatrNr INT NOT NULL PRIMARY KEY,
  Name varchar(50) NOT NULL)
Erzeugt die Tabelle namens Student mit den Spalten MatrNr und Name, wobei MatrNr der Primärschlüssel ist und in keiner der Spalten leere Felder erlaubt sind.
ALTER TABLE Student ADD Vorname varchar(35)
Definiert eine neue Spalte namens Vorname in der Tabelle Student.
DROP TABLE Student
Löscht die gesamte Tabelle Student.
CREATE INDEX idx_Name ON Student (Name)
Legt einen Index auf die Spalte Name der Tabelle Student. Der Index bekommt die Bezeichnung idx_Name und beschleunigt die Suche nach Datensätzen in der Tabelle Student, wenn der Name als Suchkriterium angegeben wird.
DROP INDEX idx_Name
Löscht den Index idx_Name.

Rechteverwaltung: GRANT und REVOKE

Diese Befehle regeln die Zugriffsrechte auf Datenbankobjekte. 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 ebenfalls 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 Student TO groupx;
Gestattet dem Benutzer bzw. der Gruppe groupx einen lesenden und ändernden Zugriff auf die Tabelle Student.
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, welchen Datentyp die 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:

smallint

Ganze Zahl (positiv oder negativ). Die genauen Grenzen sind vom Datenbanksystem definiert.

int oder integer

Ganze Zahl (positiv oder negativ). Die genauen Grenzen sind vom Datenbanksystem definiert.

bigint

Ganze Zahl (positiv oder negativ). Die genauen Grenzen sind vom Datenbanksystem definiert. Dieser Datentyp ist laut SQL:2003 optional und nicht alle DBMS stellen diesen Datentyp bereit.

numeric (n, m) oder decimal (n, m)

Festkommazahl (positiv oder negativ) mit maximal n Vorkommastellen und m 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 oder double precision

Gleitkommazahl (positiv oder negativ). Die Genauigkeit für diesen Datentyp ist jeweils vom Datenbanksystem definiert.

float und double 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) oder char (n)

Zeichenkette Text mit n Zeichen.

varchar (n) oder character varying (n)

Zeichenkette (also Text) von variabler Länge, aber maximal n druckbaren und/oder nicht druckbaren Zeichen. Die Variante varchar2 ist für Oracle spezifisch, ohne dass sie sich tatsächlich unterscheidet.

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) oder false (falsch) annehmen). Dieser Datentyp ist laut SQL:2003 optional und nicht alle DBMS stellen diesen Datentyp bereit.

blob (n) oder binary large object (n)

Binärdaten von maximal n Bytes Länge.

clob (n) oder character 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.

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

Ein Schlüssel ist eine Tabelleneigenschaft, um Daten innerhalb der Tabelle 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 oder einen Unique Key einer anderen (oder auch der gleichen) Relation verweist. Ein Fremdschlüssel kann, muss aber nicht Bestandteil des Primärschlüssel seiner Relation sein.

Transaktion, Commit und Rollback

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. Manche DBMS erlauben 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 beendet man erfolgreich mit der SQL-Anweisung Commit. Alle Änderungen der Transaktion werden persistent gemacht, und das DBMS stellt durch geeignete (interne) Mittel (z. B. Logging) sicher, dass diese Änderungen nicht verloren gehen. Mit dem Befehl Rollback 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.

Dateninkonsistenz

Als Dateninkonsistenz wird allgemein die Widersprüchlichkeit von Daten bezeichnet. Diese besteht, wenn Daten bspw. die Integritätsbedingungen (z. B. Constraints oder Fremdschlüsselbeziehungen) nicht erfüllen. So können Referenzen einer Tabelle auf Records einer anderen verweisen. Wurde dieser referenzierte Eintrag aber bereits gelöscht, so sind die Daten in der ersten (referenzierenden) Tabelle inkonsistent, weil ein Verweis auf einen nicht vorhandenen Record referenziert.

Ursachen für Dateninkonsistenzen können Fehler bei der Analyse des Datenmodells, fehlende Normalisierung des ERM oder Fehler in der Programmierung sein.

Zum letzteren gehören die Lost-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:
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

Referentielle Integrität

Von referentieller Integrität spricht man, wenn jeder Fremdschlüssel einer Tabelle einem entsprechenden Primärschlüssel einer anderen Tabelle zugeordnet, oder der Wert des Fremdschlüssels NULL ist. Die referentielle Integrität garantiert die Existenz des Schlüssels in der referenzierten Tabelle.

Um Dateninkonsistenzen zu vermeiden, können Beziehungen zwischen Tabellen 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 können zum Beispiel durch Kaskadierung ein Datensatz und mit ihm alle abhängigen Daten gelöscht werden.

Folgende Änderungsregeln sind möglich:

  1. Durchführen der Operation und Verifizieren der Fremdschlüsselbeziehung am Ende: NO ACTION (default)
    D. h. ein Primärschlüssel kann geändert oder gelöscht werden, wenn die Semantik der Anweisung und aller involvierten Trigger dafür sorgt, dass die Fremdschlüsselbeziehung nicht verletzt wird.
  2. Zurückweisen der Änderungsoperation: RESTRICT
    D. h. ein Primärschlüssel kann nicht gelöscht werden, wenn noch abhängige Objekte bestehen.
  3. Propagieren der Änderungen: CASCADE
    D. h. bei ON DELETE CASCADE werden ebenfalls alle abhängigen Datenzeilen gelöscht.
  4. Verweise auf NULL setzen: SET NULL
    D. h. die entsprechenden Werte der abhängigen Fremdschlüssel werden auf NULL gesetzt.
  5. Verweise auf Defaultwert setzen: SET DEFAULT
    D. h. die entsprechenden Werte der abhängigen Fremdschlüssel werden auf den Defaultwert der Spalte gesetzt.

Ein Update von Primärschlüsseln (PK-Update) ist zwar von Codd vorgesehen. Manche Datenbankadministratoren und Anwendungsentwickler sind jedoch der Ansicht, dass dies der grundsätzlichen Idee des Schlüssels widerspräche. Sie betrachten einen Primärschlüssel als stets unveränderlich. In solchen Fällen werden meist Surrogatschlüssel eingesetzt, da diese bei Änderung der Daten gleich bleiben können.

Redundanz

Ein Grundsatz des Datenbankdesigns ist, dass in einer Datenbank keine Redundanzen auftreten sollen. Man spricht dann von einer redundanzfreien Datenbank. Dies wird durch die Normalisierung erreicht.

In manchen Fällen ist die Performance einer 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 komplexe Joins zu 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.

Ein Merkmal der Redundanz ist, dass 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.

Programmieren mit SQL

Programmierschnittstelle

SQL ist keine Turing-vollständige Programmiersprache, ermöglicht also nicht die Realisierung von beliebigen Computerprogrammen. Sie kann aber mit anderen Programmiersprachen kombiniert werden, um eine Programmierung im engeren Sinne zu ermöglichen. Hierfür gibt es unterschiedliche Techniken.

  • Mit Embedded SQL können SQL-Anweisungen im Quelltext eines Programms, typischerweise in C, C++, COBOL, Ada, Pascal o. Ä. geschrieben, eingebettet werden. Während der Programmvorbereitung übersetzt ein Precompiler die SQL-Befehle in Funktionsaufrufe. Embedded SQL ist Teil des ANSI SQL – Standards. Beispiele für Implementierungen: SQLJ für Java, Pro*C für C und C++.
  • Herkömmliche Programmierschnittstellen erlauben die direkte Übergabe von SQL-Befehlen an Datenbanksysteme über Funktionsaufrufe. Beispiele: ODBC, JDBC.
  • Persistenz-Frameworks wie etwa Hibernate oder iBATIS abstrahieren vom Datenbankzugriff und ermöglichen objektorientierte Verarbeitung von relationalen Datenbanken in einer objektorientierten Programmiersprache (z. B. Java oder C#)

Statisches und dynamisches SQL

Unabhängig von der verwendeten Programmiertechnik wird zwischen statischem und dynamischem SQL unterschieden.

  • Bei statischem SQL ist 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).
  • Bei dynamischem SQL ist 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 mittels SQL/CLI oder JDBC ausgeführt werden grundsätzlich dynamisch. Ausgeführt werden dynamische SQL-Anweisungen im Allgemeinen mit execute immediate ('SQL-String').

Bei dynamischem SQL muss das Datenbanksystem die SQL-Anweisung zur Laufzeit des Programms interpretieren und den Zugriffspfad optimieren. Da dieser so genannte Parse-Vorgang Zeit in Anspruch nimmt, puffern viele Datenbanksysteme die bereits geparsten SQL-Anweisungen, um so, falls sie sich wiederholen, die Zeit für ein erneutes Parsen zu sparen. Bei statischem SQL kann schon bei der Übersetzung der Programme bzw. beim Binden der SQL-Anweisungen an eine Datenbank (so genanntes Bind der 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). Die Bind-Phase ist heute vor allem im Großrechner-Umfeld bekannt, die meisten Datenbanksysteme optimieren hingegen zur Laufzeit.

Erweiterungen

Es existieren eine Vielzahl von Erweiterungen des SQL-Standards.

SQL/XML ist ein ANSI- und ISO-Standard (ISO/IEC 9075-14:2006), der es ermöglicht, XML-Dokumente in SQL-Datenbanken zu speichern, mit XPath und XQuery abzufragen und relationale Datenbankinhalte als XML zu exportieren [1]. Der ISO-Standard ist nicht frei verfügbar, jedoch gibt es ein Zip-Archiv mit einer Entwurfsversion von 2008.

SQL/PSM ist ein ISO-Standard, der SQL um prozedurale Programmierkonstrukte erweitert. Sie bietet viele Erweiterungen zu den Standard-SQL-Sprachelementen. Sie erlaubt unter anderem das Programmieren von Schleifen (FOR, WHILE, REPEAT UNTIL, LOOP), Cursor, Exception-Handling, Trigger und eigenen Funktionen. Oracle implementiert diese Funktionalität unter dem Namen PL/SQL, DB2 verwendet den Begriff SQL/PL, PostgreSQL nennt es PL/pgSQL.

Name

Die Bezeichnung SQL wird im allgemeinen Sprachgebrauch als Abkürzung für „Structured Query Language“ aufgefasst, obwohl sie laut ANSI-Standard ein eigenständiger Name ist. Die Bezeichnung leitet sich von dem Vorgänger SEQUEL ([ˈsiːkwəl], Structured English Query Language) ab, der von IBM in den 1970er Jahren auf der Grundlage des Artikels „A Relational Model of Data for Large Shared Data Banks“ (1970) von Edgar F. Codd entworfen wurde.

SEQUEL wurde später in SQL umbenannt, weil SEQUEL ein eingetragenes Warenzeichen der Hawker Siddeley Aircraft Company war.[1]

Geschichte und Standards

  • etwa 1975: SEQUEL = Structured English Query Language, der Vorläufer von SQL, wird für das Projekt System R von IBM entwickelt.
  • 1979: SQL gelangt mit Oracle V2 erstmals durch Relational Software Inc. auf den Markt.
  • 1986: SQL1 wird von ANSI als Standard verabschiedet.
  • 1987: SQL1 wird von der Internationalen Organisation für Normung (ISO) als Standard verabschiedet und 1989 nochmals überarbeitet.
  • 1992: Der Standard SQL2 oder SQL-92 wird von der ISO verabschiedet.
  • 1999: SQL3 oder SQL:1999 wird verabschiedet.
  • 2003: SQL:2003 ISO/IEC 9075:2003 wird von der ISO als Nachfolger des SQL:1999-Standards verabschiedet.
  • 2006: SQL:2006' ISO/IEC 9075-14:2006 legt fest, wie SQL in Zusammenhang mit XML verwendet werden kann.

Siehe auch

Einzelnachweise

  1. Diskussion über System R und zur Namensänderung von SEQUEL zu SQL

Literatur

  • Donald D. Chamberlin, Raymond F. Boyce: SEQUEL: A Structured English Query Language. SIGMOD Workshop, Vol. 1 1974: 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. IBM Journal of Research and Development 20(6): 560-575(1976)
  • 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.
  • 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.
  • A. Kemper, A. Eickler: Datenbanksysteme – Eine Einführung. Oldenbourg, ISBN 3-486-25053-1.
  • Marcus Throll, Oliver Bartosch: " Einstieg in SQL 2008." 2.Auflage Galileocomputing, ISBN 978-3-8362-1039-3

inklusive: Übungssoftware SQL-Teacher

Weblinks


Wikimedia Foundation.

Игры ⚽ Нужно решить контрольную?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Structured query language — SQL Apparu en 1974 Auteur …   Wikipédia en Français

  • Structured Query Language — Structured Query Language,   SQL …   Universal-Lexikon

  • Structured Query Language — SQL Apparu en 1974 Auteur Donald D. Chamberlin et Raymond F. Boyce Développeur IBM Dernière version stabl …   Wikipédia en Français

  • Structured Query Language — Содержание 1 История 1.1 Вопросы совместимости 2 Преимущества и недостатки …   Википедия

  • structured query language — SQL kalba statusas T sritis informatika apibrėžtis ↑Sąryšinių duomenų bazių ↑ užklausų kalba. Užklausos pavyzdys: SELECT VARDAS, PAVARDĖ FROM LENTELĖ WHERE AMŽIUS {{ 35 Ši užklausa išrenka iš duomenų bazės lentelės LENTELĖ vardus ir pavardes… …   Enciklopedinis kompiuterijos žodynas

  • Structured Query Language Interface — The Structured Query Language Interface (SQLI) is the internal interface between an application and the INFORMIX Online Dynamic Server. Starting from v10.0 Informix Dynamic Server also supports DRDA.External links* [http://www… …   Wikipedia

  • Structured Query Language —    Abbreviated SQL, pronounced [sequel]. In relational database management systems, a query language developed by IBM for use in mainframe applications.    SQL was adopted by Oracle Corporation for use in its database management systems running… …   Dictionary of networking

  • Structured Query Language — (Computers) language used in databases for defining searches, SQL …   English contemporary dictionary

  • Procedural Language/Structured Query Language — Procedural Language/Structured Query Language,   PL/SQL …   Universal-Lexikon

  • STRUCTURED QUERY LANGUAGE — (SQL) язык структурированных запросовмеждународный стандартный язык для определения и доступа к реляционным базам данных …   Словарь электронного бизнеса

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”