SQL (offizielle Aussprache [], mitunter auch []; auf Deutsch auch häufig die deutsche Aussprache der Buchstaben) ist eine Datenbanksprache zur Definition von Datenstrukturen in relationalen Datenbanken sowie zum Bearbeiten (Einfügen, Verändern, Löschen) und Abfragen von darauf basierenden Datenbeständen.
Die Sprache basiert auf der relationalen Algebra, ihre Syntax ist relativ einfach aufgebaut und semantisch an die englische Umgangssprache angelehnt. Ein gemeinsames Gremium von ISO und IEC standardisiert die Sprache unter Mitwirkung nationaler Normungsgremien wie ANSI oder DIN. Durch den Einsatz von SQL strebt man die Unabhängigkeit der Anwendungen vom eingesetzten Datenbankmanagementsystem an.
Die Bezeichnung SQL wird 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 ([], Structured English Query Language) ab, welche mit Beteiligung von Edgar F. Codd (IBM) in den 1970er Jahren von Donald D. Chamberlin und Raymond F. Boyce entwickelt wurde. SEQUEL wurde später in SQL umbenannt, weil SEQUEL ein eingetragenes Warenzeichen der Hawker Siddeley Aircraft Company war.Diskussion über System R und zur Namensänderung von SEQUEL zu SQL
Sprachelemente und Beispiele mini|Bestandteile von SQL
SQL-Befehle lassen sich in fünf Kategorien unterteilen (Zuordnung nach der Theorie der Datenbanksprachen in 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 zur Datenmanipulation (Ändern, Einfügen, Löschen von Datensätzen) und lesendem Zugriff Data Definition Language (DDL) – Befehle zur Definition des Datenbankschemas (Erzeugen, Ändern, Löschen von Datenbanktabellen, Definition von Primärschlüsseln und Fremdschlüsseln) Data Control Language (DCL) – Befehle für die Rechteverwaltung Transaction Control Language (TCL) – Befehle für die Transaktionskontrolle
Die Bezeichnung SQL bezieht sich auf das englische Wort . 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: 700px|SQL-Beispiel Relationen:+ StudentMatrNr Name 26120 Fichte 25403 Jonas 27103 Fauler+ hoert MatrNr VorlNr 25403 5001 26120 5001 26120 5045+ VorlesungVorlNr Titel PersNr 5001 ET 15 5022 IT 12 5045 DB 12+ ProfessorPersNr Name 12 Wirth 15 Tesla 20 Urlauber
Einfache Abfrage SELECT * FROM Student; listet alle Spalten und alle Zeilen der Tabelle Student auf.
Ergebnis: MatrNr Name 26120 Fichte 25403 Jonas 27103 Fauler
Abfrage mit Spaltenauswahl (,) SELECT VorlNr, Titel FROM Vorlesung; listet die Spalten VorlNr und Titel aller Zeilen der Tabelle Vorlesung auf.
Ergebnis: VorlNr Titel 5001 ET 5022 IT 5045 DB
Abfrage mit eindeutigen Werten (DISTINCT) SELECT DISTINCT MatrNr FROM hoert; listet nur unterschiedliche Einträge der Spalte MatrNr aus der Tabelle hoert 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) SELECT MatrNr AS Matrikelnummer, Name FROM Student; listet die Spalten MatrNr und Name aller Zeilen der Tabelle Student auf. MatrNr wird beim Anzeigeergebnis als Matrikelnummer aufgeführt.
Ergebnis: Matrikelnummer Name 26120 Fichte 25403 Jonas 27103 Fauler
Abfrage mit Filter (WHERE) SELECT VorlNr, Titel FROM Vorlesung WHERE Titel = 'ET'; listet VorlNr und Titel aller derjenigen Zeilen der Tabelle Vorlesung auf, deren Titel ET 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 ...) SELECT Name FROM Student WHERE Name LIKE 'F%'; listet die Namen aller Studenten auf, deren Name mit F beginnt (im Beispiel: Fichte und Fauler).
LIKE kann mit verschiedenen Platzhaltern verwendet werden: _ steht für ein einzelnes beliebiges Zeichen, % steht für eine beliebige Zeichenfolge. Manche Datenbanksysteme bieten weitere solcher Wildcard-Zeichen an, etwa für Zeichenmengen.
Ergebnis: Name Fichte Fauler
Abfrage mit Filter und Sortierung (ORDER BY) SELECT Vorname, Name, StrasseNr, Plz, Ort FROM Student WHERE Plz = '20095' ORDER BY Name; listet Vorname, Name, StrasseNr, Plz und Ort aller Studenten aus dem angegebenen Postleitzahlbereich aufsteigend sortiert nach Name auf.
Abfrage mit verknüpften Tabellen (, und INNER JOIN) SELECT Vorlesung.VorlNr, Vorlesung.Titel, Professor.PersNr, Professor.Name FROM Professor, Vorlesung WHERE Professor.PersNr = Vorlesung.PersNr;
Die Aufzählung hinter FROM legt die Datenquellen fest: An dieser Stelle können mit Hilfe sogenannter JOINs mehrere 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 Tabellen Professor und Vorlesung, die den gleichen Wert im Feld PersNr haben. Professoren ohne Vorlesung und Vorlesungen ohne Professor werden damit nicht angezeigt.
Dies ist äquivalent zu:
SELECT Vorlesung.VorlNr, Vorlesung.Titel, Professor.PersNr, Professor.Name FROM Professor INNER JOIN Vorlesung ON Professor.PersNr = Vorlesung.PersNr;
Vorsicht: Nicht alle Implementierungen verstehen beide Schreibweisen, die Oracle-Schreibweise FROM 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:
SELECT Vorlesung.Titel, Professor.Name FROM Professor, Vorlesung WHERE Professor.Name <> Vorlesung.Titel
Das Ergebnis enthält die Kombinationen aller Vorlesungen und aller Professoren, bei denen der Name des Professors vom Titel der Vorlesung abweicht – das sind einfach alle (keine Vorlesung heißt wie ein Professor): 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) SELECT Professor.PersNr, Professor.Name, Vorlesung.VorlNr, Vorlesung.Titel FROM Professor LEFT OUTER JOIN Vorlesung ON Professor.PersNr = Vorlesung.PersNr; ergibt alle Datensätze der Tabelle Professor, verbunden mit den Datensätzen der Tabelle Vorlesung, die den jeweils gleichen Wert im Feld PersNr haben. Professoren ohne Vorlesung sind im Ergebnis enthalten. Die Spalten aus der Vorlesung-Tabelle haben dann den Wert NULL. Vorlesungen ohne Professor sind nicht enthalten.
Die folgende Abfrage liefert nur diejenigen Datensätze, zu denen kein passender Datensatz im linken äußeren Verbund existiert (alle Professoren, die keine Vorlesungen halten):
SELECT Professor.PersNr, Professor.Name FROM Professor LEFT OUTER JOIN Vorlesung ON Professor.PersNr = Vorlesung.PersNr WHERE Vorlesung.PersNr IS NULL;
Das Gleiche kann mittels einer Unterabfrage erreicht werden:
SELECT Professor.PersNr, Professor.Name FROM Professor WHERE NOT EXISTS (SELECT * FROM Vorlesung WHERE PersNr = Professor.PersNr);
Gruppierung mit Aggregat-Funktionen (GROUP BY) SELECT Professor.PersNr, Professor.Name, COUNT(Vorlesung.PersNr) AS Anzahl FROM Professor LEFT OUTER JOIN Vorlesung ON Professor.PersNr = Vorlesung.PersNr GROUP BY Professor.Name, Professor.PersNr; zählt die Anzahl der Vorlesungen pro Professor mit Hilfe der Aggregat-Funktion COUNT.
Bemerkung: COUNT(Professor.PersNr) oder COUNT(*) wären falsch (NULL-Werte sollen nicht mitgezählt werden).
Zusammenfassung eines SELECT Zusammengefasst kann man die wichtigsten Elemente einer SQL-SELECT-Abfrage etwa so beschreiben:
SELECT [DISTINCT] Auswahlliste [AS Spaltenalias] FROM Quelle [ [AS] Tabellenalias], evtl. mit JOIN-Verknüpfungen [WHERE Where-Klausel] [GROUP BY ein oder mehrere Group-by-Attribute] [HAVING Having-Klausel] [ORDER BY ein oder mehrere Sortierungsattribute mit [ASC|DESC]]; Erläuterung:
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 Aggregatsfunktionen 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 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 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 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 die WHERE-Klausel, nur dass sich die angegebene Bedingung auf das Ergebnis einer Aggregationsfunktion bezieht, zum Beispiel HAVING SUM (Betrag) > 0. Sortierungsattribut: Nach ORDER BY werden Attribute angegeben, nach denen sortiert werden soll. Die Standardvoreinstellung ist ASC, das bedeutet aufsteigende Sortierung, DESC ist absteigende Sortierung.
Mengenoperatoren können auf mehrere SELECT-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 bei DISTINCT entfernt, ohne dass UNION DISTINCT geschrieben werden muss beziehungsweise darf. UNION ALL: vereinigt die Ergebnismengen. Mehrfach vorkommende Ergebnistupel bleiben erhalten. Einige Implementierungen interpretieren aber UNION wie UNION ALL und verstehen das ALL 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 wie EXCEPT, 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 ...) INSERT INTO Vorlesung (VorlNr, Titel, PersNr) VALUES (1000, 'Softwareentwicklung 1', 12); INSERT INTO Vorlesung (VorlNr, Titel, PersNr) VALUES (1600, 'Algorithmen', 12); INSERT INTO Vorlesung (VorlNr, Titel, PersNr) VALUES (1200, 'Netzwerke 1', 20); INSERT INTO Vorlesung (VorlNr, Titel, PersNr) VALUES (1001, 'Datenbanken', 15); fügt vier Datensätze in die Tabelle Vorlesung ein. Die Werte müssen mit den Datentypen der Felder VorlNr, Titel und PersNr zusammenpassen.
SELECT * FROM Vorlesung;
liefert dann zum Beispiel das Ergebnis (die Reihenfolge kann auch anders sein):