Inhaltsverzeichnis

Werbung
SQL
aus Wikipedia, der freien Enzyklopädie
SQL ist eine deklarative Datenbanksprache für relationale Datenbanken. SQL (im allgemeinen
Sprachgebrauch als Abkürzung für„Structured Query Language“ aufgefasst, obwohl laut ANSI-Standard
ein eigenständiger Name) ist aus SEQUEL ([ si kw l ], Structured English Query Language)
hervorgegangen, das von IBM in den 1970er Jahren auf der Grundlage des bahnbrechenden Artikels „ A
Relational Model of Data for Large Shared Data Banks“ (1970) von Edgar F. Codd entworfen wurde. IBM
definierte 1976 „SEQUEL /2“ und benannte es aus rechtlichen Gründen in „SQL“ um.
SQL hat eine relativ einfache Syntax, die an die englische Umgangssprache angelehnt ist, und stellt eine
Reihe von Befehlen zur Definition von Datenstrukturen nach der relationalen Algebra, zur Manipulation von
Datenbeständen (Anfü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 SQL-Implementierungen
bieten darüber hinaus allerdings noch herstellerspezifische Erweiterungen, die nicht dem
Standard-Sprachumfang entsprechen, was zur Folge hat, dass von den Herstellern parallel entwickelte gleiche
Funktionen unterschiedliche Sprachelemente benutzen.
Viele bekannte Datenbanksysteme wie DB2, Informix, Microsoft SQL Server, Pervasive P.SQL, MaxDB,
MySQL, Oracle, PostgreSQL, Borland Interbase, Firebird, Sybase, SQLite und die neueren Versionen von
Microsoft Access implementieren Teile des SQL Sprachstandards. Dadurch ist es möglich, Anwendungen zu
erstellen, die vom verwendeten Datenbanksystem unabhängig sind. In der Vor-SQL-Zeit gelang dies mit dem
System der Kompatiblen Schnittstellen.
1986 wurde der erste SQL-Standard vom ANSI verabschiedet (welcher dann 1987 von der ISO ratifiziert
wurde). 1992 wurde der Standard deutlich überarbeitet und als SQL-92 (oder auch SQL2) veröffentlicht. Alle
aktuellen Datenbanksysteme halten sich im wesentlichen an diese Standardversion. Die neuere Version
SQL:1999 (ISO/IEC 9075:1999, auch SQL3 genannt) ist noch nicht in allen Datenbanksystemen
implementiert. SQL:2003 ist noch weitgehend unimplementiert.
Inhaltsverzeichnis
1 Sprachelemente und Beispiele
1.1 Abfrage: SELECT
1.2 Manipulationsbefehle: INSERT, UPDATE, DELETE
1.3 Datendefinition: CREATE, ALTER, DROP
1.4 Rechteverwaltung: GRANT and REVOKE
2 SQL-Datentypen
3 Fachbegriffe
3.1 Schlüssel
3.2 Fremdschlüssel
3.3 Transaktion, Commit und Rollback
3.4 Dateninkonsistenz
3.5 Referenzielle Integrität
3.6 Redundanz
4 Programmieren mit SQL
4.1 Programmierschnittstelle
4.2 Statisches und dynamisches SQL
5 Erweiterungen
6 Geschichte
7 Siehe auch
8 Literatur
9 Weblinks
1 of 12
11/26/2006 11:36 PM
Sprachelemente und Beispiele
SQL-Befehle lassen sich in vier Kategorien unterteilen (Zuordnung nach Theorie der Datenbanksprachen in
Klammern):
Befehle zur Definition des Datenbankschemas (DDL)
Datenabfrage mit SELECT (DML)
Befehle zur Datenmanipulation = Ändern, Einfügen, Löschen (DML)
Befehle für die Rechteverwaltung (DCL)
Durchgängiges Beispiel für die folgenden SQL-Befehle:
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. Sonst
liefert SQL eine Multimenge zurück.
Auswahlliste bestimmt, welche Spalten der Quelle auszugeben sind (* für alle) und ob
Aggregatfunktionen anzuwenden sind.
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
2 of 12
11/26/2006 11:36 PM
Abfrage umbenannt werden (vgl. Beispiele).
Where-Klausel bestimmt Bedingungen, unter denen die Daten ausgegeben werden sollen. In SQL
(außer MySQL <4.1) ist hier auch die Angabe von Unterabfragen möglich, so dass SQL streng
relational vollständig wird.
Group-by-Attribut listet Attribute auf, deren Werte festlegen, welche Tupel zu Gruppen
zusammengefasst werden sollen. Auf jede Gruppe werden Aggregatfunktionen zusammen. Fehlt diese
Klausel, werden Aggregationsfunktionen auf alle Tupel angewendet, d.h. die gesamte Ergebnismenge
bildet eine Gruppe.
Having-Klausel ist wie die Where-Klausel, nur dass hier auf Aggregationsfunktionen zugegriffen wird
(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. Ein Sortierungsattribut muss
nicht in der Auswahlliste vorkommen.
Mengenoperatoren können auf mehrere SFW-Blöcke angewandt werden, die gleich viele Attribute und
gleichen Datentypen der Attribute haben:
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.
INTERSECT liefert die Schnittmenge zweier Ergebnismengen. Mehrfach vorkommende Ergebnistupel
werden entfernt.
Beispiele:
SELECT * FROM Adressen
Listet die Werte aller Spalten aus der Tabelle Adressen auf.
SELECT Name, Vorname, Postleitzahl FROM Adressen
Projektion: Listet nur die Spalten Name, Vorname und Postleitzahl der Tabelle Adressen auf.
SELECT Name, Vorname, Postleitzahl AS PLZ FROM Adressen
Projektion mit Umbenennung: Die Spalte Postleitzahl heißt in der Ergebnisrelation jetzt PLZ.
SELECT Name, Vorname FROM Adressen WHERE Ort = ’Ettenheim’
Selektion: Listet nur die Ettenheimer auf.
SELECT a.Name, a.Vorname, a.Plz, a.Ort FROM Adressen a INNER JOIN
Namenliste n ON a.Name = n.Name AND a.Vorname = n.Vorname
Verbund: Listet die Werte der Spalten Name, Vorname, Plz und Ort aus der Tabelle Adressen für alle
Namen die auch in der Tabelle Namenliste vorkommen auf.
SELECT a.Strasse
FROM Adressen a LEFT OUTER JOIN Leute l ON l.Strasse = a.Strasse
WHERE l.Strasse IS NULL
Äußerer linker Theta-Verbund: Listet alle Straßen auf, in denen niemand wohnt.
SELECT a.Strasse
FROM Adressen a
WHERE NOT EXISTS (SELECT * FROM Leute WHERE Strasse = a.Strasse)
Unterabfrage mit Existenz-Quantor: Das gleiche mit einer Unterabfrage.
SELECT Jahr, Quartal, SUM(Betrag) AS Umsatz FROM Rechnung GROUP BY Jahr,
3 of 12
11/26/2006 11:36 PM
Quartal
Gruppierung und Aggregation: Summiert die Spalte Betrag der Tabelle Rechnung und listet das
Ergebnis Quartalsweise.
SELECT verkaeufer, SUM(Betrag) AS Umsatzsumme
FROM Rechnung
GROUP BY verkaeufer
HAVING COUNT(*) >= 100
Listet die Verkäufer mit ihrem Gesamtumsatz auf, die mindestens 100 Rechnungen generiert haben.
Manipulationsbefehle: INSERT, UPDATE, DELETE
Syntax (unvollständig):
INSERT
INSERT
UPDATE
DELETE
INTO Relation [’(’ (Attribut)+ ’)’] VALUES ( ’(’(Konstanten)+’)’ )+
INTO Relation [’(’ (Attribut)+ ’)’] SFW-Block
Relation SET (Attribut=Ausdruck)+ WHERE Where-Klausel
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 können jeweils mehr als 1 Zeile verarbeiten werden.
Ausdruck aus der UPDATE-Anweisung kann insbesondere auch auf das zu manipulierende Attribut
bezug nehmen wie z. B. in UPDATE Personal SET Gehalt=Gehalt*2 WHERE
Abteilung=’EDV’
Wird bei DELETE die WHERE-Klausel weg gelassen, wird die ganze Relation gelöscht, aber nicht
deren Schema.
Beispiele:
INSERT INTO Adressen (Name, Vorname, Ort) VALUES (’Schroeder’, ’Kurt’,
’Köln’)
Fügt eine Zeile mit den geg. Werten für die SpaltenName, Vorname und Ort in die Tabelle Adressen
hinzu.
INSERT INTO Adressen (Name, Vorname, Ort) VALUES (’Schroeder’, ’Kurt’,
’Köln’), (’Schulz’, ’Detlef’, ’Oldenburg’)
Fügt zwei Zeilen mit den geg. Werten für die SpaltenName, Vorname und Ort in die Tabelle Adressen
hinzu.
INSERT INTO Adressen VALUES (’Schroeder’, ’Knut’, ’Köln’)
Beim insert-Statement kann die erste Klammer mit den Attribut-Namen auch weggelassen und direkt
mit values() die Werte eingefügt werden. Allerdings müssen dann die Werte in der gleichen Reihenfolge
wie in der Tabellendefinition angegeben werden. Zusätzlich müssen Werte für alle Spalten der Tabelle
bereitgestellt werden.
INSERT INTO Adressen (Name, Vorname, Ort) SELECT Nachname, Vorname, Ort
FROM Alte_Adressen
Lädt alle Adressen aus der Tabelle Alte_Adressen in die Tabelle Adressen.
INSERT INTO Kursteilnahme (Id_Person, Id_Kurs) SELECT 55, Id_Kurs FROM
Kursteilnahme WHERE Id_Person = 27
Übernimmt alle der Person 27 zugeordneten Einträge aus der Tabelle Kursteilnahme auch für Person 55.
UPDATE Adressen SET Ort=’Berlin’, Telefon=’030...’ WHERE Name =
4 of 12
11/26/2006 11:36 PM
’Schroeder’
Ändert den Wert in der TabelleAdressen, in der Spalte Ort aller Einträge auf "Berlin" (Telefon auf ...
usw), wenn der Wert in der Spalte Name "Schroeder" lautet.
DELETE FROM Adressen
Löscht alle Zeilen aus der Tabelle Adressen.
DELETE FROM Adressen WHERE name = ’Müller’
Löscht alle Zeilen aus der Tabelle Adressen, deren Wert in der Spalte Name "Müller" lautet.
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, Indizies und
Sichten alle möglichen anderen Objekte zu kreieren.
Der SQL-Standard definiert Indexe ü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 Laender (
Kuerzel_ISO character(2) primary key,
Land_Name varchar(50) NOT NULL)
Erzeugt eine neue Tabelle namens Laender mit den Spalten Kuerzel_ISO und Land_Name, wobei
Kuerzel_ISO der Primärschlüssel ist und in keiner der Spalten leere Felder erlaubt sind.
alter table Laender add Kuerzel_Auto varchar(3)
Definiert eine neue Spalte namens Kuerzel_Auto in der Tabelle Laender.
drop table Adressen
Löscht die gesamte Tabelle Adressen.
5 of 12
11/26/2006 11:36 PM
create index idx_Adressen on Adressen (Name)
Legt einen Index auf die Spalte Name der Tabelle Adressen. Der Index bekommt die Bezeichnung
idx_Adressen und beschleunigt die Suche nach Datensätzen in der Tabelle Adressen, wenn der Name
als Suchkriterium angegeben wird.
drop index idx_Adressen
Löscht den Index idx_Adressen.
Rechteverwaltung: GRANT and 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 Adressen to groupx;
Gestattet dem Benutzer bzw. der Gruppe groupx einen lesenden und ändernden Zugriff auf die Tabelle
Adressen.
revoke execute on procedure DSN8ED6 from public;
Entzieht allen nicht explizit berechtigten Benutzern das Recht, die Stored-Procedure DSN8ED6
auszuführen. Berechtigungen, die einem Benutzer oder einer Gruppe erteilt wurden, bleiben bestehen.
SQL-Datentypen
In den oben vorgestellten Befehlen create table und alter table wird bei der Definition jeder
Spalte angegeben, welchen Datentyp die Werte diese 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 minimal und maximal zulässigen Grenzen sind vom
Datenbanksystem definiert.
int oder integer
Ganze Zahl (positiv oder negativ). Die genauen minimal und maximal zulässigen Grenzen sind vom
Datenbanksystem definiert.
bigint
Ganze Zahl (positiv oder negativ). Die genauen minimal und maximal zulässigen Grenzen sind vom
Datenbanksystem definiert. Dieser Datentyp ist laut [[SQL:2003] optional und nicht alle DBMS stellen
6 of 12
11/26/2006 11:36 PM
diesen Datentyp bereit.
numeric (n, m) oder decimal (n,m)
Festkommazahl (positiv oder negativ) mit maximal n Stellen, davon m nach dem Komma
float (m)
Gleitkommazahl (positiv oder negativ) mit maximal m Stellen nach dem Komma
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.
character (n) oder char (n)
Zeichenkette (also Text) mit n druckbaren und/oder nicht druckbaren 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ürOracle spezifisch.
date
Datum
time
Zeitangabe (evtl. inklusive Zeitzone)
timestamp
Zeitstempel (umfasst Datum und Uhrzeit; evtl. inclusive Zeitzone)
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)
Stringdaten von maximal n Zeichen Länge.
Fachbegriffe
Die folgenden Fachbegriffe sind zum Verständnis von SQL hilfreich. Sie sind jedoch auch als eigenständige
Begriffe der Informatik bedeutsam und werden nicht nur im Kontext von SQL verwendet.
Schlüssel
7 of 12
11/26/2006 11:36 PM
Über einen Schlüssel kann jederDatensatz innerhalb der Tabelle eindeutig identifiziert werden. Ein Schlüssel
kann auch aus mehreren Attributen (Spalten) der Tabelle bestehen (zusammengesetzter Schlüssel). Ein
Schlüssel ist entweder ein Primärschlüssel oder ein Schlüsselkandidat.
Der Primärschlüssel muss aus einem Merkmal oder einer minimalen Merkmalskombination (bei
zusammengesetzten Primärschlüsseln) bestehen. Die Bedingung der minimalen Merkmalskombination bei
zusammengesetzten Primärschlüsseln bedeutet, dass ein Teil (Merkmal) des zusammengesetzten Schlüssels
nicht reichen darf, um jedes Tupel eindeutig zu identifizieren. Diese Bedingung kann und wird von
existierenden Datenbanksystemen nicht erzwungen.
In jeder Tabelle sollte grundsätzlich ein Primärschlüssel (primary key) definiert werden. Dieser ist häufig
der natürlicheSchlüsselder Tabelle, wenn er eindeutig ("unique") ist; es kann auch ein künstlicher Schlüssel
sein, beispielsweise ein Zähler , der pro Datensatz hoch gezählt wird. Schlüsselkandidaten, d.h. weitere,
unabhängige Schlüssel neben dem Primärschlüssel, können (und sollten) als Unique Constraints definiert
werden.
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 Primärschlüssel seiner Relation sein.
Transaktion, Commit und Rollback
Verbindet man sich mit einer Datenbank, kann man, die erforderlichen Privilegien vorausgesetzt, Änderungen
am Schema von Tabellen (und anderen Datenbankobjekten) oder den Daten in den Tabellen vornehmen.
Grundsätzlich ist in einer relationalen Datenbank alles innerhalb einer Transaktion auszuführen.
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-AnweisungCommit. 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 heisst, der Zustand des Systems (in Bezug auf die Änderungen der Transaktion) ist der gleiche
wie vor der Transaktion.
Dateninkonsistenz
ErfüllenDaten bspw. die Integritätsbedingungen (z.B. Constraints oder Fremdschlüsselbeziehungen) nicht, so
nennt man dies Dateninkonsistenz. So können Referenzen einer Tabelle auf Records einer anderen verweisen.
Wurde dieser referenzierte Eintrag nun gelöscht, so sind die Daten in der ersten (referenzierenden) Tabelle
inkonsistent, weil ein Verweis auf einen nicht-vorhandenen Record referenziert.
Der häufigste Grund für Dateninkonsistenzen ist die falsche Analyse des Datenmodells während der
Modellierung und Normalisierung des ERM oder Fehler in der Programmierung.
Zum letzteren gehören die Lost-Update-Phänomene sowie die Verarbeitung von zwischenzeitlich veralteten
Zwischenergebnissen. Dies tritt vor allem bei Online-Verarbeitung auf, da dem Nutzer angezeigte Werte nicht
in einer Transaktion gekapselt werden können.
8 of 12
11/26/2006 11:36 PM
Beispiel:
Transaktion A liest Wert x
Transaktion B verringert Wert x um 10
Transaktion A erhöht den gespeicherten Wert von x um eins und schreibt zurück
Ergebnis x’ = x+1
Die Änderung von B ist verloren gegangen
Referenzielle Integrität
Von referenzieller Integrität spricht man, wenn jeder Fremdschlüssel einer Tabelle einen entsprechenden
Primärschlüssel einer anderen Tabelle zugeordnet, oder der Wert des Fremdschlüssels NULL ist. Die
referenzielle 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 kann zum Beispiel durch Kaskadierung ein Datensatz
und 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üsselwerden auf NULL gesetzt.
5. Verweise auf Defaultwert setzen: SET DEFAULT
D.h. die entsprechenden Werte der abhängigen Fremdschlüsselwerden 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.
Redundanz
Ein Grundsatz des Datenbankdesigns ist, dass in einer Datenbank kaum Redundanzen auftreten sollen. Man
spricht dann von einer redundanzfreien Datenbank. Dies wird durch die Normalisierung erreicht.
Da eine Datenbank, die allen Anforderungen der 3. oder sogar 5. Normalform entspricht, in der Praxis bedingt
durch Performanceprobleme nicht zu verwenden wäre, werden nachträglich Redundanzen bewusst in Kauf
genommen, um zeitaufwändige und komplexe Joins zu verkürzen und so die Geschwindigkeit der Abfragen
zu erhöhen. Man spricht auch von einer Denormalisierung einer Datenbank.
Ein Merkmal der Redundanz ist, 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
Da SQL keine eigenständige Programmiersprache ist, muss SQL bei der Programmierung mit einer solchen
9 of 12
11/26/2006 11:36 PM
Sprache kombiniert werden. Hierfür gibt es unterschiedliche Techniken.
Beim eingebetteten SQL (engl. embedded SQL) wird eine Programmiersprache im Quelltext um
gekennzeichnete SQL-Anweisungen erweitert. Während der Programmvorbereitung übersetzt ein
Precompiler die SQL-Befehle in Funktionsaufrufe. Beispiele: Embedded SQL nach ANSI, SQLJ für
Java.
Herkömmliche (API-) Programmierschnittstellen erlauben die direkte Übergabe von SQL-Befehlen an
Datenbanksysteme über Funktionsaufrufe. Beispiele: ODBC, JDBC.
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-Anweisungungen, die mittels SQL/CLI oder JDBC ausgeführt werden grundsätzlich dynamisch.
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 wird in der Regel 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. 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).
Erweiterungen
Es existieren eine Vielzahl von Erweiterungen des SQL-Standards.
SQL/XML ist ein ANSI und ISO Standard (ISO/IEC 9075-14), der es ermöglicht, XML-Dokumente in
SQL-Datenbanken zu speichern, mit XPath und XQuery abzufragen und relationale Datenbankinhalte als
XML zu exportieren [1] (http://www.sqlx.org/) . Der ISO-Standard ist nicht frei verfügbar, jedoch gibt es ein
Zip-Archiv (http://www.wiscorp.com/sql_2003_standard.zip) mit einer Draft-Version von 2003.
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), Cursor, Exception-Handling, Trigger und eigenen Funktionen.
Oracle implementiert diese Funktionalitaet unter dem Namen PL/SQL, und DB2 verwendet den Begriff
SQL/PL.
Geschichte
ca. 1975
SEQUEL, Vorläufer von SQL wird für das ProjektSystem R von IBM entwickelt.
1981
SQL gelangt mit SQL/Data Systems erstmals durch IBM auf den Markt.
1986
SQL1 wird von ANSI als Standard verabschiedet.
1987
SQL1 wird jetzt auch von ISO als Standard verabschiedet und 1989 nochmals überarbeitet.
1992
Der Standard SQL2 bzw. SQL-92 wird von der ISO verabschiedet.
10 of 12
11/26/2006 11:36 PM
1999
SQL3 bzw. SQL:1999 wird verabschiedet.
2003
SQL:2003 wird von der ISO als Nachfolger des SQL:1999 Standards verabschiedet.
Siehe auch
Liste der Datenbankmanagementsysteme
SQL-Injektion
SchemaSQL
Nullwert
Continuous Query Language
Literatur
Donald D. Chamberlin, Raymond F. Boyce: SEQUEL: A structured English query language.
Proceedings of the 1974 ACM SIGFIDET workshop on Data description, acces and control.
Günter Matthiessen, Michael Unterstein: Relationale Datenbanken und SQL – Konzepte der
Entwicklung und Anwendung. Addison-Wesley, ISBN 3-8273-2085-2
Edwin Schicker: Datenbanken und SQL – Eine praxisorientierte Einführung. Teubner, ISBN
3-519-02991-X
(Obwohl bereits etwas betagt, ist dieses Buch gerade als wissenschaftlich fundierte und trotzdem leicht
verständliche Einführung in SQL sehr zu empfehlen.)
Oliver Bartosch, Markus Throll: Einstieg in SQL. Galileo Press, ISBN 3-89842-497-9
Daniel Warner, Günter Leitenbauer: SQL. Franzis, ISBN 3-7723-7527-8
Jörg Fritze, Jürgen Marsch: Erfolgreiche Datenbankanwendung mit SQL3. Praxisorientierte Anleitung
– effizienter Einsatz – inklusive SQL-Tuning. Vieweg Verlag, ISBN 3-528-55210-7
Can Türker: SQL 1999 & SQL 2003. Dpunkt Verlag, ISBN 3-89864-219-4
Gregor Kuhlmann, Friedrich Müllmerstadt: SQL. Rowohlt, ISBN 3-499-61245-3
Michael J. Hernandez, John L. Viescas: Go To SQL. Addison-Wesley, ISBN 3-8273-1772-X
Weblinks
Wikibooks: SQL – Lern- und Lehrmaterialien
deutsche DMOZ-Kategorie SQL
(http://dmoz.org/World/Deutsch/Computer/Programmieren/Sprachen/SQL/)
SQL-Tutorial (deutsch) (http://sql.1keydata.com/de/)
SQLzoo (englisch) (http://sqlzoo.net/)
SQL-Tutorial der Lichtenbergschule Darmstadt (deutsch)
(http://www.schulserver.hessen.de/darmstadt/lichtenberg/SQLTutorial/)
SQL-Tutorial aus der W3 Schule (englisch) (http://www.w3schools.com/sql/)
SQL-Kurzreferenz (http://www.inweb.de/chetan/Deutsch/Ressourcen/SQL.html)
SQL-Einführung und Referenz (http://aam.ugpl.de/?q=sql_hilfe/select)
SQL-Einführung und kleine Referenz (techonthenet, englisch)
(http://www.techonthenet.com/sql/index.php)
Free Tutorials (englisch) (http://www.thefreecountry.com/documentation/onlinesql.shtml)
The 1995 SQL Reunion: People, Projects, and Politics (zur frühen Geschichte von SQL)
(http://www.mcjones.org/System_R/SQL_Reunion_95/)
Von „ http://de.wikipedia.org/wiki/SQL“
Kategorie: Datenbanksprache
Korrigiere Fehler oder erweitere diesen Artikel!
Diese Seite wurde zuletzt am 26. November 2006 um 20:35 Uhr geändert.
Ihr Inhalt steht unter der GNU-Lizenz für freie Dokumentation.
Wikipedia® ist eine eingetragene Marke der Wikimedia Foundation Inc.
Datenschutz
Über Wikipedia
11 of 12
11/26/2006 11:36 PM
Impressum
12 of 12
11/26/2006 11:36 PM
Herunterladen