SQL DQL Grundlagen

SQL DQL Grundlagen

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?
Daten werden aus einer Datenbank mittels SQL-Queries ausgelesen.

Als Beispieltabelle wird hier eine einfache Tabelle namens Personen verwendet. Sie sieht folgendermaßen aus:

\underline{\textsf{PersonenID}}PersonenID\underline{\textsf{PersonenID}}
\textsf{Vorname}Vorname\textsf{Vorname}
\textsf{Nachname}Nachname\textsf{Nachname}
\textsf{AktuellesAlter}AktuellesAlter\textsf{AktuellesAlter}
\textsf{1}1\textsf{1}
\textsf{Leon}Leon\textsf{Leon}
\textsf{Maier}Maier\textsf{Maier}
\textsf{18}18\textsf{18}
\textsf{2}2\textsf{2}
\textsf{Emma}Emma\textsf{Emma}
\textsf{Maier}Maier\textsf{Maier}
\textsf{16}16\textsf{16}
\textsf{3}3\textsf{3}
\textsf{Max}Max\textsf{Max}
\textsf{Mustermann}Mustermann\textsf{Mustermann}
\textsf{25}25\textsf{25}
\textsf{4}4\textsf{4}
\textsf{Amir}Amir\textsf{Amir}
\textsf{Schneider}Schneider\textsf{Schneider}
\textsf{17}17\textsf{17}

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:

Hier versteckt sich noch mehr!
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:

Hier versteckt sich noch mehr!
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:

Hier versteckt sich noch mehr!
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:

Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!

Du erhältst das Ergebnis:

\textsf{Vorname}Vorname\textsf{Vorname}
\textsf{AktuellesAlter}AktuellesAlter\textsf{AktuellesAlter}
\textsf{Leon}Leon\textsf{Leon}
\textsf{18}18\textsf{18}
\textsf{Emma}Emma\textsf{Emma}
\textsf{16}16\textsf{16}
\textsf{Max}Max\textsf{Max}
\textsf{25}25\textsf{25}
\textsf{Amir}Amir\textsf{Amir}
\textsf{17}17\textsf{17}

Bedingungen mittels WHERE

Mit dem Befehl WHERE kannst du zusätzliche Bedingungen definieren, welche die Datensätze erfüllen müssen. Der Befehl ...

Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!

... gibt alle Tupel zurück, deren Nachname 'Maier' ist:

\underline{\textsf{PersonenID}}PersonenID\underline{\textsf{PersonenID}}
\textsf{Vorname}Vorname\textsf{Vorname}
\textsf{Nachname}Nachname\textsf{Nachname}
\textsf{AktuellesAlter}AktuellesAlter\textsf{AktuellesAlter}
\textsf{1}1\textsf{1}
\textsf{Leon}Leon\textsf{Leon}
\textsf{Maier}Maier\textsf{Maier}
\textsf{18}18\textsf{18}
\textsf{2}2\textsf{2}
\textsf{Emma}Emma\textsf{Emma}
\textsf{Maier}Maier\textsf{Maier}
\textsf{16}16\textsf{16}

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:

Hier versteckt sich noch mehr!
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:

\underline{\textsf{PersonenID}}PersonenID\underline{\textsf{PersonenID}}
\textsf{Vorname}Vorname\textsf{Vorname}
\textsf{Nachname}Nachname\textsf{Nachname}
\textsf{AktuellesAlter}AktuellesAlter\textsf{AktuellesAlter}
\textsf{3}3\textsf{3}
\textsf{Max}Max\textsf{Max}
\textsf{Mustermann}Mustermann\textsf{Mustermann}
\textsf{25}25\textsf{25}

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?

\rhd\rhd Dazu gibt es in SQL folgende Möglichkeiten:

  • 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.
Hier versteckt sich noch mehr!
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:

Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!

Ergebnis:

\underline{\textsf{PersonenID}}PersonenID\underline{\textsf{PersonenID}}
\textsf{Vorname}Vorname\textsf{Vorname}
\textsf{Nachname}Nachname\textsf{Nachname}
\textsf{AktuellesAlter}AktuellesAlter\textsf{AktuellesAlter}
\textsf{1}1\textsf{1}
\textsf{Leon}Leon\textsf{Leon}
\textsf{Maier}Maier\textsf{Maier}
\textsf{18}18\textsf{18}

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):

Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!
\underline{\textsf{PersonenID}}PersonenID\underline{\textsf{PersonenID}}
\textsf{Vorname}Vorname\textsf{Vorname}
\textsf{Nachname}Nachname\textsf{Nachname}
\textsf{AktuellesAlter}AktuellesAlter\textsf{AktuellesAlter}
\textsf{2}2\textsf{2}
\textsf{Emma}Emma\textsf{Emma}
\textsf{Maier}Maier\textsf{Maier}
\textsf{16}16\textsf{16}
\textsf{4}4\textsf{4}
\textsf{Amir}Amir\textsf{Amir}
\textsf{Schneider}Schneider\textsf{Schneider}
\textsf{17}17\textsf{17}
\textsf{1}1\textsf{1}
\textsf{Leon}Leon\textsf{Leon}
\textsf{Maier}Maier\textsf{Maier}
\textsf{18}18\textsf{18}

SELECT DISTINCT

Aus der Tabelle Personen sollen nun alle verschiedenen Nachnamen ausgegeben werden. Es liegt nahe, dies mit folgender SQL-Anweisung zu lösen:

Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!

Diese Anweisung liefert folgendes Ergebnis:

\textsf{Nachname}Nachname\textsf{Nachname}
\textsf{Maier}Maier\textsf{Maier}
\textsf{Maier}Maier\textsf{Maier}
\textsf{Mustermann}Mustermann\textsf{Mustermann}
\textsf{Schneider}Schneider\textsf{Schneider}

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:

Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!

Du erhältst nun folgende Rückgabe:

\textsf{Nachname}Nachname\textsf{Nachname}
\textsf{Maier}Maier\textsf{Maier}
\textsf{Mustermann}Mustermann\textsf{Mustermann}
\textsf{Schneider}Schneider\textsf{Schneider}

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.

\underline{\textsf{StadtID}}StadtID\underline{\textsf{StadtID}}
\textsf{Stadtname}Stadtname\textsf{Stadtname}
\textsf{Einwohnerzahl}Einwohnerzahl\textsf{Einwohnerzahl}
\textsf{Land}Land\textsf{Land}
\textsf{1}1\textsf{1}
\textsf{Berlin}Berlin\textsf{Berlin}
\textsf{3.600.000}3.600.000\textsf{3.600.000}
\textsf{Deutschland}Deutschland\textsf{Deutschland}

...

...

...

...

WHERE Abfrage

Zunächst sollen die Namen und IDs aller französischen Städte ausgeben werden:

Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!
\textsf{Stadtname}Stadtname\textsf{Stadtname}
\underline{\textsf{StadtID}}StadtID\underline{\textsf{StadtID}}

...

...

ORDER BY

Es sollen Namen und Einwohnerzahl aller Städte zurückgegeben werden, welche mehr als eine Millionen Einwohner haben, absteigend geordnet nach Einwohnerzahl:

Hier versteckt sich noch mehr!
Besuche die App, um alle Inhalte zu sehen!
\textsf{Stadtname}Stadtname\textsf{Stadtname}
\textsf{Einwohnerzahl}Einwohnerzahl\textsf{Einwohnerzahl}

...

...

Nächstes Thema:
SQL Joins

Weiter
SQL Joins

simpleclub ist am besten in der App.

Mit unserer App hast du immer und überall Zugriff auf: Lernvideos, Erklärungen mit interaktiven Animationen, Übungsaufgaben, Karteikarten, individuelle Lernpläne uvm.

Jetzt simpleclub Azubi holen!

Mit simpleclub Azubi bekommst du Vollzugang zur App: Wir bereiten dich in deiner Ausbildung optimal auf deine Prüfungen in der Berufsschule vor. Von Ausbilder*innen empfohlen.

Jetzt simpleclub Azubi holen