SQL: Unterschied zwischen den Versionen
Sn (Diskussion | Beiträge) K (→Datenbank aufbauen: Modularisierung) |
Sn (Diskussion | Beiträge) K (Vorlage SQL) |
||
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 | 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 18: | Zeile 18: | ||
=== Projektion === | === Projektion === | ||
SQL-Abfragen beginnen mit dem Schlüsselwort [[Projektion (Relationenalgebra)| | 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 | 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 [[Selektion (Relationenalgebra)| | 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 | ||
|- | |- | ||
| | |{{SQL|=}}<br/>{{SQL|<>}} | ||
|Gleichheit<br/>Ungleichheit | |Gleichheit<br/>Ungleichheit | ||
| | | | ||
|- | |- | ||
|< | |{{SQL|<}}<br/>{{SQL|>}}<br/>{{SQL|<=}}<br/>{{SQL|>=}} | ||
|Kleiner<br/>Größer<br/>Kleiner oder gleich<br/>Größer oder gleich | |Kleiner<br/>Größer<br/>Kleiner oder gleich<br/>Größer oder gleich | ||
|Zahlen werden numerisch sortiert, Daten chronologisch (d.h. {{SQL|'1990-10-06' < '2021-11-27'}}) und Strings lexikalisch (d.h. {{SQL|'Meier' > 'Mayer'}}) | |||
|Zahlen werden numerisch sortiert, Daten chronologisch (d.h. | |||
|- | |- | ||
| | |{{SQL|LIKE}} | ||
|Ähnlichkeit | |Ähnlichkeit | ||
|Vergleicht [[String (Datentyp)|Strings]] mit Mustern, die Platzhalter enthalten können. | |Vergleicht [[String (Datentyp)|Strings]] mit Mustern, die Platzhalter enthalten können. | ||
Der Platzhalter | Der Platzhalter {{SQL|_}} steht für ein beliebiges Zeichen, | ||
{{SQL|%}} steht für beliebig viele beliebige Zeichen, | |||
{{SQL|[xyz]}} steht für eins der Zeichen {{SQL|x}}, {{SQL|y}} oder {{SQL|z}}, | |||
{{SQL|[^xyz]}} steht für ein beliebiges Zeichen, ''außer'' {{SQL|x}}, {{SQL|y}} und {{SQL|z}} | |||
|- | |- | ||
| | | {{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 | ||
|- | |- | ||
| | |{{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. | ||
|- | |- | ||
| | |{{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 107: | 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> | ||
{{Achtung|Anders als in den meisten Programmiersprachen wird in SQL nicht | {{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 | 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 | 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 120: | Zeile 119: | ||
=== Join === | === Join === | ||
Relationen können auch mit dem Schlüsselwort [[Join| | 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 131: | 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 | 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 140: | 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 | 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 155: | 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 | 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 | </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 | 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 171: | Zeile 170: | ||
=== Ergebnisse einschränken === | === Ergebnisse einschränken === | ||
Mit dem Schlüsselwort | 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 182: | Zeile 181: | ||
=== Daten einfügen === | === Daten einfügen === | ||
Mit dem Schlüsselwort | 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 191: | Zeile 190: | ||
=== Daten ändern === | === Daten ändern === | ||
Mit dem Schlüsselwort | 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 201: | Zeile 200: | ||
=== Daten löschen === | === Daten löschen === | ||
Mit dem Schlüsselwort | 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 212: | Zeile 211: | ||
=== Tabellen erzeugen === | === Tabellen erzeugen === | ||
Eine neue Tabelle erzeugt man mit dem Schlüsselwort | 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 231: | Zeile 230: | ||
!Erläuterung | !Erläuterung | ||
|- | |- | ||
| | |{{SQL|NOT NULL}} | ||
|In dieser Spalte darf kein [[Null]]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. | ||
|- | |- | ||
| | |{{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 | ||
|- | |- | ||
| | |{{SQL|PRIMARY KEY}} | ||
|Diese Spalte wird als Primärschlüssel genutzt, um die Tupel eindeutg zu identifizieren. Ein | |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}}. | ||
|- | |- | ||
| | |{{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 | |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. | ||
|- | |- | ||
| | |{{SQL|CHECK (bedingungen)}} | ||
|Die Daten in dieser Spalte müssen bestimmten Bedingungen entsprechen. Die Syntax für die Bedingungen ist dabei dieselbe wie im [[SQL#Selektion| | |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 | ||
|- | |- | ||
| | |{{SQL|DEFAULT (Standardwert)}} | ||
|Wenn beim | |Wenn beim {{SQL|INSERT}} für dieses Attribut kein Wert angegeben wird, wird der angegebene Standardwert gesetzt. | ||
|- | |- | ||
| | |{{SQL|AUTO_INCREMENT}} | ||
|Für die automatische Generierung von IDs: in dieser Spalte werden, falls beim | |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 | '''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 270: | Zeile 269: | ||
=== Tabellen verändern === | === Tabellen verändern === | ||
Mit dem Schlüsselwort | 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 276: | Zeile 275: | ||
!Erläuterung | !Erläuterung | ||
|- | |- | ||
| | |{{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. | ||
|- | |- | ||
| | |{{SQL|DROP COLUMN spaltenname}} | ||
|Löscht die angegebene Spalte. | |Löscht die angegebene Spalte. | ||
|- | |- | ||
| | |{{SQL|RENAME COLUMN alterSpaltenname TO neuerSpaltenname}} | ||
|Benennt die angegebene Spalte um. | |Benennt die angegebene Spalte um. | ||
|- | |- | ||
| | |{{SQL|ALTER COLUMN spaltenname neuerDatentyp bedingungen}}<br />{{SQL|MODIFY COLUMN spaltenname neuerDatentyp bedingungen}} | ||
|Ändert den Datentyp einer Spalte. | |Ändert den Datentyp einer Spalte. | ||
|- | |- | ||
| | |{{SQL|ADD FOREIGN KEY (spalte) REFERENCES andereRelation(spalte)}} | ||
| Fügt eine neue Fremdschlüsselbedingung hinzu. | | Fügt eine neue Fremdschlüsselbedingung hinzu. | ||
|- | |- | ||
| | |{{SQL|ADD PRIMARY KEY (spalte)}} | ||
|Legt die angegebene Spalte als Primärschlüssel fest. | |Legt die angegebene Spalte als Primärschlüssel fest. | ||
|- | |- | ||
| | |{{SQL|DROP PRIMARY KEY}} | ||
|Löscht die Primärschlüsselbedingung. | |Löscht die Primärschlüsselbedingung. | ||
|} | |} | ||
Zeile 300: | Zeile 299: | ||
===Tabellen löschen=== | ===Tabellen löschen=== | ||
Mit dem Schlüsselwort | 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>]] | [[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>]] | ||
Zeile 306: | Zeile 305: | ||
* {{W3Schools|sql|SQL-Tutorial}} | * {{W3Schools|sql|SQL-Tutorial}} | ||
*[https://sql-tutorial.de SQL-Tutorial der Lichtenbergschule Darmstadt | * [https://sql-island.informatik.uni-kl.de/ Lernspiel ''SQL Island'' {{Flagge|DEGBFRPT}}] | ||
*[https://mariadb.com/kb/en/library/sql-statements/ SQL-Statements in der MariaDB Knowledge Base | *[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}} | {{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:
- dem SQL-Server, auf dem die Daten in Relationen gespeichert sind, und
- 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:
- Abfragen an den Datenbestand.
- 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.
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.
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 |
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
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:
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:
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 |
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.
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.
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!
Weblinks
- "SQL-Tutorial" auf w3schools.com 🇬🇧
- Lernspiel SQL Island 🇩🇪🇬🇧🇫🇷🇵🇹
- SQL-Tutorial der Lichtenbergschule Darmstadt 🇩🇪
- SQL-Statements in der MariaDB Knowledge Base 🇬🇧
- ↑ Bildquelle: XKCD.com. Dieses Bild steht unter der Lizenz CC-NC-BY 2.5.