SQL-Crashkurs
SQL (Structured Query Language) ist eine Datenbanksprache, die dazu verwendet wird, um mit dem Datenbankmanagementsystem (DBMS) zu kommunizieren. Dadurch können dann Datenbanken und Tabellen verwaltet werden (Data Definition Language, kurz DDL), aber auch Daten aus Tabellen abgefragt (Data Query Language, kurz DQL), geändert, gelöscht und Daten in Tabellen eingetragen (Data Manipulation Language, kurz DML) werden.
In diesem Crashkurs lernen Sie lediglich die Datenabfrage (DQL) und Datenmanipulation (DML) kennen, da es sich hierbei um die wichtigsten Bestandteile handelt (in Bezug auf Webanwendungen). Für die Erstellung von Datenbanken und Tabellen empfehlen wir Ihnen daher die Verwendung eines Frontends (z. B. phpMyAdmin).
Abfragen
Abfragen führen Sie in SQL mit dem SELECT
-Statement aus. Nach dem SELECT
-Schlüsselwort geben Sie einen
Ausdruck an, der angibt, welche Spalten in der Ergebnistabelle angezeigt werden sollen:
SELECT Vorname, Nachname FROM Kontakt;
Möchten Sie alle Spalten ausgeben, so können Sie an Stelle von Spaltennamen das Sternzeichen *
angeben:
SELECT * FROM Kontakt;
Ebenfalls ist es möglich, die Spaltennamen mit dem AS
-Schlüsselwort für die Ausgangstabelle umzubenennen:
SELECT Nachname AS Name, Telefonnummer FROM Kontakt;
Möchten Sie doppelte Einträge herausfiltern (dabei werden nur die auszugebenden Spalten berücksichtigt), so können Sie
nach dem SELECT
-Schlüsselwort DISTINCT
notieren:
SELECT DISTINCT Nachname FROM Kontakt;
Im Regelfall möchten Sie nicht alle Zeilen einer Tabelle ausgeben, sondern nur bestimmte. Hier kann Ihnen die
WHERE
-Klausel helfen, mit welcher Sie Bedingungen angeben können, welche Zeilen ausgegeben werden sollen und welche
nicht. Einzelne Bedingungen können mit AND
(Und-Verknüpfung) und OR
(Oder-Verknüpfung) kombiniert
werden und über runde Klammern gruppiert werden. Als Vergleichsoperatoren kommen =
(ist gleich), <>
(ist ungleich, alternativ auch ggf. !=
), <
(ist kleiner), <=
(ist kleiner oder
gleich), >
(ist größer) und >=
(ist größer oder gleich) zum Einsatz. Hierzu einige Beispiele:
SELECT * FROM Kontakt WHERE Vorname = 'Max';
SELECT * FROM Kontakt WHERE Nachname = 'Meyer' OR Nachname = 'Maier';
SELECT * FROM Kontakt WHERE Geburtsjahr <= 1990;
SELECT * FROM Kontakt WHERE (Geburtsjahr = 1987 OR Geburtsjahr = 1994) AND Ort = 'Musterstadt';
Möchten Sie Zeichenmuster vergleichen, so verwenden Sie den LIKE
-Operator sowie das Prozentzeichen %
(beliebige Anzahl an Zeichen) oder den Unterstrich _
(genau ein Zeichen) als Platzhalter:
SELECT * FROM Kontakt WHERE Nachname LIKE 'M%';
Um auf einen Wertebereich zu prüfen, so können Sie den BETWEEN
-Operator verwenden:
SELECT * FROM Kontakt WHERE Geburtsjahr BETWEEN 1980 AND 2000;
Da die Datentypen in der Datenbanktechnik einen undefinierten Wert (NULL
) zulassen, müssen Sie diesen bei Abfragen
natürlich auch prüfen können. Dafür können Sie in der WHERE
-Klausel IS NULL
(ist undefiniert) oder
IS NOT NULL
(ist nicht undefiniert) notieren. Verwendet werden kann der NULL
-Wert z. B. auch bei einer
fehlenden Information.
SELECT * FROM Kontakt WHERE Ort IS NULL;
Um das Ergebnis zu sortieren, können Sie die Schlüsselwörter ORDER BY
angeben. Danach notieren Sie den
Spaltennamen sowie ggf. das Schlüsselwort ASC
(ascending, zu Deutsch aufsteigend, Standard) oder DESC
(descending, zu Deutsch absteigend).
SELECT * FROM Kontakt ORDER BY Geburtsjahr DESC;
Natürlich können Sie auch mehrere Spalten angeben, nach welchen nacheinander sortiert werden soll:
SELECT * FROM Kontakt ORDER BY Nachname, Vorname;
Abfragen über mehrere Tabellen
Oft ist es notwendig, Daten über mehrere Tabellen abzufragen. Ein kurzes Beispiel dazu: Sie haben eine Tabelle mit Blogbeiträgen
und eine Tabelle mit Autoren. In einem Datensatz von einem Blogbeitrag ist jedoch lediglich die ID des Autors hinterlegt und
nicht der Name. Für die Ausgabe möchten Sie jedoch den Autornamen ermitteln. Ein solches Szenario lässt sich mit Hilfe eines
normalen SELECT
-Ausdrucks erreichen. Sie müssen hierfür lediglich beide Tabellen notieren, vor den Spaltennamen
die Tabellennamen angeben und die Tabellen über eine WHERE
-Klausel verbinden:
SELECT Beitrag.Titel, Beitrag.Text, Beitrag.Datum, Autor.Name FROM Beitrag, Autor WHERE Beitrag.AutorID = Autor.ID;
Bei komplexen Abfragen wird der Ausdruck jedoch sehr schnell lang. Deshalb können Sie den Tabellennamen Abkürzungen zuweisen, die dann innerhalb des Ausdrucks verwendet werden können:
SELECT B.Titel, B.Text, B.Datum, A.Name FROM Beitrag B, Autor A WHERE B.AutorID = A.ID;
Die geläufigere (und empfohlene) Variante zur Verknüpfung von Tabellen ist jedoch die Verwendung von JOIN
.
Hierfür wird der INNER JOIN
(innere natürliche Verknüpfung) verwendet. Das Schlüsselwort INNER
darf
jedoch weggelassen werden. Das SQL-Statement für das erste Beispiel würde also wie folgt aussehen:
SELECT Beitrag.Titel, Beitrag.Text, Beitrag.Datum, Autor.Name FROM Beitrag JOIN Autor ON Beitrag.AutorID = Autor.ID;
Auch hier ist die Verwendung von Abkürzungen möglich:
SELECT B.Titel, B.Text, B.Datum, A.Name FROM Beitrag B JOIN Autor A ON B.AutorID = A.ID;
Neben den inneren Verknüpfungen gibt es auch noch äußere Verknüpfungen. Hierbei gibt es drei unterschiedliche Typen
LEFT OUTER JOIN
, RIGHT OUTER JOIN
und FULL OUTER JOIN
. Das Schlüsselwort OUTER
kann jedoch, wie INNER
beim INNER JOIN
auch, einfach weggelassen werden. Die geläufigste Variante
der äußeren Verknüpfungen ist der LEFT OUTER JOIN
. Die äußeren Verknüpfungen werden immer dann verwendet, wenn
die Daten in der Tabelle, welche mit dem JOIN
verbunden wird nicht unbedingt existieren müssen. Die
SQL-Statements von oben geben, wie Ihnen bereits bekannt ist, alle Beiträge mit dem passenden Autor zurück. Ist für einen
Beitrag ein Autor angegeben, welcher nicht mehr existiert, oder kein Autor angegeben (NULL
-Wert), so würde auch
der Beitrag nicht zurückgegeben werden. Möchten Sie jedoch trotzdem alle Beiträge ermitteln (also auch die, ohne existierenden
Autor), so verwenden Sie eine äußere Verknüpfung. Die Spaltenwerte aus der verknüpften Tabelle (in diesem Fall Autor.Name
)
werden dann für die Ergebnistabelle mit NULL
-Werten gefüllt:
SELECT Beitrag.Titel, Beitrag.Text, Beitrag.Datum, Autor.Name FROM Beitrag LEFT JOIN Autor ON Beitrag.AutorID = Autor.ID;
Abfragen können natürlich auch über mehr als zwei Tabellen durchgeführt werden. Das Schema bleibt jedoch immer das Gleiche.
SELECT Beitrag.Titel, Beitrag.Text, Beitrag.Datum, Autor.Name, Kategorie.Bezeichnung FROM Beitrag JOIN Autor ON Beitrag.AutorID = Autor.ID JOIN Kategorie ON Beitrag.KategorieID = Kategorie.ID;
Aggregatfunktionen
SQL unterstützt einige Aggregatfunktionen, mit welchen es möglich ist, bestimmte Daten zusammenzufassen und diese dann
als einzelnen Wert zurückgeben zu lassen. Aggregatfunktionen können, wie Spaltennamen auch, im SELECT
-Ausdruck
angegeben werden. Auch das Umbenennen der Spalte ist möglich und wird hier meistens auch angewendet, da andernfalls der
Spaltenname dem Funktionsaufruf entspricht. Die wichtigsten SQL-Aggregatfunktionen sind MIN()
(kleinster Wert),
MAX()
(größter Wert), AVG()
(Durchschnitt), SUM()
(Summe) und COUNT()
(Anzahl). Innerhalb der runden Klammern wird ein Ausdruck (im Regelfall ein Spaltenname) angegeben, welcher angibt, von welchem
Wert bestimmte Daten ermittelt werden sollen.
SELECT MIN(Preis) AS Minimum FROM Rechnungsposition WHERE RechnungsID = 123;
SELECT MAX(Preis) AS Maximum FROM Rechnungsposition WHERE RechnungsID = 123;
SELECT AVG(Preis) AS Durchschnitt FROM Rechnungsposition WHERE RechnungsID = 123;
SELECT SUM(Preis) AS Summe FROM Rechnungsposition WHERE RechnungsID = 123;
SELECT COUNT(*) AS Anzahl FROM Rechnungsposition WHERE RechnungsID = 123;
Daten einfügen
Möchten Sie einen Datensatz (also eine Zeile) in eine Tabelle einfügen, so benötigen Sie das Statement INSERT INTO
.
Anschließend notieren Sie den Tabellennamen, gefolgt von dem Schlüsselwort INSERT INTO
und einem runden Klammernpaar,
in welchem Sie die Werte der Zellen durch Komma getrennt angeben.
INSERT INTO Kontakt VALUES (132, 'Max', 'Mustermann', 1984, '01234 / 56789', 'Musterstadt');
Meistens möchten Sie jedoch nicht alle Spalten einer Tabelle mit einem Wert füllen, da entweder nicht alle Informationen
verfügbar sind oder die Tabelle eine Spalte mit der AUTO_INCREMENT
-Eigenschaft hat, bei welcher der Wert automatisch
bestimmt werden soll. In diesem Fall können Sie nach dem Tabellennamen runde Klammern notieren und darin die Spaltennamen angeben.
Grundsätzlich sollte dieser Syntax immer bevorzugt werden, da man hier direkt erkennen kann, welche Spalten mit welchem Wert
gefüllt werden.
INSERT INTO Kontakt (Vorname, Nachname, Geburtsjahr, Wohnort) VALUES ('Max', 'Mustermann', 1984, 'Musterstadt');
Daten ändern
Um Datensätze in einer Tabelle zu aktualisieren, können Sie das UPDATE
-Statement verwenden. Hierfür wird nach dem
UPDATE
-Schlüsselwort der Tabellenname notiert. Es folgt das Schlüsselwort SET
und ein oder mehrere
Zellenzuweisungen. Dabei wird der Spaltenname, gefolgt von einem Gleichheitszeichen und dem „neuen“ Wert angegeben. Zum Schluss
können Sie noch die WHERE
-Klausel angeben, um nur bestimmte Datensätze zu aktualisieren, da andernfalls alle
Datensätze geändert werden würden.
UPDATE Kontakt SET Nachname = 'Mustermann' WHERE Vorname = 'Maria' AND Nachname = 'Musterfrau'
UPDATE Kontakt SET Wohnort = 'Musterstadt', Telefonnummer = '01234 / 56789' WHERE ID = 105
Daten löschen
Um Datensätze aus einer Datenbank zu löschen, können Sie das DELETE
-Statement verwenden. Hier müssen Sie lediglich
das Schlüsselwort FROM
, die Tabelle und ggf. eine WHERE
-Klausel (um nur bestimmte Datensätze zu löschen)
angeben. Wenn Sie die WHERE
-Klausel weglassen, werden alle Daten der Tabelle (jedoch nicht die Tabelle selbst) gelöscht.
DELETE FROM Kontakt WHERE ID = 105
Wichtig: Beachten Sie, dass das Löschen von Daten aus einer Datenbank eher unüblich ist. Im Regelfall verwenden Sie lediglich eine zusätzliche Spalte, mit welcher Sie einen Gelöscht-Status darstellen.