Zum Inhalt springen

SQL: Unterschied zwischen den Versionen

Aus Foxwiki
K Textersetzung - „==== Links ====“ durch „=== Links ===“
 
(91 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
'''topic''' kurze Beschreibung
'''SQL''' - Structured Query Language
==Beschreibung==
'''SQL''' (offizielle Aussprache [<nowiki/>{{IPA|ɛskjuːˈɛl}}], mitunter auch [<nowiki/>{{IPA|ˈsiːkwəl}}]; auf Deutsch auch häufig die deutsche Aussprache der Buchstaben) ist eine [[Datenbanksprache]] zur Definition von [[Datenstruktur]]en in [[Relationale Datenbank|relationalen Datenbanken]] sowie zum Bearbeiten (Einfügen, Verändern, Löschen) und Abfragen von darauf basierenden Datenbeständen.


Die Sprache basiert auf der [[Relationale Algebra|relationalen Algebra]], ihre [[Syntax]] ist relativ einfach aufgebaut und [[Formale Semantik|semantisch]] an die englische Umgangssprache angelehnt. Ein gemeinsames Gremium von [[Internationale Organisation für Normung|ISO]] und [[International Electrotechnical Commission|IEC]] [[Standardisierung|standardisiert]] die Sprache unter Mitwirkung nationaler Normungsgremien wie [[American National Standards Institute|ANSI]] oder [[Deutsches Institut für Normung|DIN]]. Durch den Einsatz von SQL strebt man die Unabhängigkeit der Anwendungen vom eingesetzten [[Datenbank#Datenbankmanagementsystem|Datenbankmanagementsystem]] an.
== Beschreibung ==
; Structured Query Language
Strukturierte Abfrage-Sprache


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 ([{{IPA|ˈsiːkwəl}}], 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.<ref>[http://www.mcjones.org/System_R/SQL_Reunion_95/sqlr95-System.html ''Diskussion über System R und zur Namensänderung von SEQUEL zu SQL'']</ref>
; Aussprache
==Sprachelemente==
{| class="wikitable options"
[[Datei:SQL.png|mini|Bestandteile von SQL]]
| Aussprache || ɛskjuːˈɛl
 
SQL-Befehle lassen sich in fünf Kategorien unterteilen (Zuordnung nach der Theorie der [[Datenbanksprache]]n 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 [[Datensatz|Datensätzen]]) und lesendem Zugriff
*[[Data Definition Language]] (DDL) – Befehle zur [[Datendefinition|Definition]] des [[Datenbankschema]]s (Erzeugen, Ändern, Löschen von [[Datenbanktabelle]]n, Definition von [[Primärschlüssel]]n und [[Fremdschlüssel]]n)
*[[Data Control Language]] (DCL) – Befehle für die [[Mehrbenutzersystem#Rechtemanagement|Rechteverwaltung]]
*[[Transaction Control Language]] (TCL) – Befehle für die [[Transaktion (Informatik)|Transaktionskontrolle]]
 
Die Bezeichnung SQL bezieht sich auf das englische Wort {{"|Text=query|Übersetzung=[[Abfragesprache|Abfrage]]|lang=en}}. 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. {{Siehe auch|Datenbanktabelle}}
 
==Installation==
==Anwendungen==
===Fehlerbehebung===
==Syntax==
===Optionen===
===Parameter===
===Umgebungsvariablen===
===Exit-Status===
==Konfiguration==
===Dateien===
==Sicherheit==
==Dokumentation==
===RFC===
===Man-Pages===
===Info-Pages===
==Siehe auch==
==Links==
===Projekt-Homepage===
===Weblinks===
===Einzelnachweise===
<references />
==Testfragen==
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 1''
<div class="mw-collapsible-content">'''Antwort1'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 2''
<div class="mw-collapsible-content">'''Antwort2'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 3''
<div class="mw-collapsible-content">'''Antwort3'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 4''
<div class="mw-collapsible-content">'''Antwort4'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 5''
<div class="mw-collapsible-content">'''Antwort5'''</div>
</div>
 
[[Kategorie:Entwurf]]
=Wikipedia=
 
== Abfragen ==
Die grundlegenden Befehle und Begriffe werden anhand des folgenden Beispiels erklärt:
 
{|
|- style="border-bottom: 1px solid #EEE;"
![[Entity-Relationship-Modell#ER-Diagramme|ER-Diagramm]]:
| colspan="4" |[[Datei:SQL-Beispiel.svg|700px|SQL-Beispiel]]
|-
!Relationen:
|
{| class="wikitable"
|+<code>Student</code>
|'''<u><code>MatrNr</code></u>'''||'''<code>Name</code>'''
|-
|-
|<code>26120</code>||<code>Fichte</code>
| Mitunter auch || siːkwəl
|-
|-
|<code>25403</code>||<code>Jonas</code>
| Deutsch häufig || Aussprache der Buchstaben
|-
|<code>27103</code>||<code>Fauler</code>
|}
|
{| class="wikitable"
|+<code>hoert</code>
|'''<u><code>MatrNr</code></u>'''||'''<code><u>VorlNr</u></code>'''
|-
|<code>25403</code>||<code>5001</code>
|-
|<code>26120</code>||<code>5001</code>
|-
|<code>26120</code>||<code>5045</code>
|}
|
{| class="wikitable"
|+<code>Vorlesung</code>
|'''<u><code>VorlNr</code></u>'''||'''<code>Titel</code>'''||'''<code>PersNr</code>'''
|-
|<code>5001</code>||<code>ET</code>||<code>15</code>
|-
|<code>5022</code>||<code>IT</code>||<code>12</code>
|-
|<code>5045</code>||<code>DB</code>||<code>12</code>
|}
|
{| class="wikitable"
|+<code>Professor</code>
|'''<u><code>PersNr</code></u>'''||'''<code>Name</code>'''
|-
|<code>12</code>||<code>Wirth</code>
|-
|<code>15</code>||<code>Tesla</code>
|-
|<code>20</code>||<code>Urlauber</code>
|}
|}
|}


===Einfache Abfrage===
; Datenbanksprache
<syntaxhighlight lang="sql">
* [[Datenbanksprache]]
SELECT *
  FROM Student;
</syntaxhighlight>
listet alle Spalten und alle Zeilen der Tabelle <code>Student</code> auf.


Ergebnis:
; Definition
{| class="wikitable"
* [[Datenstruktur]]en von [[Relationale Datenbank|relationalen Datenbanken]]
|-
!<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>)===
; Bearbeiten
<syntaxhighlight lang="sql">
* Einfügen
SELECT VorlNr,
* Verändern
      Titel
* Löschen
  FROM Vorlesung;
</syntaxhighlight>
listet die Spalten <code>VorlNr</code> und <code>Titel</code> aller Zeilen der Tabelle <code>Vorlesung</code> auf.


Ergebnis:
; Abfragen
{| class="wikitable"
* Datenbestände
|-
!<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>)===
; Relationale Algebra
<syntaxhighlight lang="sql">
Basiert auf [[Relationale Algebra|relationalen Algebra]]
SELECT DISTINCT MatrNr
* [[Syntax]] ist relativ einfach aufgebaut
  FROM hoert;
* [[Formale Semantik|semantisch]] an die englische Umgangssprache angelehnt
</syntaxhighlight>
* Ein gemeinsames Gremium von [[Internationale Organisation für Normung|ISO]] und [[International Electrotechnical Commission|IEC]] [[Standardisierung|standardisiert]] die Sprache unter Mitwirkung nationaler Normungsgremien wie [[American National Standards Institute|ANSI]] oder [[Deutsches Institut für Normung|DIN]]
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.
* Durch den Einsatz von SQL strebt man die Unabhängigkeit der Anwendungen vom eingesetzten [[Datenbank#Datenbankmanagementsystem|Datenbankmanagementsystem]] an


Ergebnis:
== Sprachelemente ==
{| class="wikitable"
; Kategorien von SQL-Befehlen
[[Datei:SQL.png|mini|Bestandteile von SQL]]
{| class="wikitable options"
! Language !! !! Beschreibung
|-
|-
!<code>MatrNr</code>
| [[Data Query Language|Data Query]] || DQL || Abfrage und Aufbereitung der gesuchten Informationen, wird auch als Untermenge der DML klassifiziert
|-
|-
|<code>25403</code>
| [[Data Manipulation Language|Data Manipulation]]|| DML|| [[Datenmanipulation]] (Ändern, Einfügen, Löschen von [[Datensatz|Datensätzen]]) und lesendem Zugriff
|-
|-
|<code>26120</code>
| [[Data Definition Language|Data Definition]] || DDL || [[Datendefinition|Definition]] des [[Datenbankschema]]s (Erzeugen, Ändern, Löschen von [[Datenbanktabelle]]n, Definition von [[Primärschlüssel]]n und [[Fremdschlüssel]]n)
|}
 
===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>
| [[Data Control Language|Data Control]] || DCL || [[Mehrbenutzersystem#Rechtemanagement|Rechteverwaltung]]
|-
|-
|<code>26120</code>||<code>Fichte</code>
| [[Transaction Control Language|Transaction Control]] || TCL || [[Transaktion (Informatik)|Transaktionskontrolle]]
|-
|<code>25403</code>||<code>Jonas</code>
|-
|<code>27103</code>||<code>Fauler</code>
|}
|}


===Abfrage mit Filter (<code>WHERE</code>)===
; SQL
<syntaxhighlight lang="sql">
Bezeichnung SQL bezieht sich auf das englische Wort ''query'' (Abfragesprache|Abfrage)
SELECT VorlNr,
* Mit Abfragen werden die in einer Datenbank gespeicherten Daten abgerufen, also dem Benutzer oder einer Anwendersoftware zur Verfügung gestellt
      Titel
* Das Ergebnis einer Abfrage sieht wiederum aus wie eine Tabelle und kann oft auch wie eine Tabelle angezeigt, bearbeitet und weiterverwendet werden
  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.
== Syntax ==
 
{| class="wikitable options"
Ergebnis:
{| class="wikitable"
|-
|-
!<code>VorlNr</code>!!<code>Titel</code>
| [[SQL/Abfragen|Abfragen]] ||
|-
|-
|<code>5001</code>||<code>ET</code>
| [[SQL/Einfügen|Einfügen]] ||
|}
 
===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>
| [[SQL/Ändern|Ändern]] ||
|-
|-
|<code>Fichte</code>
| [[SQL/Löschen|Löschen]] ||
|-
|-
|<code>Fauler</code>
| [[SQL/Datendefinition|Datendefinition]] ||
|}
|}


===Abfrage mit Filter und Sortierung (<code>ORDER BY</code>)===
<noinclude>
<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>)===
== Anhang ==
<syntaxhighlight lang="sql">
=== Siehe auch ===
SELECT Vorlesung.VorlNr,
{{Special:PrefixIndex/{{BASEPAGENAME}}/}}
      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.
=== Links ===
==== Weblinks ====


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.
[[Kategorie:SQL]]
[[Kategorie:Abkürzung]]


Dies ist äquivalent zu:
</noinclude>
 
<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''&nbsp;– das sind einfach alle (keine <code>Vorlesung</code> heißt wie ein <code>Professor</code>):
{| class="wikitable"
|-
!<code>Titel</code>!!<code>Name</code>
|-
|<code>ET</code>||<code>Tesla</code>
|-
|<code>ET</code>||<code>Wirth</code>
|-
|<code>ET</code>||<code>Urlauber</code>
|-
|<code>IT</code>||<code>Tesla</code>
|-
|<code>IT</code>||<code>Wirth</code>
|-
|<code>IT</code>||<code>Urlauber</code>
|-
|<code>DB</code>||<code>Tesla</code>
|-
|<code>DB</code>||<code>Wirth</code>
|-
|<code>DB</code>||<code>Urlauber</code>
|}
 
===Linker äußerer Verbund (<code>LEFT OUTER JOIN</code>)===
<syntaxhighlight lang="sql">
        SELECT Professor.PersNr,
                Professor.Name,
                Vorlesung.VorlNr,
                Vorlesung.Titel
          FROM Professor
LEFT OUTER JOIN Vorlesung
            ON Professor.PersNr = Vorlesung.PersNr;
</syntaxhighlight>
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>)==
<syntaxhighlight lang="sql">
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);
</syntaxhighlight>
fügt vier Datensätze in die Tabelle <code>Vorlesung</code> ein. Die Werte müssen mit den Datentypen der Felder <code>VorlNr</code>, <code>Titel</code> und <code>PersNr</code> zusammenpassen.
 
<syntaxhighlight lang="sql">
SELECT *
  FROM Vorlesung;
</syntaxhighlight>
 
liefert dann zum Beispiel das Ergebnis (die Reihenfolge kann auch anders sein):
{| class="wikitable"
|-
!<code>VorlNr</code>!!<code>Titel</code>
!<code>PersNr</code>
|-
|<code>1001</code>
|<code>Datenbanken</code>
|<code>15</code>
|-
|<code>1000</code>
|<code>Softwareentwicklung 1</code>
|<code>12</code>
|-
|<code>1200</code>
|<code>Netzwerke 1</code>
|<code>20</code>
|-
|<code>5001</code>||<code>ET</code>
|<code>12</code>
|-
|<code>5022</code>||<code>IT</code>
|<code>12</code>
|-
|<code>1600</code>
|<code>Algorithmen</code>
|<code>12</code>
|-
|<code>5045</code>||<code>DB</code>
|<code>15</code>
|}
 
==Ändern von Datensätzen (<code>UPDATE</code>)==
<syntaxhighlight lang="sql">
UPDATE Vorlesung
  SET VorlNr = VorlNr + 1000,
      PersNr = 20
WHERE PersNr = 15;
</syntaxhighlight>
ändert alle Datensätze, für die <code>PersNr</code> den Wert <code>15</code> hat. Der Wert von <code>VorlNr</code> wird um <code>1000</code> erhöht und der Wert von <code>PersNr</code> auf <code>20</code> gesetzt.
 
Ergebnis eines nachfolgenden <code>SELECT *</code> ist, eventuell mit anderer Reihenfolge:
{| class="wikitable"
|-
!<code>VorlNr</code>!!<code>Titel</code>
!<code>PersNr</code>
|-
|<code>1000</code>
|<code>Softwareentwicklung 1</code>
|<code>12</code>
|-
|<code>1200</code>
|<code>Netzwerke 1</code>
|<code>20</code>
|-
|<code>1600</code>
|<code>Algorithmen</code>
|<code>12</code>
|-
|<code>2001</code>
|<code>Datenbanken</code>
|<code>20</code>
|-
|<code>5001</code>||<code>ET</code>
|<code>12</code>
|-
|<code>5022</code>||<code>IT</code>
|<code>12</code>
|-
|<code>6045</code>||<code>DB</code>
|<code>20</code>
|}
 
==Löschen von Datensätzen (<code>DELETE</code>)==
<syntaxhighlight lang="sql">
DELETE FROM Vorlesung
WHERE PersNr = 12;
</syntaxhighlight>
löscht alle Datensätze, für die <code>PersNr</code> den Wert <code>12</code> hat.
 
Ergebnis eines nachfolgenden <code>SELECT *</code>, eventuell in anderer Reihenfolge:
{| class="wikitable"
|-
!<code>VorlNr</code>!!<code>Titel</code>
!<code>PersNr</code>
|-
|<code>1200</code>
|<code>Netzwerke 1</code>
|<code>20</code>
|-
|<code>2001</code>
|<code>Datenbanken</code>
|<code>20</code>
|-
|<code>6045</code>||<code>DB</code>
|<code>20</code>
|}
 
===Zusammenfassung von <code>INSERT</code>, <code>UPDATE</code> und <code>DELETE</code>===
Verallgemeinert sehen die Änderungsanweisungen wie folgt aus.
 
<code>INSERT</code>-Anweisung:
<syntaxhighlight lang="sql">
INSERT INTO Quelle [(Auswahlliste)]
VALUES (Werteliste) | SELECT <Auswahlkriterien>;
</syntaxhighlight>
 
<code>UPDATE</code>-Anweisung:
<syntaxhighlight lang="sql">
UPDATE Quelle SET Zuweisungsliste
[FROM From-Klausel]
[WHERE Auswahlbedingung];
</syntaxhighlight>
 
<code>DELETE</code>-Anweisung:
<syntaxhighlight lang="sql">
DELETE FROM Quelle
[WHERE Auswahlbedingung];
</syntaxhighlight>
 
=Datendefinition=
siehe [[SQL:Datendefinition]]
 
==Programmieren mit SQL==
siehe [[SQL:Programmierung]]
 
== Chronologie ==
{| class="wikitable sortable"
|-
! Jahr !! Beschreibung
|-
| 1975 ||  ''SEQUEL'' = ''Structured English Query Language'', der Vorläufer von ''SQL'', wird für das Projekt [[System R]] von [[IBM]] entwickelt.
|-
| 1979 ||  ''SQL'' gelangt mit ''Oracle V2'' erstmals durch ''Relational Software Inc.'' auf den Markt.
|-
| 1986 ||  ''SQL1'' wird von [[American National Standards Institute|ANSI]] als Standard verabschiedet.
|-
| 1987 ||  ''SQL1'' wird von der [[Internationale Organisation für Normung|Internationalen Organisation für Normung]] (ISO) als Standard verabschiedet und 1989 nochmals überarbeitet.
|-
| 1992 ||  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 [[Datenbanktrigger|Trigger]] oder rekursive Abfragen) hinzugefügt.
|-
| 2003 ||  ''SQL:2003''. Als neue Features werden aufgenommen [[SQL/XML]], Window functions, Sequences.
|-
| 2006 ||  ''SQL/XML:2006''. Erweiterungen für [[SQL/XML]]<ref name="SQLXML2006">{{Literatur |Titel=SQL/XML:2006 – Evaluierung der Standardkonformität ausgewählter Datenbanksysteme |Autor=Michael Wagner |Datum=2010 |Verlag=Diplomica Verlag |ISBN=3-8366-9609-6 |Seiten=100}}</ref>.
|-
| 2008 ||  ''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“.
|}
 
==Sprachstandard==
Ziel der Standardisierung ist es, [[Anwendungsprogramm]]e so erstellen zu können, dass sie vom verwendeten Datenbanksystem unabhängig sind. Heutige Datenbanksysteme [[Implementierung|implementieren]] mehr oder weniger große Teile des Sprachstandards. Darüber hinaus stellen sie oftmals herstellerspezifische Erweiterungen bereit, die nicht dem Standard-Sprachumfang entsprechen. In der Vor-SQL-Zeit strebte man die Portabilität von Anwendungen über die [[Kompatible Schnittstellen|kompatible Schnittstelle]] an.
 
Der Standard besteht insgesamt aus zehn einzelnen Publikationen:<ref>{{Internetquelle |url=https://www.iso.org/committee/45342/x/catalogue/p/1/u/0/w/0/d/0 |hrsg=International Organization for Standardization |titel=ISO/IEC 9075 und 13249 |sprache=en |zugriff=2018-09-20}}</ref>
*ISO/IEC 9075-1:2016 Part 1: Framework (SQL/Framework)
*ISO/IEC 9075-2:2016 Part 2: Foundation (SQL/Foundation)
*ISO/IEC 9075-3:2016 Part 3: Call-Level Interface (SQL/CLI)
*ISO/IEC 9075-4:2016 Part 4: Persistent stored modules (SQL/PSM)
*ISO/IEC 9075-9:2016 Part 9: Management of External Data (SQL/MED)
*ISO/IEC 9075-10:2016 Part 10: Object language bindings ([[SQLJ|SQL/OLB]])
*ISO/IEC 9075-11:2016 Part 11: Information and definition schemas (SQL/Schemata)
*ISO/IEC 9075-13:2016 Part 13: SQL Routines and types using the Java TM programming language ([[SQLJ|SQL/JRT]])
*ISO/IEC 9075-14:2016 Part 14: XML-Related Specifications ([[SQL/XML]])
*ISO/IEC 9075-15:2019 Part 15: Multi-dimensional arrays (SQL/MDA)
Ein weiterer Teil befindet sich derzeit (2019) in Entwicklung:
*ISO/IEC 9075-16:20xx Part 16: Property Graph Queries (SQL/PGQ)
 
Der Standard wird durch sechs, ebenfalls standardisierte ''SQL multimedia and application packages'' ergänzt:
*ISO/IEC 13249-1:2016 Part 1: Framework
*ISO/IEC 13249-2:2003 Part 2: Full-Text
*ISO/IEC 13249-3:2016 Part 3: Spatial
*ISO/IEC 13249-5:2003 Part 5: Still image
*ISO/IEC 13249-6:2006 Part 6: Data mining
*ISO/IEC 13249-7:2013 Part 7: History
 
Weiterhin existieren eine Reihe Technical Reports, die eine Einführung zu den einzelnen Themen bieten.
 
*ISO/IEC TR 19075-1:2011 Part 1: XQuery Regular Expression Support in SQL [https://standards.iso.org/ittf/PubliclyAvailableStandards/c041528_ISO_IEC_TR_19075-1_2011.zip Download]
*ISO/IEC TR 19075-2:2015 Part 2: SQL Support for Time-Related Information [https://standards.iso.org/ittf/PubliclyAvailableStandards/c060394_ISO_IEC_TR_19075-2_2015.zip Download]
*ISO/IEC TR 19075-3:2015 Part 3: SQL Embedded in Programs using the JavaTM programming language [https://standards.iso.org/ittf/PubliclyAvailableStandards/c065141_ISO_IEC_TR_19075-3_2015.zip Download]
*ISO/IEC TR 19075-4:2015 Part 4: SQL with Routines and types using the JavaTM programming language [https://standards.iso.org/ittf/PubliclyAvailableStandards/c065142_ISO_IEC_TR_19075-4_2015.zip Download]
*ISO/IEC TR 19075-5:2016 Part 5: Row Pattern Recognition in SQL [https://standards.iso.org/ittf/PubliclyAvailableStandards/c065143_ISO_IEC_TR_19075-5_2016.zip Download]
*ISO/IEC TR 19075-6:2017 Part 6: SQL support for JavaScript Object Notation (JSON) [https://standards.iso.org/ittf/PubliclyAvailableStandards/c067367_ISO_IEC_TR_19075-6_2017.zip Download]
*ISO/IEC TR 19075-7:2017 Part 7: Polymorphic table functions in SQL [https://standards.iso.org/ittf/PubliclyAvailableStandards/c069776_ISO_IEC_TR_19075-7_2017.zip Download]
*ISO/IEC TR 19075-8:2019 Part 8: Multi-dimensional arrays (SQL/MDA)  (wurde zurückgezogen<ref>{{Internetquelle |autor=14:00-17:00 |url=https://www.iso.org/cms/render/live/en/sites/isoorg/contents/data/standard/06/97/69777.html |titel=ISO/IEC TR 19075-8:2019 |sprache=en |abruf=2022-08-24}}</ref>)
Ein weiterer Teil befindet sich derzeit (2019) in Entwicklung:
*ISO/IEC TR 19075-9:20xx Part 9: Online Analytic Processing (OLAP) capabilities
 
Der offizielle Standard ist nicht frei verfügbar, jedoch existiert ein Zip-Archiv mit einer Arbeitsversion von 2008.<ref>[http://www.wiscorp.com/sql200n.zip Arbeitsversion des Standards von 2008] ([[ZIP-Dateiformat|ZIP]]; 12,7&nbsp;MB)</ref> Die Technical Reports sind kostenlos von ISO erhältlich.
 
==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, [[index.php?title=Special:BookSources/9783642289859|ISBN 978-3-642-28985-9]].
*Edwin Schicker: ''Datenbanken und SQL – Eine praxisorientierte Einführung.'' Teubner, [[index.php?title=Special:BookSources/351902991X|ISBN 3-519-02991-X]].
*Oliver Bartosch, Markus Throll: ''Einstieg in SQL.'' Galileo Press, [[index.php?title=Special:BookSources/3898424979|ISBN 3-89842-497-9]].
*Daniel Warner, Günter Leitenbauer: ''SQL.'' Franzis, [[index.php?title=Special:BookSources/3772375278|ISBN 3-7723-7527-8]].
*H. Faeskorn-Woyke, B. Bertelsmeier, P. Riemer, E. Bauer: ''Datenbanksysteme, Theorie und Praxis mit SQL2003, Oracle und MySQL.'' Pearson-Studium, [[index.php?title=Special:BookSources/9783827372666|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, [[index.php?title=Special:BookSources/3528552107|ISBN 3-528-55210-7]].
*Can Türker: ''SQL 1999 & SQL 2003.'' Dpunkt Verlag, [[index.php?title=Special:BookSources/3898642194|ISBN 3-89864-219-4]].
*Gregor Kuhlmann, Friedrich Müllmerstadt: ''SQL.'' Rowohlt, [[index.php?title=Special:BookSources/3499612453|ISBN 3-499-61245-3]].
*Michael J. Hernandez, John L. Viescas: ''Go To SQL.'' Addison-Wesley, [[index.php?title=Special:BookSources/382731772X|ISBN 3-8273-1772-X]].
*[[Alfons Kemper|A. Kemper]], A. Eickler: ''Datenbanksysteme – Eine Einführung.'' Oldenbourg, [[index.php?title=Special:BookSources/3486250531|ISBN 3-486-25053-1]].
*Marcus Throll, Oliver Bartosch: ''Einstieg in SQL 2008.'' 2. Auflage. Galileo Computing, [[index.php?title=Special:BookSources/9783836210393|ISBN 978-3-8362-1039-3]] inklusive Übungssoftware SQL-Teacher
*Marco Skulschus: ''SQL und relationale Datenbanken'' Comelio Medien, [[index.php?title=Special:BookSources/9783939701118|ISBN 978-3-939701-11-8]].
*Michael Wagner: ''SQL/XML:2006 – Evaluierung der Standardkonformität ausgewählter Datenbanksysteme'' 1. Auflage. Diplomica Verlag, [[index.php?title=Special:BookSources/3836696096|ISBN 3-8366-9609-6]].
*Christian F. G. Schendera: ''SQL mit SAS. Band 1: PROC SQL für Einsteiger''. Oldenbourg Wissenschaftsverlag, München 2011, [[index.php?title=Special:BookSources/9783486598407|ISBN 978-3-486-59840-7]].
*Christian F. G. Schendera: ''SQL mit SAS. Band 2: Fortgeschrittenes PROC SQL''. Oldenbourg Wissenschaftsverlag, München 2012, [[index.php?title=Special:BookSources/9783486598360|ISBN 978-3-486-59836-0]].
*[[Christopher J. Date|C. J. Date]] with [[Hugh Darwen]]: ''A Guide to the SQL standard: a users guide to the standard database language SQL, 4th ed.'', Addison-Wesley, USA 1997, [[index.php?title=Special:BookSources/9780201964264|ISBN 978-0-201-96426-4]]
*Jim Melton: ''Advanced SQL:1999: Understanding Object-Relational and Other Advanced Features, 1st ed.'', Morgan Kaufmann, USA, 2002, [[index.php?title=Special:BookSources/9781558606777|ISBN 978-1558606777]].
 
==Weblinks==
{{Wikibooks|Einführung in SQL|SQL}}
*[https://www.youtube.com/playlist?list=PLC4UZxBVGKte0o6iUssqQVmXhryrOqPXi Erklärvideos zu SQL], Big Data Analytics Group, Uni Saarland
*{{dmoz|World/Deutsch/Computer/Programmieren/Sprachen/SQL/}}
*[http://www.torsten-horn.de/techdocs/sql.htm SQL-Grundlagen] – Einführung mit Beispielen und Vergleich diverser Datenbanken
*[https://esb-dev.github.io/mat/sql-merkblatt.pdf Merkblatt SQL]
*[http://www.mcjones.org/System_R/SQL_Reunion_95/ The 1995 SQL Reunion: People, Projects, and Politics] – zur frühen Geschichte von SQL (englisch)
*[http://www.wiscorp.com/SQLStandards.html Frei verfügbare SQL-Standard-Dokumente], z.&nbsp;B. SQL:2003 und SQL:2008 (englisch)
*[http://www.1keydata.com/de/sql/ SQL-Tutorial]
*[http://sqltutor.fsv.cvut.cz/cgi-bin/sqltutor GNU SQLTutor]
*[https://sqlcoach.informatik.hs-kl.de/sqlcoach/ SQLcoach] – Freies Üben von SQL
*[https://edb2.gm.th-koeln.de/apps/sqltrainer/ Interaktiver SQL-Trainer (Anmeldung notwendig)]
*[https://blog.homepage-webhilfe.de/Artikel/mysql-tutorial-fuer-anfaenger/ Blogbeitrag zu SQL-Befehlen und deren Einsatz in PHP]
*[http://sql-tuning.com/ SQL Tuning]
*[https://docs.microsoft.com/en-us/sql/t-sql/language-reference?view=sql-server-ver15 Transact-SQL Reference (Database Engine)]
 
==Siehe auch==
 
*[[Data Manipulation Language]]
*[[Data Definition Language]]
*[[Data Control Language]]
*[[Transaction Control Language]]
*[[SQL-Injection]]
*[[SchemaSQL]]
*[[Continuous Query Language]]
*[[Liste der Datenbankmanagementsysteme]]
*[[Bereichsabfrage]]
 
==Einzelnachweise==
<references />
 
{{Normdaten|TYP=s|GND=4134010-3|LCCN=sh/86/6628}}
 
[[index.php?title=Kategorie:SQL| ]]
[[Index.php?title=Kategorie:SQL]]
[[Kategorie:Abkürzung]]

Aktuelle Version vom 22. März 2025, 02:56 Uhr

SQL - Structured Query Language

Beschreibung

Structured Query Language

Strukturierte Abfrage-Sprache

Aussprache
Aussprache ɛskjuːˈɛl
Mitunter auch siːkwəl
Deutsch häufig Aussprache der Buchstaben
Datenbanksprache
Definition
Bearbeiten
  • Einfügen
  • Verändern
  • Löschen
Abfragen
  • Datenbestände
Relationale Algebra

Basiert auf relationalen Algebra

Sprachelemente

Kategorien von SQL-Befehlen
Bestandteile von SQL
Language Beschreibung
Data Query DQL Abfrage und Aufbereitung der gesuchten Informationen, wird auch als Untermenge der DML klassifiziert
Data Manipulation DML Datenmanipulation (Ändern, Einfügen, Löschen von Datensätzen) und lesendem Zugriff
Data Definition DDL Definition des Datenbankschemas (Erzeugen, Ändern, Löschen von Datenbanktabellen, Definition von Primärschlüsseln und Fremdschlüsseln)
Data Control DCL Rechteverwaltung
Transaction Control TCL Transaktionskontrolle
SQL

Bezeichnung SQL bezieht sich auf das englische Wort query (Abfragesprache|Abfrage)

  • 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

Syntax

Abfragen
Einfügen
Ändern
Löschen
Datendefinition


Anhang

Siehe auch

Links

Weblinks