Structured Query Language, kurz SQL oder auch Sequel, ist eine seit vielen Jahren standardisierten Sprache zur Definition, Manipulation, Formulierung von Anfragen und Verwaltung von Datenbanken. Sie liegt heute allen kommerziellen und nicht-kommerziellen Datensystemen zu Grunde und hat im Laufe der Zeit zahlreiche Ergänzungen und Erweiterungen erfahren.
SQL aus Benutzersicht
Aus Sicht eines Benutzers ist SQL eine Sprache zum Umgang mit relationalen Datenbanken, die auf einem hohen Abstraktionsniveau angesiedelt ist und insbesondere von einer Beschäftigung mit Einzelheiten der Datenspeicherung befreit. Die Entwicklung von SQL geht auf IBM zurück und wurde zu Beginn der 70er Jahre begonnen. SQL (zu dieser Zeit ein Akronym für Structured English Query Language) wurde 1986 als SQL1 bzw. SQL86 von der ISO standardisiert, in den Folgejahren mehrfach ergänzt und erweitert (1989 Addendum-1 bzw. SQL89, 1992 SQL2 bzw. SQL92, 1999 SQL3 bzw. SQL:1999, aktueller Stand ist SQL:2019, siehe https://de.wikipedia.org/wiki/SQL#Sprachstandard).
Aus Benutzersicht werden folgende Aktivitäten im Umgang mit einer Datenbank von SQL unterstützt:
-
Datenbankdefinition (mit Kommandos wie create table oder drop table) auf der Ebene des zugrunde liegenden Datenbankschemas,
-
Manipulation und Anfrage (mit Kommandos wie select, insert, delete oder update),
-
Verwaltung und Administration (z. B. Transaktionssteuerung mit Kommandos wie commit oder rollback, Zugriffskontrolle mit Kommandos wie grant oder revoke oder interne Verwaltung mit Kommandos wie create/drop index),
-
Programmiersprachern-Einbettung bzw. –Anbindung (über SQLJ bzw. das SQL Call Level Interface SQL/CLI sowie über zahlreiche Commectoren).
Schnittstellen zu Programmiersprachen erlauben ferner eine direkte Übergabe von SQL-Befehlen an ein Datenbanksystem über einen Funktionsaufruf (z.B. per JDBC).
Eine Verwendung von SQL unterstellt das Vorhandensein eines Datenbankschemas, dem einzelne Tabellen zugeordnet sind. Diese lassen sich mit dem Kommando CREATE TABLE anlegen, durch welches eine (neue) Tabelle einen Namen bekommt sowie Attribute und Integritätsbedingungen. Attribute haben jeweils einen Wertebereich, der festlegt, welchen Typ Daten die entsprechende Tabellenspalte aufnehmen kann. Wertebereiche sind z. B. CHAR(n) bzw. VARCHAR(n) für Zeichenreihen fester oder variable Länge n, INTEGER für ganze Zahlen, DATE für Datumswerte oder BLOB für Werte, die z. B. Grafiken darstellen und als Binary Large Objects bezeichnet werden. Als Integritätsbedingungen lassen sich Wertebereichs-Bedingungen, Primär- sowie Fremdschlüssel, Check-Klauseln sowie allgemeine Assertions festlegen. Durch die so genannten objekt-relationalen Erweiterungen, die SQL im Rahmen von SQL:1999 sowie SQL:2003 erfahren hat, lassen sich neben „flachen“ Wertebereichen auch strukturierte definieren, und es kann zwischen ungetypten und getypten Tabellen unterschieden werden.
Das zentrale Kommando zur Formulierung von Anfragen ist der SELECT-Befehl mit der einfachen Grundform
SELECT Attribute
FROM Relation(en)
WHERE Bedingung
GROUP BY Bedingung
HAVING Bedingung
ORDER BY Bedingung
Hierbei spezifiziert die erste Zeile die Ausgabe, die zweite die Eingabe, aus welcher Daten entnommen werden sollen (also typischerweise Tabelle oder Sichten), alle weiteren Klauseln sind optional. Die WHERE-Klausel spezifiziert Bedingungen, welchen die Ausgabe zu genügen hat. GROUP BY erlaubt eine Gruppierung von Datensätzen anhand bestimmter Werte, die durch HAVING noch eingeschränkt werden können. ORDER BY schließlich erlaubt ein Sortieren der Ausgabe. Alle Klauseln der SELECT-Grundform lassen vielfältige Ausdrücke zu. So kann man z. B. in der SELECT-Klausel Umbenennungen von Attributen oder Umformatierungen (CAST) von Werten vornehmen. Als Eingabe in einer FROM-Klausel kann jedes Konstrukt dienen, das sich zu einer Tabelle auswerten lässt. Bedingungen in einer WHERE-Klausel können sich unterschiedlichster Funktionen und Vergleichsoperatoren bedienen.
In der Group By-Klausel sind heute OLAP-Operatoren wie ROLLUP und CUBE zugelassen, die im Zusammenhang mit Data Warehouse-Anwendungen von Bedeutung sind.
Wesentlich ist, dass sich der Benutzer keine Gedanken über eine effiziente Ausführung seiner Anfragen machen muss, da ein SQL unterstützendes Datenbanksystem grundsätzlich einen Anfrage-Optimierer einsetzt, welcher SQL-Statements vor deren Ausführung so umzuformen versucht, dass sie effizienter ausgeführt werden können.
SQL aus Systemsicht
Aus der Sicht eines Datenbanksystems handelt es sich bei SQL um eine deklarative Hochsprache, in welcher von allen Einzelheiten der Datenspeicherung oder internen Datenorganisation abstrahiert ist. Dementsprechend enthält die Sprache Redundanzen, die es dem Anwender ermöglichen, gleiche Anfragen auf unterschiedliche Weise auszudrücken. Systemseitig wird daher stets eine Optimierung von Benutzeranfragen vorgenommen, bevor diese zur Ausführung gelangen. Ferner ist es notwendig, Anbindungen an Programmiersprachen wie Java oder Python vorzusehen, damit von Anwendungsprogrammen aus über statisches oder dynamisches SQL auf eine Datenbank zugegriffen werden kann. Besonders relevant sind derartige Anbindungen heute im Zusammenhang mit Web-Anwendungen, welche häufig auf (nach außen nicht sichtbaren) Datenbanken basieren.
Das Anfrageparadigma von SQL ist mittlerweile so weit verbreitet und Anwendern vertraut, dass selbst Datenbanksysteme, die sich nicht der relationalen Kategorie zurechnen lassen, häufig mit einer SQL-artigen Schnittstelle ausgestattet werden.
Literatur
Elmasri, R., Navathe, S.B.: Fundamentals of Database Systems, 7th ed.. New York: Pearson Education, 2016.
Lemahieu, W., vanden Broucke, S., Baesens, B.: Principles of Database Management; Cambridge University Press, 2018.