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 ([, 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 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, 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, MySQL, Oracle, PostgreSQL, Borland Interbase, Firebird, Sybase, SQLite und die neueren Versionen von Access implementieren Teile des SQL Sprachstandards.
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.
SQL-Befehle lassen sich in vier unterschiedliche Kategorien unterteilen (Zuordnung nach Theorie der Datenbanksprachen in Klammern):
Durchgängiges Beispiel für die folgenden SQL-Befehle: SQL_BEISPIEL_FOS.JPG
SELECT * Auswahlliste FROM Quelle WHERE Where-Klausel [GROUP BY (Group-by-Attribut)+ Having-Klausel] BY (Sortierungsattribut)+ *
Mengenoperatoren können auf mehrere SFW-Blöcke angewandt werden, die gleich viele Attribute und gleichen Datentypen der Attribute haben:
Beispiele:
SELECT * FROM Adressen;
SELECT Name, Vorname, Postleitzahl FROM Adressen;
SELECT Name, Vorname, Postleitzahl AS PLZ FROM Adressen;
SELECT Name, Vorname FROM Adressen WHERE Ort='Hannover';
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;
SELECT a.Strasse
FROM Adressen a LEFT OUTER JOIN Leute l ON l.Strasse=a.Strasse
WHERE l.Strasse IS NULL;
SELECT a.Strasse
FROM Adressen a
WHERE NOT EXISTS (SELECT * FROM Leute WHERE Strasse=a.Strasse)
SELECT Jahr, Quartal, SUM(Betrag) AS Umsatz FROM Rechnung GROUP BY Jahr, Quartal;
SELECT verkaeufer, SUM(Betrag) AS Umsatzsumme
FROM Rechnung
GROUP BY verkaeufer
HAVING COUNT(*) >= 100
INSERT INTO Relation (Attribut)+ ')' VALUES '('(Konstanten)+')' INSERT INTO Relation (Attribut)+ ')' SFW-Block UPDATE Relation SET (Attribut=Ausdruck)+ WHERE Where-Klausel DELETE FROM Relation Where-Klausel
UPDATE Personal SET Gehalt=Gehalt*2 WHERE Abteilung='EDV'
Beispiele:
INSERT INTO Adressen (Name, Vorname, Ort) VALUES ('Schroeder', 'Kurt', 'Köln');
INSERT INTO Adressen VALUES ('Schroeder', 'Knut', 'Köln');
INSERT INTO Adressen (Name, Vorname, Ort) SELECT Nachname, Vorname, Ort FROM Alte_Adressen;
INSERT INTO Kursteilnahme (Id_Person, Id_Kurs) SELECT 55, Id_Kurs FROM Kursteilnahme WHERE Id_Person = 27;
UPDATE Adressen SET Ort='Berlin', Telefon='030...' WHERE Name='Schroeder';
DELETE FROM Adressen;
DELETE FROM Adressen WHERE name='Müller';
TRUNCATE TABLE Adressen;
CREATE TABLE Relation '(' (Attribut-Definition)+ ')' CREATE TABLE Relation '(' (Attribut-Definition 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 CHECK OPTION DROP VIEW Sicht
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.
Beispiele:
create table Laender (
Kuerzel_ISO character(2) primary key,
Land_Name varchar(50) NOT NULL);
alter table Laender add Kuerzel_Auto varchar(3);
drop table Adressen;
create index idx_Adressen on Adressen (Name);
drop index idx_Adressen;
GRANT (Operation)+ ON Relation TO (PUBLIC|Benutzer) GRANT OPTION REVOKE (Operation)+ ON Relation FROM (PUBLIC|Benutzer)
Beispiele:
grant select,update on table Adressen to groupx;
revoke execute on procedure DSN8ED6 from public;
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. Die einzelnen DBMS-Hersteller haben diese Liste jedoch um eine Unzahl weiterer Datentypen erweitert, woraus die nützlichsten wohl TEXT und BLOB sein dürften. Die wichtigsten Standarddatentypen sind:
number (n)
n Stellen
number (n, m) oder decimal (n,m)
n Stellen, davon m nach dem Komma
float (m)
m Stellen nach dem Komma
character (n) oder char (n)
n druckbaren und/oder nicht druckbaren Zeichen
varchar (n), varchar2 (n)
n druckbaren und/oder nicht druckbaren Zeichen. Die Variante varchar2 ist für Oracle spezifisch.
date
boolean
true (wahr) oder false (falsch) annehmen). Dieser Datentyp fehlt in Oracle und MySQL.
raw (n)
n Bytes Länge.
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 (primary key) definiert werden. Dieser ist häufig der natürliche Schlüssel der 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. Über den Primärschlüssel kann jeder Datensatz innerhalb der Tabelle eindeutig identifiziert werden. Ein Primärschlüssel kann auch aus mehreren Attributen (Spalten) der Tabelle bestehen (zusammengesetzter Primärschlüssel).
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.
Fremdschlüssel (auch Foreign Key genannt) bezeichnen im Bereich der relationalen Datenbanken 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.
Loggt man sich in eine Datenbank ein, kann man, die erforderlichen Privilegien vorausgesetzt, Änderungen an den Tabellen oder den Daten vornehmen. Grundsätzlich ist in einer relationalen Datenbank alles innerhalb einer Transaktion zu sehen.
Datenbanken erlauben es zum Teil, bestimmte Befehle außerhalb einer Transaktion auszuführen. Darunter fällt insbesondere das Laden von Tabellen, oder das Entfernen 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 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 Datenverlust führen.
Eine Transaktion beendet man mit dem Befehl Commit.
Mit dem Befehl Rollback wird die Transaktion ebenfalls beendet, es werden jedoch alle (Daten-)Änderungen seit Beginn der Transaktion wieder rückgängig gemacht. Technische Änderungen bleiben in der Regel erhalten (so genannte Kompaktierung, compaction).
Erfüllen Daten bspw. die Integritätsbedingungen oder Fremdschlüsselbestimmungen nicht, so nennt man dies Dateninkonsistenz. So können Referenzen einer Tabelle auf Records einer anderen verweisen. Wurde dieser Eintrag nun gelöscht, so sind die Daten in der ersten Tabelle inkonsistent, weil ein Zeiger auf einen nicht-vorhandenen Record referenziert.
Der häufigste Grund für Dateninkonsistenzen ist die falsche Analyse des Datenmodells während der 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 transaktionsmäßig 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
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:
Ein Update von Primärschlüsseln (PK-Update) ist zwar von Codd vorgesehen, widerspricht jedoch der grundsätzlichen Idee des Schlüssels, da ein Primärschlüssel stets unveränderlich sein sollte.
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, wenn 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.
In Mainframe-Umgebungen wird bei statischem SQL schon bei der Übersetzung der Programme der optimale Zugriffsweg bestimmt (so genanntes Bind der SQL-Befehle). Damit sind kürzestmögliche Laufzeiten der Anwendungsprogramme möglich, allerdings muss der Zugriffsweg aller betroffenen Programme neu bestimmt werden, wenn sich Voraussetzungen ändern (Rebind).
In den meisten anderen Fällen erfolgt die Bestimmung des Zugriffswegs zur Laufzeit der Programme, unabhängig davon, ob mit statischem oder dynamischem SQL gearbeitet wird.
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 Der ISO-Standard ist nicht frei verfügbar, jedoch gibt es ein [http://www.wiscorp.com/sql_2003_standard.zip Zip-Archiv mit einer Draft-Version von 2003.
PL/SQL ist eine prozedurale Programmiersprache von und für Oracle. 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.
SQL | SQL | SQL | SQL | Structured Query Language | SQL | SQL | SQL | SQL | SQL | Structured Query Language | Teanga Struchtúrtha Iarratas | SQL | SQL programozási nyelv | SQL | SQL | SQL | SQL | SQL | SQL | SQL | SQL | Structured Query Language | SQL | SQL | SQL | SQL | SQL | SQL | SQL | SQL | SQL | SQL (мова програмування) | SQL | SQL