listet alle Spalten und alle Zeilen der Tabelle <code>Student</code> auf.
Ergebnis:
{| class="wikitable"
|-
!<code>MatrNr</code>!!<code>Name</code>
|-
|<code>26120</code>||<code>Fichte</code>
|-
|<code>25403</code>||<code>Jonas</code>
|-
|<code>27103</code>||<code>Fauler</code>
|}
===Abfrage mit Spaltenauswahl (<code>,</code>)===
<syntaxhighlight lang="sql">
SELECT VorlNr,
Titel
FROM Vorlesung;
</syntaxhighlight>
listet die Spalten <code>VorlNr</code> und <code>Titel</code> aller Zeilen der Tabelle <code>Vorlesung</code> auf.
Ergebnis:
{| class="wikitable"
|-
!<code>VorlNr</code>!!<code>Titel</code>
|-
|<code>5001</code>||<code>ET</code>
|-
|<code>5022</code>||<code>IT</code>
|-
|<code>5045</code>||<code>DB</code>
|}
===Abfrage mit eindeutigen Werten (<code>DISTINCT</code>)===
<syntaxhighlight lang="sql">
SELECT DISTINCT MatrNr
FROM hoert;
</syntaxhighlight>
listet nur unterschiedliche Einträge der Spalte <code>MatrNr</code> aus der Tabelle <code>hoert</code> auf. Dies zeigt die Matrikelnummern aller Studenten, die mindestens eine Vorlesung hören, wobei mehrfach auftretende Matrikelnummern nur einmal ausgegeben werden.
Ergebnis:
{| class="wikitable"
|-
!<code>MatrNr</code>
|-
|<code>25403</code>
|-
|<code>26120</code>
|}
===Abfrage mit Umbenennung (<code>AS</code>)===
<syntaxhighlight lang="sql">
SELECT MatrNr AS Matrikelnummer,
Name
FROM Student;
</syntaxhighlight>
listet die Spalten <code>MatrNr</code> und Name aller Zeilen der Tabelle <code>Student</code> auf. <code>MatrNr</code> wird beim Anzeigeergebnis als Matrikelnummer aufgeführt.
Ergebnis:
{| class="wikitable"
|-
!<code>Matrikelnummer</code>!!<code>Name</code>
|-
|<code>26120</code>||<code>Fichte</code>
|-
|<code>25403</code>||<code>Jonas</code>
|-
|<code>27103</code>||<code>Fauler</code>
|}
===Abfrage mit Filter (<code>WHERE</code>)===
<syntaxhighlight lang="sql">
SELECT VorlNr,
Titel
FROM Vorlesung
WHERE Titel = 'ET';
</syntaxhighlight>
listet <code>VorlNr</code> und <code>Titel</code> aller derjenigen Zeilen der Tabelle <code>Vorlesung</code> auf, deren Titel <code>ET</code> ist.
Die solchermaßen strukturierte, häufig verwendete Anweisung wird nach den Anfangsbuchstaben auch als „SFW-Block“ bezeichnet.
Ergebnis:
{| class="wikitable"
|-
!<code>VorlNr</code>!!<code>Titel</code>
|-
|<code>5001</code>||<code>ET</code>
|}
===Abfrage mit Filter nach Inhalt (<code>WHERE ... LIKE ...</code>)===
<syntaxhighlight lang="sql">
SELECT Name
FROM Student
WHERE Name LIKE 'F%';
</syntaxhighlight>
listet die Namen aller Studenten auf, deren Name mit <code>F</code> beginnt (im Beispiel: <code>Fichte</code> und <code>Fauler</code>).
<code>LIKE</code> kann mit verschiedenen [[Wildcard (Informatik)|Platzhaltern]] verwendet werden: <code>_</code> steht für ein einzelnes beliebiges Zeichen, <code>%</code> steht für eine beliebige Zeichenfolge. Manche Datenbanksysteme bieten weitere solche ''Wildcard''-Zeichen an, etwa für Zeichenmengen.
Ergebnis:
{| class="wikitable"
|-
!<code>Name</code>
|-
|<code>Fichte</code>
|-
|<code>Fauler</code>
|}
===Abfrage mit Filter und Sortierung (<code>ORDER BY</code>)===
<syntaxhighlight lang="sql">
SELECT Vorname,
Name,
StrasseNr,
Plz,
Ort
FROM Student
WHERE Plz = '20095'
ORDER BY Name;
</syntaxhighlight>
listet <code>Vorname</code>, <code>Name</code>, <code>StrasseNr</code>, <code>Plz</code> und <code>Ort</code> aller Studenten aus dem angegebenen Postleitzahlbereich aufsteigend sortiert nach <code>Name</code> auf.
===Abfrage mit verknüpften Tabellen (<code>,</code> und <code>INNER JOIN</code>)===
<syntaxhighlight lang="sql">
SELECT Vorlesung.VorlNr,
Vorlesung.Titel,
Professor.PersNr,
Professor.Name
FROM Professor,
Vorlesung
WHERE Professor.PersNr = Vorlesung.PersNr;
</syntaxhighlight>
Die Aufzählung hinter [[From (SQL)|<code>FROM</code>]] legt die Datenquellen fest: an dieser Stelle können mithilfe sogenannter [[Join (SQL)|<code>JOIN</code>s]] mehrere Tabellen miteinander verknüpft werden, sodass Daten aus verschiedenen Tabellen zusammengeführt und angezeigt werden.
In diesem Beispiel wird ein „innerer natürlicher Verbund“ (<code>NATURAL INNER JOIN</code>) verwendet: Alle Datensätze aus den Tabellen <code>Professor</code> und <code>Vorlesung</code>, die den gleichen Wert im Feld <code>PersNr</code> haben. <code>Professor</code>en ohne <code>Vorlesung</code> und <code>Vorlesung</code>en ohne <code>Professor</code> werden damit nicht angezeigt.
Dies ist äquivalent zu:
<syntaxhighlight lang="sql">
SELECT Vorlesung.VorlNr,
Vorlesung.Titel,
Professor.PersNr,
Professor.Name
FROM Professor
INNER JOIN Vorlesung
ON Professor.PersNr = Vorlesung.PersNr;
</syntaxhighlight>
''Vorsicht: Nicht alle Implementierungen verstehen beide Schreibweisen, die [[Oracle]]-Schreibweise <code>FROM Professor, Vorlesung</code> 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:
<syntaxhighlight lang="sql">
SELECT Vorlesung.Titel,
Professor.Name
FROM Professor,
Vorlesung
WHERE Professor.Name <> Vorlesung.Titel
</syntaxhighlight>
Das Ergebnis erhält die Kombinationen ''aller'' <code>Professor</code>en und ''aller'' <code>Vorlesung</code>en, wo der Name des <code>Professor</code>s vom Titel der <code>Vorlesung</code> ''abweicht'' – das sind einfach alle (keine <code>Vorlesung</code> heißt wie ein <code>Professor</code>):
ergibt alle Datensätze der Tabelle <code>Professor</code> verbunden mit den Datensätzen der Tabelle <code>Vorlesung</code>, die den jeweils gleichen Wert im Feld <code>PersNr</code> haben. <code>Professor</code>en ohne Vorlesung sind enthalten, die <code>Vorlesung</code>sspalten im Ergebnis haben dann den Wert <code>NULL</code>. <code>Vorlesung</code>en ohne <code>Professor</code> sind nicht enthalten.
Die folgende Abfrage liefert nur diejenigen Datensätze, zu denen kein passender Datensatz im linken äußeren Verbund existiert (alle <code>Professor</code>en, die keine <code>Vorlesung</code>en halten):
<syntaxhighlight lang="sql">
SELECT Professor.PersNr,
Professor.Name
FROM Professor
LEFT OUTER JOIN Vorlesung
ON Professor.PersNr = Vorlesung.PersNr
WHERE Vorlesung.PersNr IS NULL;
</syntaxhighlight>
Das Gleiche kann mittels einer Unterabfrage erreicht werden:
<syntaxhighlight lang="sql">
SELECT Professor.PersNr,
Professor.Name
FROM Professor
WHERE NOT EXISTS (SELECT *
FROM Vorlesung
WHERE PersNr = Professor.PersNr);
</syntaxhighlight>
===Gruppierung mit Aggregat-Funktionen (<code>GROUP BY</code>)===
<syntaxhighlight lang="sql">
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;
</syntaxhighlight>
zählt die Anzahl der <code>Vorlesungen</code> pro <code>Professor</code> mit Hilfe der [[Aggregation (Informatik)|Aggregat]]-Funktion <code>COUNT</code>.
''Bemerkung'': <code>COUNT(Professor.PersNr)</code> oder <code>COUNT(*)</code> wären falsch ([[Nullwert|<code>NULL</code>-Werte]] sollen nicht mitgezählt werden).
===Zusammenfassung eines <code>SELECT</code>===
Zusammengefasst kann man die wichtigsten Elemente einer SQL-<code>SELECT</code>-Abfrage etwa so beschreiben:
<syntaxhighlight lang="sql">
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]];
</syntaxhighlight>
'''Erläuterung:'''
*'''<code>DISTINCT</code>:''' Gibt an, dass aus der Ergebnisrelation gleiche [[Tupel (Informatik)|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 (<code>*</code> für alle) und ob [[Aggregatfunktion|Aggregatsfunktionen]] anzuwenden sind. Wie bei allen anderen Aufzählungen werden die einzelnen Elemente mit Komma (<code>,</code>) voneinander getrennt.
*'''Quelle:''' Gibt an, wo die Daten herkommen. Es können [[Relation (Datenbank)|Relationen]] und [[Sicht (Datenbank)|Sichten]] angegeben werden und miteinander als [[kartesisches Produkt]] oder als Verbund ([[Relationale Algebra#Join|<code>JOIN</code>]], ab SQL-92) verknüpft werden. Mit der zusätzlichen Angabe eines Namens können Relationen für die Abfrage umbenannt werden (vgl. [[#Sprachelemente und Beispiele|Beispiele]]).
*'''<code>WHERE</code>-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.
*'''<code>GROUP BY</code>-Attribut:''' Legt fest, ob unterschiedliche Werte als einzelne Zeilen ausgegeben werden sollen (<code>GROUP BY</code> = Gruppierung) oder aber die Feldwerte der Zeilen durch Aggregationen wie Addition (<code>SUM</code>), Durchschnitt (<code>AVG</code>), Minimum (<code>MIN</code>), Maximum (<code>MAX</code>) zu einem Ergebniswert zusammengefasst werden, der sich auf die Gruppierung bezieht.
*'''<code>Having</code>-Klausel:''' Ist wie die <code>WHERE</code>-Klausel, nur dass sich die angegebene Bedingung auf das Ergebnis einer Aggregationsfunktion bezieht, zum Beispiel <code>HAVING SUM (Betrag) > 0</code>.
*'''Sortierungsattribut:''' nach <code>ORDER BY</code> werden Attribute angegeben, nach denen sortiert werden soll. Die Standardvoreinstellung ist <code>ASC</code>, das bedeutet aufsteigende Sortierung, <code>DESC</code> ist absteigende Sortierung.
'''Mengenoperatoren''' können auf mehrere <code>SELECT</code>-Abfragen angewandt werden, die gleich viele Attribute haben und bei denen die Datentypen der Attribute übereinstimmen:
*'''<code>UNION</code>:''' Vereinigt die Ergebnismengen. In einigen Implementierungen werden mehrfach vorkommende Ergebnistupel wie bei <code>DISTINCT</code> entfernt, ohne dass <code>UNION DISTINCT</code> geschrieben werden muss beziehungsweise darf.
*'''<code>UNION ALL</code>:''' Vereinigt die Ergebnismengen. Mehrfach vorkommende Ergebnistupel bleiben erhalten. Einige Implementierungen interpretieren aber <code>UNION</code> wie <code>UNION ALL</code> und verstehen das <code>ALL</code> möglicherweise nicht und geben eine Fehlermeldung aus.
*'''<code>EXCEPT</code>:''' Liefert die Tupel, die in einer ersten, jedoch nicht in einer zweiten Ergebnismenge enthalten sind. Mehrfach vorkommende Ergebnistupel werden entfernt.
*'''<code>MINUS:</code>''' Ein analoger Operator wie <code>EXCEPT</code>, der von manchen SQL-Dialekten alternativ benutzt wird.
*'''<code>INTERSECT</code>:''' Liefert die Schnittmenge zweier Ergebnismengen. Mehrfach vorkommende Ergebnistupel werden entfernt.
==Einfügen von Datensätzen (<code>INSERT INTO ... VALUES ...</code>)==
==Einfügen von Datensätzen (<code>INSERT INTO ... VALUES ...</code>)==
Version vom 9. November 2022, 10:11 Uhr
topic kurze Beschreibung
Beschreibung
SQL (offizielle Aussprache [Vorlage:IPA], mitunter auch [Vorlage:IPA]; 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 IECstandardisiert 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 ([[[:Vorlage:IPA]]], 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 ist.[1]
Sprachelemente
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
Die Bezeichnung SQL bezieht sich auf das englische Wort Vorlage:". 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. Vorlage:Siehe auch
Installation
Anwendungen
Fehlerbehebung
Syntax
Optionen
Parameter
Umgebungsvariablen
Exit-Status
Konfiguration
Dateien
Sicherheit
Dokumentation
RFC
Man-Pages
Info-Pages
Literatur
Donald D. Chamberlin, Raymond F. Boyce: SEQUEL: A Structured English Query Language. In: SIGMOD Workshop. Vol. 1 1974, S. 249–264.
Donald D. Chamberlin, Morton M. Astrahan, Kapali P. Eswaran, Patricia P. Griffiths, Raymond A. Lorie, James W. Mehl, Phyllis Reisner, Bradford W. Wade: SEQUEL 2: A Unified Approach to Data Definition, Manipulation, and Control. In: IBM Journal of Research and Development. 20(6) 1976, S. 560–575.
Günter Matthiessen, Michael Unterstein: Relationale Datenbanken und SQL in Theorie und Praxis Springer Vieweg, ISBN 978-3-642-28985-9.
Edwin Schicker: Datenbanken und SQL – Eine praxisorientierte Einführung. Teubner, ISBN 3-519-02991-X.
Oliver Bartosch, Markus Throll: Einstieg in SQL. Galileo Press, ISBN 3-89842-497-9.
H. Faeskorn-Woyke, B. Bertelsmeier, P. Riemer, E. Bauer: Datenbanksysteme, Theorie und Praxis mit SQL2003, Oracle und MySQL. Pearson-Studium, ISBN 978-3-8273-7266-6.
Jörg Fritze, Jürgen Marsch: Erfolgreiche Datenbankanwendung mit SQL3. Praxisorientierte Anleitung – effizienter Einsatz – inklusive SQL-Tuning. Vieweg Verlag, ISBN 3-528-55210-7.
Der Standard SQL2 oder SQL-92 wird von der ISO verabschiedet.
1999
SQL3 oder SQL:1999 wird verabschiedet. Im Rahmen dieser Überarbeitung werden weitere wichtige Features (wie etwa Trigger oder rekursive Abfragen) hinzugefügt.
2003
SQL:2003. Als neue Features werden aufgenommen SQL/XML, Window functions, Sequences.
SQL:2008 bzw. ISO/IEC 9075:2008. Als neue Features werden aufgenommen INSTEAD OF-Trigger, TRUNCATE-Statement und FETCH Klausel.
2011
SQL:2011 bzw. ISO/IEC 9075:2011. Als neue Features werden aufgenommen „Zeitbezogene Daten“ (PERIOD FOR). Es gibt Erweiterungen für Window functions und die FETCH Klausel.
2016
SQL:2016 bzw. ISO/IEC 9075:2016. Als neue Features werden aufgenommen JSON und „row pattern matching“.
2019
SQL/MDA:2019. Erweiterungen für einen Datentyp „mehrdimensionales Feld“.