Die Data Query Language (DQL) umfasst alle Befehle in SQL, die zur Abfrage von Daten und Datensätzen in der Datenbank genutzt werden.
Erklärung
Damit Daten nicht nur in die Datenbank eingetragen werden und dort für ewig verweilen, kannst du mit SQL DQL die Daten aus der Datenbank wieder abfragen.
Du formulierst dazu sogenannte Queries (deutsch: Abfragen), welche die folgenden Informationen zwingend enthalten:
- Aus welchen Tabellen willst du Daten abfragen?
- Auf welche Spalten/Attribute dieser Tabellen willst du zugreifen?
Optional kannst du z.B. noch folgende Angaben bei der Query machen
- Welche Eigenschaften sollen die Daten haben (z.B. soll der Attributwert größer als 1000 sein)?
- Sollen die Daten auf eine bestimmte Weise angeordnet werden?
Als Beispieltabelle wird hier eine einfache Tabelle namens Personen verwendet. Sie sieht folgendermaßen aus:
SELECT FROM
Die Grundlage einer SQL Anfrage ist SELECT FROM. Diese zwei magischen Worte erlauben dir, einfache Abfragen für deine Datenbank zu schreiben. Sie sind zwingend erforderlich in jeder Query. Wir starten mit dem einfachsten Fall, wo wir Daten nur aus einer Tabelle abfragen.
- Bei SELECT gibst du an, welche Attribute du abfragen willst.
- Im FROM-Teil hingegen gibst du die Tabellen an, aus denen die Attribute extrahiert werden sollen.
Das Grundgerüst sieht folgendermaßen aus:
Besuche die App, um alle Inhalte zu sehen!
Beachte den Strichpunkt bzw. das Semikolon am Ende jeder Anfrage. Willst du einfach alle Attribute der Tabelle erhalten, schreibst du ein * anstelle der Attribute:
Besuche die App, um alle Inhalte zu sehen!
Möchten wir nun sämtliche Daten aus der Tabelle Personen abfragen, verwenden wir die folgende SQL-Anweisung:
Besuche die App, um alle Inhalte zu sehen!
Die Ergebnistabelle sieht dann genauso aus wie die Tabelle oben.
Falls du nur an den Vornamen und dem Alter der Personen interessiert sind, verwendest du:
Besuche die App, um alle Inhalte zu sehen!
Du erhältst das Ergebnis:
Bedingungen mittels WHERE
Mit dem Befehl WHERE kannst du zusätzliche Bedingungen definieren, welche die Datensätze erfüllen müssen. Der Befehl ...
Besuche die App, um alle Inhalte zu sehen!
... gibt alle Tupel zurück, deren Nachname 'Maier' ist:
Statt Gleichheit (=) kannst du auch
- größer/kleiner ( >,< ),
- größer gleich / kleiner gleich (>=, <=) und
- ungleich (<>)
als Bedingungen formulieren. Möchtest du eine Bedingung verneinen, setzt du das Wörtchen NOT vor diese Bedingung. Im nächsten Abschnitt siehst du ein Beispiel dazu.
Bedinungen verknüpfen: AND und OR
Im WHERE-Teil der Abfrage kannst du mit Hilfe von den Modifikatoren OR und NOT mehrere Bedingungen miteinander verknüpfen. Das sieht dann beispielsweise so aus:
Besuche die App, um alle Inhalte zu sehen!
Tipp: Arbeite mit Klammern, um Überblick über deine Bedingungen zu behalten. Setze die Klammern so, dass alle Ausdrücke, die zu einer Bedingung gehören, zusammen gefasst werden.
Alternativ kannst du auch jede Bedingung in eine neue Zeile schreiben. Dazu siehst du im nächsten Abschnitt ein Beispiel.
Die Abfrage von oben gibt dir alle Tupel aus der Tabelle Personen zurück, die NICHT den Nachnamen Maier haben und gleichzeitig über 18 Jahre alt sind. In der Tabelle Personen trifft das auf genau einen Eintrag zu:
Komplexe Bedingungen: LIKE, IN und BETWEEN
Stell dir vor, du möchtest in der Tabelle eine Personen finden, deren Namen du nicht ganz sicher kennst. Du weißt nur, dass ihr Nachname mit M beginnt und sie zwischen 18 und 23 Jahre alt ist. Außerdem vermutest du, dass der Vorname entweder Leon, Max oder Stephan ist.
Wie kannst du eine Anfrage formulieren, die dir alle Einträge zurück liefert, die auf diese Beschreibungen zutrifft?
- LIKE: Nach diesem Wort kannst du ein Pattern (deutsch: Muster) festlegen, das auf die gesuchten Attributwerte zutreffen muss. Dabei steht das Prozentzeichen % für beliebig viele Zeichen, während der Unterstrich _ für genau ein Zeichen steht.
Der Ausdruck 'M%' bedeutet beispielsweise dass der erste Buchstabe ein M ist, gefolgt von beliebig vielen Zeichen, während beispielsweise 'a%' bedeutet, dass vor dem a genau ein Buchstabe kommt und nach dem a mindestens ein weiteres Zeichen.
- BETWEEN x AND y: Du kannst einen Bereich definieren, zwischen denen die Werte des Attributs liegen soll. Die beiden Grenzen x und y sind eingeschlossen.
- IN: Dieser Operator wird gefolgt von einer Liste in runden Klammern. Das entsprechende Attribut muss einen der Werte in dieser Liste annehmen.
Besuche die App, um alle Inhalte zu sehen!
Hinweis: Du hast immer mehrere Möglichkeiten, eine Anfrage zu stellen. Beispielsweise könntest du statt IN auch schreiben:
Besuche die App, um alle Inhalte zu sehen!
Ergebnis:
Zusatz: ORDER BY
Gerade bei größeren Tabellen sollen Ausgaben manchmal nach Attributwerten geordnet werden. Dies kannst du in SQL mit dem Befehl ORDER BY ganz am Ende deiner Abfrage umsetzen.
- ORDER BY Attribut1, Attribut2,... ASC = Ausgabe wird anhand der Attribute aufsteigend geordnet (englisch ascending bedeutet aufsteigend)
- ORDER BY Attribut1, Attribut2,... DESC = Ausgabe wird anhand der Attribute absteigend geordnet (englisch descending bedeutet absteigend)
Der folgende Befehl gibt dir die Tupel der Tabelle Personen zurück, bei denen die Personen unter 20 Jahre alt sind (WHERE-Teil). Die Rückgabe wird nach dem Alter der Personen aufsteigend geordnet (ORDER BY-Teil):
Besuche die App, um alle Inhalte zu sehen!
SELECT DISTINCT
Aus der Tabelle Personen sollen nun alle verschiedenen Nachnamen ausgegeben werden. Es liegt nahe, dies mit folgender SQL-Anweisung zu lösen:
Besuche die App, um alle Inhalte zu sehen!
Diese Anweisung liefert folgendes Ergebnis:
Wie dir sicher auffällt, kommt der Name Maier nun zwei Mal in der Liste vor. Das liegt daran, dass der obige SQL Befehl dir alle Attributwerte zurück gibt, die in der Tabelle vorkommen. Wenn du Duplikate vermeiden möchtest, dann kannst du den Zusatz DISTINCT hinter SELECT nutzen:
Besuche die App, um alle Inhalte zu sehen!
Du erhältst nun folgende Rückgabe:
Beispiele
Die folgenden Beispiele beziehen sich auf die bereits in der Datenbank angelegten Tabelle Staedte. Ein Ausschnitt der Tabelle sieht folgendermaßen aus. Die drei Punkte deuten an, dass sich hier weitere Daten befinden, die aber zur bessren Übersicht nicht angegeben sind.
... | ... | ... | ... |
WHERE Abfrage
Zunächst sollen die Namen und IDs aller französischen Städte ausgeben werden:
Besuche die App, um alle Inhalte zu sehen!
... | ... |
ORDER BY
Es sollen Namen und Einwohnerzahl aller Städte zurückgegeben werden, welche mehr als eine Millionen Einwohner haben, absteigend geordnet nach Einwohnerzahl:
Besuche die App, um alle Inhalte zu sehen!
... | ... |