SQL oder auch Structured Query Language ist eine Sprache, die fast alle relationalen Datenbanken unterstützen. Sie wurde in den ‘70er Jahren von Donald D. Chamberlin und Raymond F. Boyce zunächst als SEQUEL entworfen, bevor sie später in SQL umbenannt wurde. Dadurch, dass sie deklarativ aufgebaut ist, kann sie recht einfach erlernt werden.
Im Unterricht haben wir das SQL-Tutorial auf sqlzoo.net durchgearbeitet. Die darin erklärten Befehle, Funktionsweisen und Muster werden im folgenden noch einmal erläutert. Für ein besseres Verständnis empfehle ich dennoch, das Tutorial selbst zu befolgen, um ein wenig dem Umgang mit SQL zu trainieren.
Die Tabellen, an denen die Beispiele dieses Posts durchgeführt werden, haben dieses Relationale Schema:
Buch(BuchId, Titel, Preis, ↑VerlagId, Jahr)
Autor(AutorId, Name, Vorname, Geburtsdatum)
Verlag(VerlagId, Name, Addresse)
schreibt(↑AutorId, ↑BuchId)
‘SELECT FROM’, ‘WHERE’, ‘LIKE’
SELECT BuchId, Titel, Preis FROM Buch
Mit einem SELECT
-Statement kann man Felder einer Tabelle auswählen (eng: ‘Select’).
Man übergibt eine Liste der Attribute, die man auswählen möchte.
Danach folgt hinter dem Keyword FROM
die Tabelle, auf die sich die Auswahl bezieht.
Die oben stehende Anfrage könnte zum Beispiel folgendes Ergebnis zurückliefern:
BuchId | Titel | Preis |
---|---|---|
1 | Herr der Ringe | 20 |
2 | Herr der Diebe | 10 |
3 | Herr der Fliegen | 15 |
4 | Hans im Glück | 7 |
Möchte man alle Attribute einer Tabelle erhalten, so kann man dafür die Kurzschreibweise SELECT *
verwenden.
Um die Auswahl einzugrenzen, verwendet man WHERE
.
SELECT Titel FROM Buch
WHERE Preis > 10
Titel |
---|
Herr der Ringe |
Herr der Fliegen |
Hinter dem Keyword WHERE
wird nun ein Vergleich ergänzt, der die Auswahl einschränkt.
Es können die normalen Logischen Vergleiche verwendet werden; AND
, OR
und NOT
stellen einige der bool’schen Operatoren dar.
Mit IN
lässt sich prüfen, ob ein Wert in einer Liste vorhanden ist.
SELECT BuchId, Titel, Preis, Jahr FROM Buch
WHERE BuchId IN (1, 2) AND Jahr > 2000
Titel | Jahr |
---|---|
Herr der Diebe | 2005 |
Mit BETWEEN
lässt sich überprüfen, ob ein Wert innerhalb eines Intervals liegt.
SELECT Titel, Jahr FROM Buch
WHERE Jahr BETWEEN 2000 AND 2010
Titel | Jahr |
---|---|
Herr der Diebe | 2005 |
Mit LIKE
kann man einen Text-Wert mit einem Muster vergleichen.
Dabei steht ‘%’ für beliebig viele Buchstaben, ‘_’ für genau einen.
SELECT BuchId, Titel FROM Buch
WHERE Titel LIKE 'Herr der _i%'
BuchId | Titel |
---|---|
1 | Herr der Ringe |
2 | Herr der Diebe |
‘ORDER BY’
Mit ORDER BY
kann man eine Tabelle sortieren.
SELECT BuchId, Titel, Preis FROM Buch
ORDER BY Preis
BuchId | Titel | Preis |
---|---|---|
4 | Hans im Glück | 7 |
2 | Herr der Diebe | 10 |
3 | Herr der Fliegen | 15 |
1 | Herr der Ringe | 20 |
Ergänzt man diesen Befehl um ein ASC
(aufsteigend) oder DESC
(absteigend), so kann man die Richtung festlegen.
Da die Standard-Sortierrichtung ASC
ist, fällt dieses Keyword meistens weg.
SELECT BuchId, Titel, Preis FROM Buch
ORDER BY Preis DESC
‘GROUP BY’, ‘SUM’, ‘COUNT’
Oft möchte man gar nicht die einzelnen Zeilen kennen, sondern aus ihnen einen Wert berechnen.
Dafür verwendet man GROUP BY
, danach folgt eine Operation oder ein Attributname.
Mit SUM
, COUNT
, MAX
, MIN
, AVG
usw. kann man dann die gruppierten Spalten aggregieren.
SELECT COUNT(*), AVG(Preis) FROM Buch
GROUP BY Titel Like 'Herr der %'
COUNT(*) | AVG(Preis) |
---|---|
3 | 15 |
1 | 1 |
INNER ‘SELECT’
Manchmal möchte man in einer WHERE
-Clause einen Vergleich mit einem anderen Wert aus der Datenbank anstellen.
Damit dafür nur eine Anfrage notwendig ist, kann man SELECT
auch innerhalb eines anderen Befehl verwenden:
SELECT Titel FROM Buch
WHERE VerlagId = (
SELECT VerlagId FROM Verlag
WHERE Name = 'Dressler'
)
Titel |
---|
Herr der Diebe |
Wenn die Innere Auswahl nicht nur eine Zeile zurückliefert, sondern mehrere, so kann man diese mit IN
vergleichen:
SELECT Titel FROM Buch
WHERE VerlagId IN (
SELECT VerlagId FROM Verlag
WHERE name IN ('Dressler', 'Klett-Cotta')
)
Titel |
---|
Herr der Diebe |
Herr der Ringe |
‘JOIN’
Mit einem Inner Select
kann man grundlegende Beziehungen zwischen Tabellen abfragen.
Für komplexere Anfragen wird der JOIN
-Befehl verwendet.
JOIN [Tabelle] ON [Logischer Vergleich]
Einem Join wird übergeben, welche Tabelle verbunden werden soll, und zusätzlich ein Vergleich, mit dem die Zusammengehörigkeit zweier Zeilen überprüft wird.
Möchte man zum Beispiel zu jeder Zeile der Tabelle ‘Buch’ die zugehörige Zeile in der Tabelle ‘Verlag’ erhalten, vergleicht man das Attribut VerlagId
.
SELECT Titel, Jahr, Name FROM Buch
JOIN Verlag ON Buch.VerlagId = Verlag.VerlagId
Titel | Jahr | Verlag |
---|---|---|
Herr der Ringe | 1954 | Klett-Cotta |
Herr der Fliegen | 1954 | Faber & Faber |
Herr der Diebe | 2000 | Dressler |
Hans im Glück | 1819 | Wünschelruthe |
Auch mehrere JOIN
s sind möglich:
SELECT Titel, Name, Vorname FROM Buch
JOIN schreibt ON Buch.BuchId = schreibt.BuchId
JOIN Autor ON Autor.AutorId = schreibt.AutorId
Titel | Name | Vorname |
---|---|---|
Herr der Ringe | Tolkien | John Ronald Reuel |
Herr der Fliegen | Golding | William |
Herr der Diebe | Funke | Cornelia |
Hans im Glück | Grimm | Wilhelm |
Hans im Glück | Grimm | Jacob |
Fazit
Mit SQL lassen sich große Datenmengen effizient abfragen.
Es ist angenehm, dass man nicht spezifizieren muss, wie diese Daten ermittelt werden - hier wird durch die SQL-Engines sehr viel optimiert.
In den nächsten Wochen werden INSERT
- und UPDATE
-Statements behandelt, außerdem werden wir uns anschauen wie man mit DDL eine Tabelle erzeugt.