SQL
SQL (Structured Query Language, deutsch strukturierte Abfragesprache) ist eine Abfragesprache für relationale Datenbanken. Sie 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 ihre 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.
Viele bekannte Datenbanksysteme wie DB2, Microsoft SQL Server, MySQL, Oracle, PostgreSQL, Borland Interbase, Firebird und die neueren Versionen von Access implementieren Teile des SQL Sprachstandards.
Geschichte
Die Grundlage aller relationalen Datenbanken legte 1970 Edgar F. Codd mit seinem Artikel "A Relational Model of Data for Large Shared Data Banks". Codd arbeitete damals im IBM-Forschungslabor in San Jose, Kalifornien. Bei den auf diesen Artikel folgenden weltweiten Forschungsarbeiten war ein Aspekt die Entwicklung relationaler Sprachen. Die Bedeutendste von der kommerziellen Sichtweise her war die "Structured English Query Language" SEQUEL, die in den IBM Forschungslabors 1974 entwickelt wurde. 1976 wurde SEQUEL /2 definiert und aus rechtlichen Gründen in SQL umbenannt. Der Prototyp System R wurde 1977 funktionsfähig implementiert und enthielt einen Großteil der Sprache SQL.
Nach den Erfolgen bei den Benutzern von System R beschlossen mehrere Firmen SQL-basierte Datenbanken auf den Markt zu bringen. Das System ORACLE der Firma Relational Software Inc. (später in Oracle Corporation umbenannt) kam 1980 vor IBMs SQL/DS (1981) auf den Markt. Die Urversion der noch aktuell verfügbaren SQL-Implementierung DB2 von IBM entstand 1983. INGRES folgte im Jahre 1985, SYBASE 1986. SQL hatte sich innerhalb von 10 Jahren zum de-facto-Standard in der Welt der Datenbanken etabliert.
Das American National Standards Institute (ANSI) beauftragte 1982 die Standardisierung einer relationalen Sprache, die 1986 ratifiziert wurde und zum guten Teil aus dem IBM-Dialekt von SQL bestand. 1987 wurde SQL/86 auch als ISO-Standard akzeptiert. Aktualisierungen und Erweiterungen erfolgten mit SQL/89, SQL/92, SQL/99 und SQL:2003.
Sprachschichten und Beispiele
Die Datenbanksprache SQL läßt sich in vier eigenständige Sprachschichten einteilen: die Data Query Language (DQL, Datenabfrage), die Data Control Language (DCL, Datendefinition), die Data Manipulation Language (DML, Datenmanipulation) und die Data Definition Language (DDL,Rechteverwaltung).
Data Manipulation Language: INSERT, UPDATE, DELETE
Befehle zur Datenmanipulation: INSERT, UPDATE, DELETE
insert into Adressen (Name, Vorname, Ort) values ('Schroeder', 'Kurt', 'Köln')
- Fügt eine Zeile mit den geg. Werten für die Spalten Name, Vorname und Ort in die Tabelle Adressen hinzu.
insert into Adressen values ('Schroeder', 'Knut', 'Köln')
- Beim insert-Statement kann die erste Klammer mit den Attribut-Namen auch weggelassen werden und direkt mit values() die Werte eingefügt werden. Allerdings müssen dann die Werte in der gleichen Reihenfolge wie in der Tabellendefinition aufgelistet 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.
update Adressen set Ort="Berlin", Telefon="030..." where Name="Schroeder"
- Ändert den Wert in der Spalte Ort aller Einträge auf "Berlin" (Telefon auf ... usw), wenn der Wert in der Spalte Name "Schroeder" lautet.
delete from Adressen
- Löscht alle Zeilen aus der Tabelle Adressen.
truncate table Adressen
- Wie oben, aber nur von einigen DBMS unterstützt. Im Gegensatz zu delete nicht transaktionssicher.
delete from Adressen where name="Müller"
- Löscht alle die Zeilen aus der Tabelle Adressen, deren Wert in der Spalte Name "Müller" lautet.
Data Definition Language: CREATE, ALTER, DROP
Befehle zur Datendefinition:
create table Laender (Kuerzel_ISO character (2) primary key, Land_Name varchar2 (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 varchar2 (3)
- Definiert eine neue Spalte namens Kuerzel_Auto in der Tabelle Laender.
drop table Adressen
- Löscht die gesamte Tabelle Adressen.
create index idx_Adressen on Adressen (Name)
- Legt einen Index auf die Spalte Name der Tabelle Adressen. Der Index bekommt die Bezeichnung idx_Adressen und beschleunigt die Suche nach Datensätzen in der Tabelle Adressen, wenn der Name als Suchkriterium angegeben wird.
drop index idx_Adressen
- Löscht den Index idx_Adressen.
Data Control Language: GRANT and REVOKE
Befehle zur Vergabe von Rechten.
grant select,update on table Adressen to groupx
- Gestattet dem Benutzer bzw. der Gruppe groupx einen lesenden und ändernden Zugriff auf die Tabelle Adressen.
revoke execute on procedure DSN8ED6 from public
- Entzieht allen nicht explizit berechtigten Benutzern das Recht, die Stored-Procedure DSN8ED6 auszuführen. Berechtigungen, die einem Benutzer oder einer Gruppe erteilt wurden, bleiben bestehen.
SQL-Datentypen
In den oben vorgestellten Befehlen create table
und alter table
wird bei der Definition jeder Spalte angegeben, welches Datenformat sie unterstützen soll. Dazu liefert SQL eine ganze Reihe standardisierter Datentypen mit. Dies sind die wichtigsten von ihnen:
- Ganze Zahl (positiv oder negativ)
number (n)
- Ganze Zahl (positiv oder negativ) mit maximal
n
Stellen
number (n, m)
- Festkommazahl (positiv oder negativ) mit maximal
n
Stellen, davonm
nach dem Komma
float (m)
- Gleitkommazahl (positiv oder negativ) mit maximal
m
Stellen nach dem Komma
character (n)
- Zeichenkette (also Text) mit
n
druckbaren und/oder nicht druckbaren Zeichen
varchar (n)
,varchar2 (n)
- Zeichenkette (also Text) von variabler Länge, aber maximal
n
druckbaren und/oder nicht druckbaren Zeichen. Die Variantevarchar2
ist für Oracle spezifisch.
date
- Datum (bei Oracle inklusive Uhrzeit)
boolean
- Boolesche Variable (kann die Werte
true
(wahr) oderfalse
(falsch) annehmen). Dieser Datentyp fehlt in Oracle.
raw (n)
- Binärdaten von maximal
n
Bytes 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.
In jeder Tabelle sollte grundsätzlich ein Primärschlüssel definiert werden. Dieser ist entweder der natürliche Schlüssel der Tabelle oder ein künstlicher, beispielsweise ein Zähler, der pro Datensatz hoch gezählt wird. Dieser Schlüssel ermöglicht es, dass jeder Datensatz innerhalb der Tabelle eindeutig ist. Über den Schlüssel kann man den Datensatz eindeutig identifizieren. Ein Primärschlüssel kann auch aus mehreren Attributen (Spalten) der Tabelle bestehen (zusammengesetzter Primärschlüssel). Kein anderer Datensatz kann in dieser Tabelle denselben Schlüssel erhalten.
Der Primärschlüssel muss aus einem Merkmal oder einer minimalen Merkmalskombination (bei zusammengesetzten Primärschlüsseln) bestehen. Die Bedingung der minimalen Merkmalskombination bei zusammengesetzten Primärschlüsseln bedeutet, dass ein Teil (Merkmal) des zusammengesetzten Schlüssels nicht reichen darf, um ein Tupel eindeutig zu identifizieren.
Im Bereich der Relationalen Datenbanken bezeichnet der Fremdschlüssel ein Attribut einer Relation (Tabelle), das auf den Primärschlüssel einer anderen Relation verweist. Ein Fremdschlüssel kann, muss aber nicht Primärschlüssel seiner Relation sein.
Transaktion, Commit und Rollback
Loggt man sich in eine Datenbank ein, kann man Änderungen an den Tabellen oder den Daten vornehmen. Grundsätzlich ist in einer relationalen Datenbank alles innerhalb einer Transaktion zu sehen. Besondere Ausnahmen diverse DML Operationen wie DROP TABLE, DROP INDEX, DROP TABLESPACE etc. sowie einigen anderen, zum Teil datenbankspezifischen, Befehlen.
Datenbanken erlauben zum Teil bestimmte Befehle ausserhalb einer Transaktion auszuführen. Darunter fällt insbesondere das Laden von Tabellen, das Inserten von Daten in
bestehende Tabellen, sowie das Aufbauen eines Index. Dies muss allerdings meist durch einen Befehl erzwungen werden um ein versehentliches ändern von Daten ausserhalb einer Transaktion zu vermeiden. Solche Änderungen können, falls eine Datenbankrecovery erfoderlich ist, zu schweren Problemen und natürlich Datenverlust führen.
Eine Transaktion beendet man mit dem Befehl Commit
.
Mit dem Befehl Rollback
wird die Transaktion ebenfalls beendet, es werden jedoch alle Änderungen seit Beginn der Transaktion wieder rückgängig gemacht.
Eine nicht Übereinstimmung von Daten nennt man Dateninkonsistenz. Das passiert immer dann, wenn bspw. eine Tabelle auf einen Wert einer anderen Tabelle weist, dieser Wert jedoch nicht mehr vorhanden oder geändert worden ist.
Eine Dateninkonsistenz kann auch dann vorkommen, wenn sich Transaktionen gegenseitig beeinflussen könnten und so Bedingungen innerhalb einer Transaktion nachträglich falsch werden könnten.
Von referentieller Integrität spricht man dann, wenn jeder Fremdschlüssel einer Tabelle einen entsprechenden Primärschlüssel einer anderen Tabelle zugeordnet, oder der Wert des Fremdschlüssels NULL ist. Um eine Dateninkonsistenz zu vermeiden, verknüpft man die Tabellen untereinander. Über die Verbindung mit Fremdschlüssen kann man nun angeben, was passieren soll, wenn ein verknüpfter Datensatz gelöscht oder geändert wird. Beim Löschen kann man zum Beispiel eine Kaskadierung des Löschens auf alle über Fremdschlüssel verknüpften Datensätze erreichen oder das Verbieten des Löschvorgangs. Beim Update kann man die Änderung in den referenzierenden Tabellen ebenfalls durchführen.
Ein Grundsatz einer guten Datenbank ist, dass innerhalb einer Datenbank keine Redundanz (außer Schlüsselredundanz) auftreten sollte. Man spricht dann von einer redundanzfreien Datenbank. Dies geschieht durch die Normalisierung (Datenbank).
Statisches und Dynamisches SQL
Die meisten Datenbanken, welche SQL unterstützen, unterscheiden sich zwischen statischem und dynamischem SQL.
Bei statischem SQL sind die SQL-Anweisungen fest in einem Anwendungsprogramm kodiert (so genanntes Embedded SQL). Während der Programmvorbereitung übersetzt ein Precompiler die SQL-Befehle in Funktionsaufrufe, anschließend definiert ein Optimizer den besten Zugriffspfad auf die Daten und speichert diesen im Datenbanksystem ab.
Dynamisches SQL wird dagegen während der Laufzeit eines Programms interpretiert und der Zugriffspfad wird bei jedem Durchlauf neu optimiert.
Beide Arten von SQL haben ihre Vor- und Nachteile. Statisches SQL mit voroptimierten Zugriffen erspart den aufwändigen Aufruf des Optimizers und wird deshalb häufig für zeitkritische Transaktionsverarbeitungen gebraucht. Das flexiblere dynamische SQL kommt dort zum Tragen, wo zur Codierzeit die auszuführenden SQL-Anweisungen noch nicht bekannt sind.
SQL-Datenbanksysteme
- Adabas - eine kommerzielle Datenbank von der Software AG.
- DB2 - eine kommerzielle Datenbank von IBM.
- dBase IV
- Firebird
- GUPTA
- Hypersonic - eine vollständig in Java implementierte Datenbank.
- Informix
- INGRES
- InterBase
- JetSQL
- Microsoft Access
- Microsoft SQL Server
- MySQL - eine sehr verbreitete Open-Source-Datenbank.
- PostgreSQL - ebenfalls eine sehr verbreitete Open Source-Datenbank
- Oracle - eine kommerzielle Datenbank vom gleichnamigen Unternehmen.
- MaxDB früher unter dem Namen SAP DB bekannte, jetzt von MySQL weiterentwickelte Datenbank.
- SQLite
- SYBASE
- Teradata
- YARD-SQL
- Ocelot
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]
Literatur
- 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
- SQL-Tutorium
- SQL-Tutorial aus der W3C Schule (Englisch)
- SQL-Beispiele für typische betriebswirtschaftliche Problemstellungen
- MySQL Webseite
- PostgreSQL Webseite
- SQLite Website
- SQL Kurzreferenz
- SQL Einführung und Referenz
Siehe auch: SQL-Injection