SQL: Unterschied zwischen den Versionen

Aus KGS-Wiki
(added section about editing)
K (Vorlage SQL)
 
(12 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
'''SQL (Structured Query Language)''' ist eine Datenbanksprache, mit der [[Datenbank|Datenbanken]] aufgebaut und bearbeitet werden können.
[[SQL|SQL (Structured Query Language)]] ist eine Datenbanksprache, mit der [[Datenbank|Datenbanken]] aufgebaut und bearbeitet werden können.


Eine SQL-Datenbank besteht aus zwei Komponenten:
Eine SQL-Datenbank besteht aus zwei Komponenten:
Zeile 5: Zeile 5:
# dem SQL-[[Server]], auf dem die Daten in [[Relation|Relationen]] gespeichert sind, und
# dem SQL-[[Server]], auf dem die Daten in [[Relation|Relationen]] gespeichert sind, und
# dem SQL-[[Client]], der an den Server Anfragen schickt, um die Daten abzufragen oder zu bearbeiten.
# dem SQL-[[Client]], der an den Server Anfragen schickt, um die Daten abzufragen oder zu bearbeiten.
Die Anfragen, die der Client schickt, sind in der Sprache '''SQL''' geschrieben, die im Folgenden beschrieben wird. Der Klarheit halber werden in diesem Artikel die SQL-Schlüsselwörter groß geschrieben und Platzhalter für Attribut- und Relationennamen o.ä. klein. Tatsächlich ist SQL [[Case Sensitivity|''case insensitive'']], ignoriert also Groß- und Kleinschreibung. Um die Lesbarkeit zu erhöhen, sind in die Beispiele Zeilenumbrüche und Leerzeichen eingefügt, auch diese werden von SQL ignoriert. Die Zeichenfolge <code>--</code> kennzeichnet einen Kommentar; der Rest der Zeile wird von SQL ignoriert.
Die Anfragen, die der Client schickt, sind in der Sprache '''SQL''' geschrieben, die im Folgenden beschrieben wird. Der Klarheit halber werden in diesem Artikel die SQL-Schlüsselwörter groß geschrieben und Platzhalter für Attribut- und Relationennamen o.ä. klein. Tatsächlich ist SQL [[Case Sensitivity|''case insensitive'']], ignoriert also Groß- und Kleinschreibung. Um die Lesbarkeit zu erhöhen, sind in die Beispiele Zeilenumbrüche und Leerzeichen eingefügt, auch diese werden von SQL ignoriert. Die Zeichenfolge {{SQL|--}} kennzeichnet einen Kommentar; der Rest der Zeile wird von SQL ignoriert.


Die Anfragen, die der Client schicken kann, lassen sich in drei Kategorien unterteilen:
Die Anfragen, die der Client schicken kann, lassen sich in drei Kategorien unterteilen:
Zeile 12: Zeile 12:
# Bearbeitungen am Datenbestand, d.h. Operationen zum Einfügen, Ändern und Löschen von Daten.
# Bearbeitungen am Datenbestand, d.h. Operationen zum Einfügen, Ändern und Löschen von Daten.
# Bearbeitungen an der Datenbankstruktur, d.h. Operationen zum Erstellen, Ändern und Löschen der Tabellen.
# Bearbeitungen an der Datenbankstruktur, d.h. Operationen zum Erstellen, Ändern und Löschen der Tabellen.
{{Hinweisbaustein|INHALT=Die konkrete Syntax ist in SQL ''enorm'' abhängig von der Implementierung. Was auf einem MySQL-Server funktioniert, kann auf einer Oracle-Datenbank streiken. Deswegen ist diese Übersicht nicht als vollständig zu betrachten.|ICON=[[File:Achtung.svg|32px]]}}
{{Achtung|Die konkrete Syntax ist in SQL ''enorm'' abhängig von der Implementierung. Was auf einem MySQL-Server funktioniert, kann auf einer Oracle-Datenbank streiken. Deswegen ist diese Übersicht nicht als vollständig zu betrachten.}}


== Abfragen ==
== Abfragen ==
Zeile 18: Zeile 18:
=== Projektion ===
=== Projektion ===


SQL-Abfragen beginnen mit dem Schlüsselwort <code>[[Projektion (Relationenalgebra)|SELECT]]</code>:
SQL-Abfragen beginnen mit dem Schlüsselwort [[Projektion (Relationenalgebra)|{{SQL|SELECT}}]]:


Diese Anfrage liefert alle ausgewählten [[Attribut (Informatik)|Spalten]] aus der angegebenen Relation zurück. Es können mehrere, mit Kommata getrennte Spalten, selegiert werden. Um alle Spalten einer Relation zu erhalten, schreibt man ein <code>*</code>. Mit dem Schlüsselwort <code>DISTINCT</code> kann man doppelte Einträge herausfiltern.<syntaxhighlight lang="sql" line="1">
Diese Anfrage liefert alle ausgewählten [[Attribut (Informatik)|Spalten]] aus der angegebenen Relation zurück. Es können mehrere, mit Kommata getrennte Spalten, selegiert werden. Um alle Spalten einer Relation zu erhalten, schreibt man ein {{SQL|*}}. Mit dem Schlüsselwort {{SQL|DISTINCT}} kann man doppelte Einträge herausfiltern.<syntaxhighlight lang="sql" line="1">
SELECT nachname
SELECT nachname
FROM lehrkraft;
FROM lehrkraft;
Zeile 38: Zeile 38:
</syntaxhighlight>
</syntaxhighlight>
=== Selektion ===
=== Selektion ===
Mit dem Schlüsselwort <code>[[Selektion (Relationenalgebra)|WHERE]]</code> können Bedingungen gestellt werden, nach denen die Ergebnisse gefiltert werden. Mit <code>AND</code> und <code>OR</code> können mehrere Bedingungen verknüpft werden. Negiert werden Bedingungen mit <code>NOT</code>, Bedingungen können auch geklammert werden.
Mit dem Schlüsselwort [[Selektion (Relationenalgebra)|{{SQL|WHERE}}]] können Bedingungen gestellt werden, nach denen die Ergebnisse gefiltert werden. Mit {{SQL|AND}} und {{SQL|OR}} können mehrere Bedingungen verknüpft werden. Negiert werden Bedingungen mit {{SQL|NOT}}, Bedingungen können auch geklammert werden.
{| class="wikitable mw-collapsible"
{| class="wikitable mw-collapsible"
|+Selektionsoperatoren
|+Selektionsoperatoren
Zeile 45: Zeile 45:
!Erläuterungen
!Erläuterungen
|-
|-
|<code>=</code><code><></code>
|{{SQL|=}}<br/>{{SQL|<>}}
|Gleichheit
|Gleichheit<br/>Ungleichheit
Ungleichheit
|
|
|-
|-
|<code><</code><code>></code><code><=</code><code>>=</code><code><></code>
|{{SQL|<}}<br/>{{SQL|>}}<br/>{{SQL|<=}}<br/>{{SQL|>=}}
|Kleiner
|Kleiner<br/>Größer<br/>Kleiner oder gleich<br/>Größer oder gleich
Größer
|Zahlen werden numerisch sortiert, Daten chronologisch (d.h. {{SQL|'1990-10-06' < '2021-11-27'}}) und Strings lexikalisch (d.h. {{SQL|'Meier' > 'Mayer'}})
Kleiner oder gleich
Größer oder gleich
Ungleich
|Zahlen werden numerisch sortiert, Daten chronologisch (d.h. <code>'1990-10-06' < '2021-11-27'</code>) und Strings lexikalisch (d.h. <code>'Meier' > 'Mayer'</code>)
|-
|-
|<code>LIKE</code>
|{{SQL|LIKE}}
|Ähnlichkeit
|Ähnlichkeit
|Vergleicht [[String|Strings]] mit Mustern, die Platzhalter enthalten können.
|Vergleicht [[String (Datentyp)|Strings]] mit Mustern, die Platzhalter enthalten können.
Der Platzhalter <code>_</code> steht für ein beliebiges Zeichen,
Der Platzhalter {{SQL|_}} steht für ein beliebiges Zeichen,
<code>%</code> steht für beliebig viele beliebige Zeichen,
{{SQL|%}} steht für beliebig viele beliebige Zeichen,
<code>[xyz]</code> steht für eins der Zeichen <code>x</code>, <code>y</code> oder <code>z</code>,  
{{SQL|[xyz]}} steht für eins der Zeichen {{SQL|x}}, {{SQL|y}} oder {{SQL|z}},  
<code>[^xyz]</code> steht für ein beliebiges Zeichen, ''außer'' <code>x</code>, <code>y</code> und <code>z</code>.
{{SQL|[^xyz]}} steht für ein beliebiges Zeichen, ''außer'' {{SQL|x}}, {{SQL|y}} und {{SQL|z}}
|-
|-
|<code>IN</code>
| {{SQL|IN}}
|Teil einer Liste?
|Teil einer Liste?
|Prüft, ob der betrachtete Wert in einer gegebenen Liste von Vergleichswerten enthalten ist
|Prüft, ob der betrachtete Wert in einer gegebenen Liste von Vergleichswerten enthalten ist
|-
|-
|<code>BETWEEN</code> ''x'' <code>AND</code> ''y''
|{{SQL|BETWEEN}} ''x'' {{SQL|AND}} ''y''
|Zwischen zwei Grenzen
|Zwischen zwei Grenzen
|Prüft, ob der betrachtete Wert zwischen ''x'' und ''y'' liegt.
|Prüft, ob der betrachtete Wert zwischen ''x'' und ''y'' liegt.
|-
|-
|<code>IS (NOT) NULL</code>
|{{SQL|IS (NOT) NULL}}
|Vorhandensein von Daten
|Vorhandensein von Daten
|Prüft, ob das betrachtete Attribut vorhanden ist oder nicht.
|Prüft, ob das betrachtete Attribut vorhanden ist oder nicht.
Zeile 111: Zeile 106:
-- ergibt Lehrkräfte, die Jan, Hein, Klaas oder Pit heißen
-- ergibt Lehrkräfte, die Jan, Hein, Klaas oder Pit heißen
</syntaxhighlight>
</syntaxhighlight>
{{Hinweisbaustein|INHALT=Anders als in den meisten Programmiersprachen wird in SQL nicht <code>==</code> zum Abfragen der Gleichheit verwendet, sondern <code>=</code>!|ICON=[[File:Achtung.svg|32px]]}}
{{Achtung|1=Anders als in den meisten Programmiersprachen wird in SQL nicht {{SQL|{{=}}{{=}}}} zum Abfragen der Gleichheit verwendet, sondern {{SQL|{{=}}}}!}}


=== Kreuzprodukt ===
=== Kreuzprodukt ===
Es können mehrere Relationen mit Kommata getrennt angegeben werden. In diesem Fall wird ein [[Kreuzprodukt]] gebildet und alle Tupel aus allen Relationen miteinander verknüpft. Darum sollte in diesem Fall unbedingt mit <code>WHERE</code> sichergestellt werden, dass die Tupel sinnvoll verknüpft werden und die Ergebnismenge nicht unhandlich wird.
Es können mehrere Relationen mit Kommata getrennt angegeben werden. In diesem Fall wird ein [[Kreuzprodukt]] gebildet und alle Tupel aus allen Relationen miteinander verknüpft. Darum sollte in diesem Fall unbedingt mit {{SQL|WHERE}} sichergestellt werden, dass die Tupel sinnvoll verknüpft werden und die Ergebnismenge nicht unhandlich wird.


Bei gleichnamigen Spalten muss zusätzlich die Relation angegeben werden, deren Spalte betrachtet werden soll. Die Schreibweise ist <code>relation.spalte</code>. In allen anderen Fällen kann die Relation ebenfalls angegeben werden, muss aber nicht. <syntaxhighlight lang="sql" line="1">
Bei gleichnamigen Spalten muss zusätzlich die Relation angegeben werden, deren Spalte betrachtet werden soll. Die Schreibweise ist {{SQL|relation.spalte}}. In allen anderen Fällen kann die Relation ebenfalls angegeben werden, muss aber nicht. <syntaxhighlight lang="sql" line="1">
SELECT spalten
SELECT spalten
FROM relation1, relation2
FROM relation1, relation2
Zeile 124: Zeile 119:


=== Join ===
=== Join ===
Relationen können auch mit dem Schlüsselwort <code>[[Join|JOIN]]</code> verknüpft werden, wobei eine Bedingung angegeben werden muss, unter der gejoint wird. Dieser Bedingung wird nicht <code>WHERE</code>, sondern <code>ON</code> vorangestellt.<syntaxhighlight lang="sql" line="1">
Relationen können auch mit dem Schlüsselwort [[Join|{{SQL|JOIN}}]] verknüpft werden, wobei eine Bedingung angegeben werden muss, unter der gejoint wird. Dieser Bedingung wird nicht {{SQL|WHERE}}, sondern {{SQL|ON}} vorangestellt.<syntaxhighlight lang="sql" line="1">
SELECT spalten
SELECT spalten
FROM relation1
FROM relation1
Zeile 135: Zeile 130:


=== Umbenennung ===
=== Umbenennung ===
Manchmal ist es hilfreich, Spalten oder ganze Relationen [[Umbenennung|umzubenennen]], etwa wenn man eine Relation mit sich selbst joint. Zur Umbenennung von Spalten nutzt man das Schlüsselwort <code>AS</code>, Relationen kann man einfach ohne Schlüsselwort umbenennen.<syntaxhighlight lang="sql" line="1">
Manchmal ist es hilfreich, Spalten oder ganze Relationen [[Umbenennung|umzubenennen]], etwa wenn man eine Relation mit sich selbst joint. Zur Umbenennung von Spalten nutzt man das Schlüsselwort {{SQL|AS}}, Relationen kann man einfach ohne Schlüsselwort umbenennen.<syntaxhighlight lang="sql" line="1">
SELECT attribut1 AS andererName,
SELECT attribut1 AS andererName,
       attribut2 AS ganzAndererName
       attribut2 AS ganzAndererName
Zeile 144: Zeile 139:


=== Aggregierende Funktionen ===
=== Aggregierende Funktionen ===
Zu einem Datensatz lassen sich einfache Statistiken berechnen, z.B. die Anzahl aller Einträge in einer bestimmten Spalte, deren Summe, Minimum, Maximum oder Durchschnitt. Die Schlüsselwörter dafür sind <code>COUNT</code>, <code>SUM</code>, <code>MIN</code>, <code>MAX</code> und <code>AVG</code>. Diese werden auch als ''aggregierende Funktionen'' bezeichnet.<syntaxhighlight lang="sql" line="1">
Zu einem Datensatz lassen sich einfache Statistiken berechnen, z.B. die Anzahl aller Einträge in einer bestimmten Spalte, deren Summe, Minimum, Maximum oder Durchschnitt. Die Schlüsselwörter dafür sind {{SQL|COUNT}}, {{SQL|SUM}}, {{SQL|MIN}}, {{SQL|MAX}} und {{SQL|AVG}}. Diese werden auch als ''aggregierende Funktionen'' bezeichnet.<syntaxhighlight lang="sql" line="1">
SELECT COUNT(nachname)
SELECT COUNT(nachname)
FROM lehrkraft;
FROM lehrkraft;
Zeile 159: Zeile 154:


=== Ergebnisse gruppieren ===
=== Ergebnisse gruppieren ===
Die Ergebnisse von aggregierenden Funktionen können nach anderen Spalten gruppiert werden. Das Schlüsselwort hierfür heißt <code>GROUP BY</code>.<syntaxhighlight lang="sql" line="1">
Die Ergebnisse von aggregierenden Funktionen können nach anderen Spalten gruppiert werden. Das Schlüsselwort hierfür heißt {{SQL|GROUP BY}}.<syntaxhighlight lang="sql" line="1">
SELECT nachname, COUNT(vorname)
SELECT nachname, COUNT(vorname)
FROM lehrkraft
FROM lehrkraft
GROUP BY nachname;
GROUP BY nachname;
-- liefert die Nachnamen aller Lehrer und dazu, wie oft welcher Nachname vertreten ist, d.h. wie viele Vornamen es dazu gibt.
-- liefert die Nachnamen aller Lehrer und dazu, wie oft welcher Nachname vertreten ist, d.h. wie viele Vornamen es dazu gibt.
</syntaxhighlight>Möchte man an diese aggregierende Funktion Bedingungen stellen, muss man nach dem <code>GROUP BY</code> das Schlüsselwort <code>HAVING</code> verwenden, das genau wie <code>WHERE</code> funktioniert.
</syntaxhighlight>Möchte man an diese aggregierende Funktion Bedingungen stellen, muss man nach dem {{SQL|GROUP BY}} das Schlüsselwort {{SQL|HAVING}} verwenden, das genau wie {{SQL|WHERE}} funktioniert.


=== Ergebnisse sortieren ===
=== Ergebnisse sortieren ===
Mit dem Schlüsselwort <code>ORDER BY</code> können die Ergebnisse einer Anfrage in Abhängigkeit von einem Attribut aufsteigend (<code>ASC</code>) oder absteigend (<code>DESC</code>) sortiert werden.<syntaxhighlight lang="sql" line="1">
Mit dem Schlüsselwort {{SQL|ORDER BY}} können die Ergebnisse einer Anfrage in Abhängigkeit von einem Attribut aufsteigend ({{SQL|ASC}}) oder absteigend ({{SQL|DESC}}) sortiert werden.<syntaxhighlight lang="sql" line="1">
SELECT *
SELECT *
FROM lehrkräfte
FROM lehrkräfte
Zeile 175: Zeile 170:


=== Ergebnisse einschränken ===
=== Ergebnisse einschränken ===
Mit dem Schlüsselwort <code>LIMIT</code> kann die Größe des Ergebnisdatensatzes beschränkt werden, etwa wenn man nur die Top Ten der aktuellen Charts sehen möchte<syntaxhighlight lang="sql" line="1">
Mit dem Schlüsselwort {{SQL|LIMIT}} kann die Größe des Ergebnisdatensatzes beschränkt werden, etwa wenn man nur die Top Ten der aktuellen Charts sehen möchte<syntaxhighlight lang="sql" line="1">
SELECT *
SELECT *
FROM lehrkräfte
FROM lehrkräfte
Zeile 186: Zeile 181:


=== Daten einfügen ===
=== Daten einfügen ===
Mit dem Schlüsselwort <code>INSERT INTO relation (spalten) VALUES (tupel1), (tupel2), ...</code> kann man Daten in eine Tabelle einfügen. Dabei müssen alle Spalten angegeben werden, in die man Daten einfügen möchte (dies kann entfallen, wenn man in alle Spalten in der Reihenfolge, in der sie vorhanden sind, Daten einfügt), und dann die Tupel, die man darin einfügen möchte. Spalten, für die man keine Daten angibt, werden je nach Aufbau der Datenbank mit Nullwerten, Standardwerten oder automatisch generierten Werten befüllt.<syntaxhighlight lang="sql" line="1">
Mit dem Schlüsselwort {{SQL|INSERT INTO relation (spalten) VALUES (tupel1), (tupel2), ...}} kann man Daten in eine Tabelle einfügen. Dabei müssen alle Spalten angegeben werden, in die man Daten einfügen möchte (dies kann entfallen, wenn man in alle Spalten in der Reihenfolge, in der sie vorhanden sind, Daten einfügt), und dann die Tupel, die man darin einfügen möchte. Spalten, für die man keine Daten angibt, werden je nach Aufbau der Datenbank mit Nullwerten, Standardwerten oder automatisch generierten Werten befüllt.<syntaxhighlight lang="sql" line="1">
INSERT INTO lehrkraft
INSERT INTO lehrkraft
       (kuerzel, vorname, nachname)
       (kuerzel, vorname, nachname)
Zeile 195: Zeile 190:


=== Daten ändern ===
=== Daten ändern ===
Mit dem Schlüsselwort <code>UPDATE relation SET spalte1 = wert1, spalte2 = wert2 WHERE bedingung</code> können die Daten in einer Tabelle geändert werden. Geändert werden hierbei ''alle'' Tupel, die die Bedingung erfüllen, weswegen man diese vorsichtig setzen und am besten vorher in einer Abfrage überprüfen sollte.<syntaxhighlight lang="sql" line="1">
Mit dem Schlüsselwort {{SQL|UPDATE relation SET spalte1 = wert1, spalte2 = wert2 WHERE bedingung}} können die Daten in einer Tabelle geändert werden. Geändert werden hierbei ''alle'' Tupel, die die Bedingung erfüllen, weswegen man diese vorsichtig setzen und am besten vorher in einer Abfrage überprüfen sollte.<syntaxhighlight lang="sql" line="1">
UPDATE lehrkraft
UPDATE lehrkraft
SET nachname = 'Fettköther'
SET nachname = 'Fettköther'
Zeile 205: Zeile 200:


=== Daten löschen ===
=== Daten löschen ===
Mit dem Schlüsselwort <code>DELETE FROM relation WHERE bedingung</code> werden ''alle'' Tupel aus der angegebenen Relation gelöscht, die der Bedingung entsprechen. Auch hier sollte man die Bedingung vorher per Abfrage überprüfen.<syntaxhighlight lang="sql" line="1">
Mit dem Schlüsselwort {{SQL|DELETE FROM relation WHERE bedingung}} werden ''alle'' Tupel aus der angegebenen Relation gelöscht, die der Bedingung entsprechen. Auch hier sollte man die Bedingung vorher per Abfrage überprüfen.<syntaxhighlight lang="sql" line="1">
DELETE FROM lehrkraft
DELETE FROM lehrkraft
WHERE nachname = 'Schröder';
WHERE nachname = 'Schröder';
Zeile 216: Zeile 211:


=== Tabellen erzeugen ===
=== Tabellen erzeugen ===
Eine neue Tabelle erzeugt man mit dem Schlüsselwort <code>CREATE TABLE</code>. Die Syntax ist folgende:<syntaxhighlight lang="sql" line="1">
Eine neue Tabelle erzeugt man mit dem Schlüsselwort {{SQL|CREATE TABLE}}. Die Syntax ist folgende:<syntaxhighlight lang="sql" line="1">
CREATE TABLE nameDerTabelle
CREATE TABLE nameDerTabelle
   (attribut1 datentypVonAttribut1 bedingungenFürAttribut1,
   (attribut1 datentypVonAttribut1 bedingungenFürAttribut1,
Zeile 225: Zeile 220:
-- Hinweis: Bedingungen sind immer optional aber oft vernünftig.
-- Hinweis: Bedingungen sind immer optional aber oft vernünftig.
</syntaxhighlight>Für jeden Spaltennamen muss ein Datentyp angegeben werden. Die wichtigsten [[Datentyp|Datentypen]] in SQL sind folgende:
</syntaxhighlight>Für jeden Spaltennamen muss ein Datentyp angegeben werden. Die wichtigsten [[Datentyp|Datentypen]] in SQL sind folgende:
{| class="wikitable mw-collapsible"
 
|+SQL-Datentypen
{{/Datentypen}}
!
!Typ
!Beschreibung
|-
| rowspan="3" |Numerische Datentypen
|<code>INT</code>
|Ganzzahlen zwischen <math>-2^{31}</math>und <math>2^{31}-1</math>
|-
|<code>BIGINT</code>
|Ganzzahlen zwischen <math>-2^{63}</math> und <math>2^{63}-1</math>
|-
|<code>REAL</code>
|Reelle Zahlen zwischen <math>-3,4 \cdot 10^{38}</math> und <math>3,4 \cdot 10^{38}</math>
|-
| rowspan="3" |[[String|Strings]]
|<code>CHAR(länge)</code>
|Strings mit der vorgegebenen Länge (max. 8000 Zeichen)
|-
|<code>VARCHAR(länge)</code>
|Strings mit variabler, aber höchstens mit der vorgegebenen Länge (max. 8000 Zeichen)
|-
|<code>TEXT</code>
|Strings mit beliebiger Länge, höchstens 2 GB Text.
|-
| rowspan="3" |Datum und Zeit
|<code>DATE</code>
|Daten zwischen <code>0001-01-01</code> und <code>9999-12-31</code>
|-
|<code>TIME</code>
|Zeitangaben mit einer Genauigkeit von 100 Nanosekunden
|-
|<code>DATETIME</code>
|Datum und Zeitangaben kombiniert
|}


=== Attribute an Bedingungen knüpfen ===
=== Attribute an Bedingungen knüpfen ===
Zeile 269: Zeile 230:
!Erläuterung
!Erläuterung
|-
|-
|<code>NOT NULL</code>
|{{SQL|NOT NULL}}
|In dieser Spalte darf kein [[Null]]<nowiki/>wert stehen, d.h. beim Einfügen von Daten darf diese nicht ausgelassen werden.
|In dieser Spalte darf kein [[Null]]wert stehen, d.h. beim Einfügen von Daten darf diese nicht ausgelassen werden.
|-
|-
|<code>UNIQUE</code>
|{{SQL|UNIQUE}}
|Diese Spalte muss für alle [[Tupel]] in der Relation eindeutig sein
|Diese Spalte muss für alle [[Tupel]] in der Relation eindeutig sein
|-
|-
|<code>PRIMARY KEY</code>
|{{SQL|PRIMARY KEY}}
|Diese Spalte wird als Primärschlüssel genutzt, um die Tupel eindeutg zu identifizieren. Ein <code>PRIMARY KEY</code> ist automatisch auch <code>UNIQUE</code>.
|Diese Spalte wird als Primärschlüssel genutzt, um die Tupel eindeutg zu identifizieren. Ein {{SQL|PRIMARY KEY}} ist automatisch auch {{SQL|NOT NULL}} und {{SQL|UNIQUE}}.
|-
|-
|<code>FOREIGN KEY REFERENCES relation(attribut)</code>
|{{SQL|FOREIGN KEY REFERENCES relation(attribut)}}
|Diese Spalte ist ein Fremdschlüssel und ''muss'' Werte aus dem angegebenen Attribut der angegebenen Relation enthalten. Dieses andere Attribut ''muss'' der <code>PRIMARY KEY</code> der anderen Relation sein.
|Diese Spalte ist ein Fremdschlüssel und ''muss'' Werte aus dem angegebenen Attribut der angegebenen Relation enthalten. Dieses andere Attribut ''muss'' der {{SQL|PRIMARY KEY}} der anderen Relation sein.
|-
|-
|<code>CHECK (bedingungen)</code>
|{{SQL|CHECK (bedingungen)}}
|Die Daten in dieser Spalte müssen bestimmten Bedingungen entsprechen. Die Syntax für die Bedingungen ist dabei dieselbe wie im <code>[[SQL#Selektion|WHERE]]</code>-Teil von Anfragen
|Die Daten in dieser Spalte müssen bestimmten Bedingungen entsprechen. Die Syntax für die Bedingungen ist dabei dieselbe wie im [[SQL#Selektion|{{SQL|WHERE}}]]-Teil von Anfragen
|-
|-
|<code>DEFAULT standardwert</code>
|{{SQL|DEFAULT (Standardwert)}}
|Wenn beim <code>INSERT</code> für dieses Attribut kein Wert angegeben wird, wird der angegebene Standardwert gesetzt.
|Wenn beim {{SQL|INSERT}} für dieses Attribut kein Wert angegeben wird, wird der angegebene Standardwert gesetzt.
|-
|-
|<code>AUTO_INCREMENT</code>
|{{SQL|AUTO_INCREMENT}}
|Für die automatische Generierung von IDs: in dieser Spalte werden, falls beim <code>INSERT</code> nicht explizit Werte angegeben werden, automatisch Werte generiert, beginnend bei 1.
|Für die automatische Generierung von IDs: in dieser Spalte werden, falls beim {{SQL|INSERT}} nicht explizit Werte angegeben werden, automatisch Werte generiert, beginnend bei 1.
'''Hinweis:''' In SQLite-Datenbanken wie der W3Schools-Test-Datenbank ergibt die Kombination <code>INTEGER PRIMARY KEY</code> automatisch einen <code>AUTO_INCREMENT</code>.
'''Hinweis:''' In SQLite-Datenbanken wie der W3Schools-Test-Datenbank ergibt die Kombination {{SQL|INTEGER PRIMARY KEY}} automatisch einen {{SQL|AUTO_INCREMENT}}.
|}
|}
<syntaxhighlight lang="sql" line="1">
<syntaxhighlight lang="sql" line="1">
Zeile 308: Zeile 269:


=== Tabellen verändern ===
=== Tabellen verändern ===
Mit dem Schlüsselwort <code>ALTER TABLE</code> kann man Tabellen auf vielfältige Weise bearbeiten. Nach dem <code>ALTER TABLE</code> folgt zuerst der Name der Relation und dann eine Liste der Modifikationen.
Mit dem Schlüsselwort {{SQL|ALTER TABLE}} kann man Tabellen auf vielfältige Weise bearbeiten. Nach dem {{SQL|ALTER TABLE}} folgt zuerst der Name der Relation und dann eine Liste der Modifikationen.
{| class="wikitable mw-collapsible"
{| class="wikitable mw-collapsible"
|+Einige SQL-Modifikationen
|+Einige SQL-Modifikationen
Zeile 314: Zeile 275:
!Erläuterung
!Erläuterung
|-
|-
|<code>ADD spaltenname datentyp bedingungen</code>
|{{SQL|ADD spaltenname datentyp bedingungen}}
|Fügt eine neue Spalte mit dem angegebenen Datentyp hinzu.
|Fügt eine neue Spalte mit dem angegebenen Datentyp hinzu.
|-
|-
|<code>DROP COLUMN spaltenname</code>
|{{SQL|DROP COLUMN spaltenname}}
|Löscht die angegebene Spalte.
|Löscht die angegebene Spalte.
|-
|-
|<code>RENAME COLUMN alterSpaltenname TO neuerSpaltenname</code>
|{{SQL|RENAME COLUMN alterSpaltenname TO neuerSpaltenname}}
|Benennt die angegebene Spalte um.
|Benennt die angegebene Spalte um.
|-
|-
|<code>ALTER  COLUMN spaltenname neuerDatentyp bedingungen</code><code>MODIFY COLUMN spaltenname neuerDatentyp bedingungen</code>
|{{SQL|ALTER  COLUMN spaltenname neuerDatentyp bedingungen}}<br />{{SQL|MODIFY COLUMN spaltenname neuerDatentyp bedingungen}}
|Ändert den Datentyp einer Spalte.
|Ändert den Datentyp einer Spalte.
|-
|-
|<code>ADD FOREIGN KEY spalte REFERENCES andereRelation(spalte)</code>
|{{SQL|ADD FOREIGN KEY (spalte) REFERENCES andereRelation(spalte)}}
|Fügt eine neue Fremdschlüsselbedingung hinzu.
| Fügt eine neue Fremdschlüsselbedingung hinzu.
|-
|-
|<code>ADD PRIMARY KEY spalte</code>
|{{SQL|ADD PRIMARY KEY (spalte)}}
|Legt die angegebene Spalte als Primärschlüssel fest.
|Legt die angegebene Spalte als Primärschlüssel fest.
|-
|-
|<code>DROP PRIMARY KEY</code>
|{{SQL|DROP PRIMARY KEY}}
|Löscht die Primärschlüsselbedingung.
|Löscht die Primärschlüsselbedingung.
|}
|}


=== Tabellen löschen ===
 
Mit dem Schlüsselwor <code>DROP TABLE relation</code> kann man eine Tabelle löschen.{{Hinweisbaustein|INHALT=Vorsichtig mit dem Schlüsslelwort <code>DROP</code>! SQL bittet dich im Zweifel nicht um eine Bestätigung, sondern löscht die Tabelle und alle Daten kommentarlos!|ICON=[[File:Achtung.svg|32px]]}}
===Tabellen löschen===
Mit dem Schlüsselwort {{SQL|DROP TABLE relation}} kann man eine Tabelle löschen.{{Achtung|1=Vorsichtig mit dem Schlüsselwort {{SQL|DROP}}! SQL bittet dich im Zweifel nicht um eine Bestätigung, sondern löscht die Tabelle und alle Daten kommentarlos!}}
[[Datei:Exploits of a mom.png|ohne|gerahmt|Her daughter is named <nowiki>''Help I'm trapped in a drivers license factory''</nowiki>.<ref>Bildquelle: [https://xkcd.com/327/ XKCD.com]. Dieses Bild steht unter der Lizenz [https://creativecommons.org/licenses/by-nc/2.5/ CC-NC-BY 2.5].</ref>]]
 
==Weblinks==
 
* {{W3Schools|sql|SQL-Tutorial}}
* [https://sql-island.informatik.uni-kl.de/ Lernspiel ''SQL Island'' {{Flagge|DEGBFRPT}}]
*[https://sql-tutorial.de SQL-Tutorial der Lichtenbergschule Darmstadt {{Flagge|DE}}]
*[https://mariadb.com/kb/en/library/sql-statements/ SQL-Statements in der MariaDB Knowledge Base {{Flagge|GB}}]
{{Navigationsleiste Datenbanken}}
[[Kategorie:Datenbanken]]
[[Kategorie:Datenbanken]]
[[Kategorie:Sprache]]
[[Kategorie:Sprache]]

Aktuelle Version vom 3. August 2024, 21:03 Uhr

SQL (Structured Query Language) ist eine Datenbanksprache, mit der Datenbanken aufgebaut und bearbeitet werden können.

Eine SQL-Datenbank besteht aus zwei Komponenten:

  1. dem SQL-Server, auf dem die Daten in Relationen gespeichert sind, und
  2. dem SQL-Client, der an den Server Anfragen schickt, um die Daten abzufragen oder zu bearbeiten.

Die Anfragen, die der Client schickt, sind in der Sprache SQL geschrieben, die im Folgenden beschrieben wird. Der Klarheit halber werden in diesem Artikel die SQL-Schlüsselwörter groß geschrieben und Platzhalter für Attribut- und Relationennamen o.ä. klein. Tatsächlich ist SQL case insensitive, ignoriert also Groß- und Kleinschreibung. Um die Lesbarkeit zu erhöhen, sind in die Beispiele Zeilenumbrüche und Leerzeichen eingefügt, auch diese werden von SQL ignoriert. Die Zeichenfolge -- kennzeichnet einen Kommentar; der Rest der Zeile wird von SQL ignoriert.

Die Anfragen, die der Client schicken kann, lassen sich in drei Kategorien unterteilen:

  1. Abfragen an den Datenbestand.
  2. Bearbeitungen am Datenbestand, d.h. Operationen zum Einfügen, Ändern und Löschen von Daten.
  3. Bearbeitungen an der Datenbankstruktur, d.h. Operationen zum Erstellen, Ändern und Löschen der Tabellen.
⚠️
Achtung

Die konkrete Syntax ist in SQL enorm abhängig von der Implementierung. Was auf einem MySQL-Server funktioniert, kann auf einer Oracle-Datenbank streiken. Deswegen ist diese Übersicht nicht als vollständig zu betrachten.

Abfragen

Projektion

SQL-Abfragen beginnen mit dem Schlüsselwort SELECT:

Diese Anfrage liefert alle ausgewählten Spalten aus der angegebenen Relation zurück. Es können mehrere, mit Kommata getrennte Spalten, selegiert werden. Um alle Spalten einer Relation zu erhalten, schreibt man ein *. Mit dem Schlüsselwort DISTINCT kann man doppelte Einträge herausfiltern.

SELECT nachname
FROM lehrkraft;
-- ergibt die Nachnamen aller Lehrkräfte

SELECT vorname, nachname, kuerzel
FROM lehrkraft;
-- ergibt Vorname, Nachname und Kürzel alle Lehrkräfte

SELECT *
FROM lehrkraft;
-- ergibt alle Attribute aller Lehrkräfte

SELECT DISTINCT nachname
FROM lehrkraft;
-- ergibt die Nachnamen aller Lehrkräfte, aber so, dass jeder Name nur einmal auftaucht.

Selektion

Mit dem Schlüsselwort WHERE können Bedingungen gestellt werden, nach denen die Ergebnisse gefiltert werden. Mit AND und OR können mehrere Bedingungen verknüpft werden. Negiert werden Bedingungen mit NOT, Bedingungen können auch geklammert werden.

Selektionsoperatoren
Operator Beschreibung Erläuterungen
SQL code
<>
Gleichheit
Ungleichheit
<
>
SQL code
SQL code
Kleiner
Größer
Kleiner oder gleich
Größer oder gleich
Zahlen werden numerisch sortiert, Daten chronologisch (d.h. '1990-10-06' < '2021-11-27') und Strings lexikalisch (d.h. 'Meier' > 'Mayer')
LIKE Ähnlichkeit Vergleicht Strings mit Mustern, die Platzhalter enthalten können.

Der Platzhalter _ steht für ein beliebiges Zeichen, % steht für beliebig viele beliebige Zeichen, [xyz] steht für eins der Zeichen x, y oder z, [^xyz] steht für ein beliebiges Zeichen, außer x, y und z

IN Teil einer Liste? Prüft, ob der betrachtete Wert in einer gegebenen Liste von Vergleichswerten enthalten ist
BETWEEN x AND y Zwischen zwei Grenzen Prüft, ob der betrachtete Wert zwischen x und y liegt.
IS (NOT) NULL Vorhandensein von Daten Prüft, ob das betrachtete Attribut vorhanden ist oder nicht.
SELECT nachname
FROM lehrkraft
WHERE vorname = 'Sven';
-- ergibt alle Lehrkräfte namens Sven

SELECT vorname, nachname
FROM lehrkraft
WHERE titel = 'Dr.'
  AND geburtsdatum < '1980-01-01';
-- ergibt Lehrkräfte mit Doktortitel, die vor 1980 geboren sind

SELECT *
FROM lehrkraft
WHERE NOT nachname LIKE 'M_ller';
-- ergibt Lehrkräfte, die nicht Möller, Müller, Miller o.ä. heißen


SELECT *
FROM lehrkraft
WHERE NOT nachname LIKE 'M%ller';
-- ergibt Lehrkräfte, die nicht Möller, Miller, Moosmüller, Meynerts-Stiller o.ä. heißen

SELECT *
FROM lehrkraft
WHERE geburtsdatum BETWEEN '1970-01-01' AND '1979-31-12';
-- ergibt Lehrkräfte, die in den 70ern geboren sind

SELECT *
FROM lehrkraft
WHERE vorname IN ['Jan', 'Hein', 'Klaas', 'Pit'];
-- ergibt Lehrkräfte, die Jan, Hein, Klaas oder Pit heißen
⚠️
Achtung

Anders als in den meisten Programmiersprachen wird in SQL nicht == zum Abfragen der Gleichheit verwendet, sondern =!

Kreuzprodukt

Es können mehrere Relationen mit Kommata getrennt angegeben werden. In diesem Fall wird ein Kreuzprodukt gebildet und alle Tupel aus allen Relationen miteinander verknüpft. Darum sollte in diesem Fall unbedingt mit WHERE sichergestellt werden, dass die Tupel sinnvoll verknüpft werden und die Ergebnismenge nicht unhandlich wird.

Bei gleichnamigen Spalten muss zusätzlich die Relation angegeben werden, deren Spalte betrachtet werden soll. Die Schreibweise ist relation.spalte. In allen anderen Fällen kann die Relation ebenfalls angegeben werden, muss aber nicht.

SELECT spalten
FROM relation1, relation2
WHERE relation1.spalteX = relation2.spalteY
AND weitereBedingungen;

Join

Relationen können auch mit dem Schlüsselwort JOIN verknüpft werden, wobei eine Bedingung angegeben werden muss, unter der gejoint wird. Dieser Bedingung wird nicht WHERE, sondern ON vorangestellt.

SELECT spalten
FROM relation1
JOIN relation2
ON relation1.spalteX = relation2.spalteY
JOIN relation3
ON relation1.spalteQ = relation3.spalteR
WHERE bedingungen;

Umbenennung

Manchmal ist es hilfreich, Spalten oder ganze Relationen umzubenennen, etwa wenn man eine Relation mit sich selbst joint. Zur Umbenennung von Spalten nutzt man das Schlüsselwort AS, Relationen kann man einfach ohne Schlüsselwort umbenennen.

SELECT attribut1 AS andererName,
       attribut2 AS ganzAndererName
FROM relation r,
     andereRelation ar
WHERE bedingung;

Aggregierende Funktionen

Zu einem Datensatz lassen sich einfache Statistiken berechnen, z.B. die Anzahl aller Einträge in einer bestimmten Spalte, deren Summe, Minimum, Maximum oder Durchschnitt. Die Schlüsselwörter dafür sind COUNT, SUM, MIN, MAX und AVG. Diese werden auch als aggregierende Funktionen bezeichnet.

SELECT COUNT(nachname)
FROM lehrkraft;
-- gibt die Anzahl aller Lehrkräfte zurück

SELECT MIN(geburtsdatum)
FROM lehrkraft;
-- gibt das Geburtsdatum der jüngsten Lehrkraft zurück

SELECT AVG(alter)
FROM lehrkraft;
-- gibt das Durchschnittsalter der Lehrkräfte zurück.

Ergebnisse gruppieren

Die Ergebnisse von aggregierenden Funktionen können nach anderen Spalten gruppiert werden. Das Schlüsselwort hierfür heißt GROUP BY.

SELECT nachname, COUNT(vorname)
FROM lehrkraft
GROUP BY nachname;
-- liefert die Nachnamen aller Lehrer und dazu, wie oft welcher Nachname vertreten ist, d.h. wie viele Vornamen es dazu gibt.

Möchte man an diese aggregierende Funktion Bedingungen stellen, muss man nach dem GROUP BY das Schlüsselwort HAVING verwenden, das genau wie WHERE funktioniert.

Ergebnisse sortieren

Mit dem Schlüsselwort ORDER BY können die Ergebnisse einer Anfrage in Abhängigkeit von einem Attribut aufsteigend (ASC) oder absteigend (DESC) sortiert werden.

SELECT *
FROM lehrkräfte
ORDER BY vorname DESC;
-- liefert alle Daten von allen Lehrkräften, absteigend nach Vornamen sortiert.

Ergebnisse einschränken

Mit dem Schlüsselwort LIMIT kann die Größe des Ergebnisdatensatzes beschränkt werden, etwa wenn man nur die Top Ten der aktuellen Charts sehen möchte

SELECT *
FROM lehrkräfte
ORDER BY nachname ASC
LIMIT 5;
-- liefert die Daten der alphabetisch ersten fünf Lehrkräfte

Datenbestand bearbeiten

Daten einfügen

Mit dem Schlüsselwort INSERT INTO relation (spalten) VALUES (tupel1), (tupel2), ... kann man Daten in eine Tabelle einfügen. Dabei müssen alle Spalten angegeben werden, in die man Daten einfügen möchte (dies kann entfallen, wenn man in alle Spalten in der Reihenfolge, in der sie vorhanden sind, Daten einfügt), und dann die Tupel, die man darin einfügen möchte. Spalten, für die man keine Daten angibt, werden je nach Aufbau der Datenbank mit Nullwerten, Standardwerten oder automatisch generierten Werten befüllt.

INSERT INTO lehrkraft
       (kuerzel, vorname, nachname)
VALUES ('Ml',    'Müller','Markus'),
       ('Me',    'Meier', 'Maria'),
       ('Sz',    'Schulz','Stefanie');

Daten ändern

Mit dem Schlüsselwort SQL code können die Daten in einer Tabelle geändert werden. Geändert werden hierbei alle Tupel, die die Bedingung erfüllen, weswegen man diese vorsichtig setzen und am besten vorher in einer Abfrage überprüfen sollte.

UPDATE lehrkraft
SET nachname = 'Fettköther'
WHERE nachname = 'Schmidt'
AND vorname = 'Simone';
-- Ändert den Nachnamen von Simone Schmidt in Fettköther
-- Herzlichen Glückwunsch zur Hochzeit, Frau Fettköther!

Daten löschen

Mit dem Schlüsselwort DELETE FROM relation WHERE bedingung werden alle Tupel aus der angegebenen Relation gelöscht, die der Bedingung entsprechen. Auch hier sollte man die Bedingung vorher per Abfrage überprüfen.

DELETE FROM lehrkraft
WHERE nachname = 'Schröder';
-- Alle Schröders werden aus der Datenbank gelöscht.
-- Gut für Frau Schröder, der wir alles Gute für die Pensionierung wünschen
-- Doof für Herrn Schröder, der ab morgen alle möglichen und unmöglichen Probleme erleben wird.

Datenbank aufbauen

Tabellen erzeugen

Eine neue Tabelle erzeugt man mit dem Schlüsselwort CREATE TABLE. Die Syntax ist folgende:

CREATE TABLE nameDerTabelle
  (attribut1 datentypVonAttribut1 bedingungenFürAttribut1,
   attribut2 datentypVonAttribut2 bedingungenFürAttribut2,
   ...
   attributX datentypVonAttributX bedingungenFürAttributX)

-- Hinweis: Bedingungen sind immer optional aber oft vernünftig.

Für jeden Spaltennamen muss ein Datentyp angegeben werden. Die wichtigsten Datentypen in SQL sind folgende:

SQL-Datentypen
Typ Beschreibung
Numerische Datentypen INT Ganzzahlen zwischen und
BIGINT Ganzzahlen zwischen und
REAL Reelle Zahlen zwischen und
Strings CHAR(länge) Strings mit der vorgegebenen Länge (max. 8000 Zeichen)
VARCHAR(länge) Strings mit variabler, aber höchstens mit der vorgegebenen Länge (max. 8000 Zeichen)
TEXT Strings mit beliebiger Länge, höchstens 2 GB Text.
Datum und Zeit DATE Daten zwischen 0001-01-01 und 9999-12-31
TIME Zeitangaben mit einer Genauigkeit von 100 Nanosekunden
DATETIME Datum und Zeitangaben kombiniert

Attribute an Bedingungen knüpfen

Attribute können, müssen aber nicht mit Bedingungen verknüpft werden. Zum Beispiel kann man für Studierende verlangen, dass ihre Matrikelnummern eindeutig sind und diese dann gleich als Schlüssel deklarieren. Leer sollte die Matrikelnummer ebenfalls nicht sein, am besten wird diese beim Anlegen eines Eintrages gleich automatisch erzeugt. Die wichtigsten Bedingungen sind folgende:

SQL-Bedingungen
Schlüsselwort Erläuterung
NOT NULL In dieser Spalte darf kein Nullwert stehen, d.h. beim Einfügen von Daten darf diese nicht ausgelassen werden.
UNIQUE Diese Spalte muss für alle Tupel in der Relation eindeutig sein
PRIMARY KEY Diese Spalte wird als Primärschlüssel genutzt, um die Tupel eindeutg zu identifizieren. Ein PRIMARY KEY ist automatisch auch NOT NULL und UNIQUE.
FOREIGN KEY REFERENCES relation(attribut) Diese Spalte ist ein Fremdschlüssel und muss Werte aus dem angegebenen Attribut der angegebenen Relation enthalten. Dieses andere Attribut muss der PRIMARY KEY der anderen Relation sein.
CHECK (bedingungen) Die Daten in dieser Spalte müssen bestimmten Bedingungen entsprechen. Die Syntax für die Bedingungen ist dabei dieselbe wie im WHERE-Teil von Anfragen
DEFAULT (Standardwert) Wenn beim INSERT für dieses Attribut kein Wert angegeben wird, wird der angegebene Standardwert gesetzt.
AUTO_INCREMENT Für die automatische Generierung von IDs: in dieser Spalte werden, falls beim INSERT nicht explizit Werte angegeben werden, automatisch Werte generiert, beginnend bei 1.

Hinweis: In SQLite-Datenbanken wie der W3Schools-Test-Datenbank ergibt die Kombination INTEGER PRIMARY KEY automatisch einen AUTO_INCREMENT.

CREATE TABLE angestellter
   (id int AUTO_INCREMENT PRIMARY KEY,
    vorname text NOT NULL,
    nachname text NOT NULL,
    titel text CHECK (titel = 'Dr.' OR titel = 'Prof.' OR titel = 'Prof. Dr.'),
    geburtsdatum date)
-- erzeugt eine Relation namens angestellter
-- mit folgenden Spalten:
-- - id, Ganzzahl, wird automatisch hochgezählt und als Schlüssel verwendet,
-- - vorname, String, darf nicht leer sein
-- - nachname, String, darf nicht leer sein
-- - titel, String, darf nur "Dr.", "Prof." oder "Prof. Dr." sein
-- - geburtsdatum, Datum

Tabellen verändern

Mit dem Schlüsselwort ALTER TABLE kann man Tabellen auf vielfältige Weise bearbeiten. Nach dem ALTER TABLE folgt zuerst der Name der Relation und dann eine Liste der Modifikationen.

Einige SQL-Modifikationen
Schlüsselwort Erläuterung
ADD spaltenname datentyp bedingungen Fügt eine neue Spalte mit dem angegebenen Datentyp hinzu.
DROP COLUMN spaltenname Löscht die angegebene Spalte.
RENAME COLUMN alterSpaltenname TO neuerSpaltenname Benennt die angegebene Spalte um.
ALTER COLUMN spaltenname neuerDatentyp bedingungen
MODIFY COLUMN spaltenname neuerDatentyp bedingungen
Ändert den Datentyp einer Spalte.
ADD FOREIGN KEY (spalte) REFERENCES andereRelation(spalte) Fügt eine neue Fremdschlüsselbedingung hinzu.
ADD PRIMARY KEY (spalte) Legt die angegebene Spalte als Primärschlüssel fest.
DROP PRIMARY KEY Löscht die Primärschlüsselbedingung.


Tabellen löschen

Mit dem Schlüsselwort DROP TABLE relation kann man eine Tabelle löschen.

⚠️
Achtung

Vorsichtig mit dem Schlüsselwort DROP! SQL bittet dich im Zweifel nicht um eine Bestätigung, sondern löscht die Tabelle und alle Daten kommentarlos!

Her daughter is named ''Help I'm trapped in a drivers license factory''.[1]

Weblinks

  1. Bildquelle: XKCD.com. Dieses Bild steht unter der Lizenz CC-NC-BY 2.5.