ZUM-Unterrichten - Logo.png
Viele Inhalte sind umgezogen ins neue ZUM-Unterrichten.

Datenbanken: Einfache Abfragen in SQL

aus ZUM-Wiki, dem Wiki für Lehr- und Lerninhalte auf ZUM.de
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Einleitung

Herzlich Willkommen zur Selbstlerneinheit Datenbanken: Einfache Abfragen in SQL. Du willst mehr über SQL wissen? Du willst deine eigene Datenbank erstellen und damit Abfragen durchführen? Du möchtest wissen, wie du SQL-Anweisung richtig anwenden kannst? Dann bist du hier genau richtig !!! Wir werden gemeinsam bei Null anfangen und uns langsam einarbeiten, sodass du am Ende dieser Selbstlerneinheit Tabellen erstellen, Abfragen durchführen und interpretieren kannst. Wenn du bereit bist, kann es direkt losgehen!

Doch bevor wir eine Datenbank erstellen, sollten einige Grundlagen geklärt werden. Was ist eigentlich SQL, was sind Tabellen, Spalten und Zeilen und wie kann man eine Datenbank auf seinem Computer erstellen(Bsp. PHPMyAdmin), um all die Beispiele direkt auszuprobieren. Das alles findet ihr im Kapitel Einleitung.

Was ist SQL ?

SQL steht für Structured Query Language und es handelt sich dabei um eine strukturierte Abfragesprache, mit der man Daten aus einer Datenbank selektieren, eintragen, aktualisieren und löschen kann. Zudem kann man mit SQL Datenbank-Tabellen erstellen, modifzieren und löschen. Die Programmiersprache ist ANSI und ISO-standardisiert und wird von den meisten Datenbanksystemen verstanden. Die drei beliebtesten SQL-Datenbanken sind MySQL, PostgreSQL und MaxDB, die größten kommerziellen Anbieter auf diesem Gebiet sind Oracle und IBM. In jeder seriösen Datenbank geschieht in der Regel jede Abfrage, jedes Löschen und jeder Eintrag über SQL. Durch den sehr großen Sprachumfang von SQL gibt es für diesen Standard kaum ernst zunehmende Konkurrenz.

Wofür braucht man eine Datenbank/MySQL?

Wie der Name schon andeutet, kann man in einer Datenbank Daten sammeln. Häufige Anwendungsfälle für eine Datenbank sind:

  • Registrierungen auf einer Webseite: Wenn sich Besucher auf deiner Website registrieren und einloggen können, musst du ihre Logindaten irgendwo speichern, eine Datenbank bietet sich da für an.
  • CMS (Content Management System): Eine Webseite, die ein Content Management System beinhaltet, hat häufig sehr viele Textinhalte. Die können prima in einer Datenbank abgelegt werden. Das hat unter anderem auch den Vorteil, dass man die Inhalte vom Design der Seite getrennt hat. Wenn also mal wieder ein Redesign ansteht, muss man nur das Design ändern und die Texte bleiben in der Datenbank unberührt.
  • Inhalte generell: Bastelt man an einer Fragen-Seite, kann man davon ausgehen mit der Zeit sehr viele Fragen und Antworten zu haben. Diese kann man prima in einer Datenbank ablegen.

Kleine Portfolio Seiten, bzw Webseiten mit nur ein paar HTML-Dateien kommen natürlich auch gut ohne eine Datenbank aus. Wenn man aber sehr viele Inhalte hat bzw erwartet, sollte man eine Datenbank in Erwägung ziehen.

Unterscheid von SQL und MySQL

SQL ist eine Datenbank-Abfrage-Sprache. Wir haben also Daten in einer Datenbank und mit SQL können wir Daten selektieren, neue Daten eintragen, vorhandene Daten aktualisieren oder löschen. MySQL ist nun der Weg, mittels PHP, SQL-Abfragen (Queries) auszuführen.

Tabellen und die Normalisierung

Unsere Datenbanken bestehen mindestens aus einer Tabelle. In ihr kann man Daten speichern und jede einzelne Tabelle gruppiert bestimmte Daten. So kann man zum Beispiel eine Tabelle “Kunden” haben, in der alle Kunden-relevanten Daten gespeichert werden. Oder man hat eine Tabelle “Autos”, in der Autos + ihre spezifischen Daten (wie Preis und Leistung) gespeichert werden.

Oft werden Tabellen nicht richtig normalisiert, dh. sie erhalten viele redundante Daten(=Informationen, die mehrmals in der Tabelle auftauchen). Ein weiterer Nachteil solcher Tabellen ist es, dass sogenannte Anomalien auftauchen können, sei es beim einfügen, ändern oder löschen von Daten. Unter dem folgenden Link habt ihr mehr Informationen dazu.

  • Normalisierung Ein sehr schönes Beispiel zur Normalisierung einer Tabelle

Spalten und Zeilen

Jede Tabelle besteht aus einer Menge aus Spalten und Zeilen. Spalten sind dabei die Wert-Gruppen, während Zeilen die eigentlichen Werte beinhalten. Man bezeichnet eine einzelne Zeile auch als einen Datensatz. Eine Tabelle Auto hat zum Beispiel folgende Spalten:

FhrzgNr, Marke, Leistung, Farbe, Neupreis und Baujahr.

Akoeksu B1.jpg

Primary Key

Der Primary Key ist ein uniquer Schlüssel, der jede Zeile einer Tabelle eindeutig identifiziert. Wenn man zum Beispiel einer Tabelle “Kunden” hat kann es vorkommen, dass zwei oder mehr Kunden den gleichen Namen und Nachnamen haben. Anstatt nun die Kunden anhand ihrer Namen eindeutig zu identifizieren (was problematisch wäre) gibt man jeder Zeile eine eindeutige ID, den Primary Key. Dieser wird beim eintragen einer neuen Zeile gesetzt und bei jedem neu eingetragenem Datensatz erhöht. Dadurch wird verhindert, dass zweimal die gleiche ID vergeben wird.

Erstellung einer Datenbank

Dies solltet iht herunterladen und installieren:

Hier könnt ihr sehen, wie mit einer Anwendung(PHPMyAdmin) eine Datenbank und eine Tabelle erstellt werden kann.

SQL Abfragen

Um die folgenden Beispiele direkt auszuprobieren, brauchst du die Tabelle “Auto” mit ein paar Startwerten. Die folgenden Schritte können mithilfe der Installations-Anleitung und mit dem ersten Video dazu gemeistert werden.

  • Starte deinen Xampp Server
  • Gehe zu PHPMyAdmin
  • Erzeuge die Datenbank und Tabelle “Auto”

SELECT-Anweisung

Wozu dienen SQL-Anweisungen? Eine häufige Anwendung ist die Auswahl von Daten aus den Tabellen einer Datenbank. Und damit kommen wir schon zu zwei Schlüsselwörtern: wir wählen (SELECT) Daten aus (FROM) einer Tabelle. (Eine Tabelle ist ein Container in der Datenbank, der die Daten enthält. Nähere Informationen zum Bearbeiten von Tabellen finden Sie im Abschnitt Tabellenbearbeitung). Die einfachste SQL-Struktur lautet also:

 SELECT "SpaltenName"
 FROM   "TabellenName"

Gehen wir zur Verdeutlichung des obigen Beispiels von folgender Tabelle namens "Auto" aus:

Akoeksu B1.jpg

Dies ist die Beispieltabelle für die gesamte Selbstlerneinheit (sie erscheint in sämtlichen Abschnitten). Nun möchten wir alle Automarken sehen, die in unserer Tabelle zu finden sind. Dazu geben wir folgendes ein:

 SELECT MARKE,
 FROM   AUTO;

Ergebnis:

MARKE
BMW
Audi
Mercedes
Opel

Es lassen sich sowohl mehrere Spaltennamen als auch mehrere Tabellennamen auswählen. 

DISTINCT

Der SQL DISTINCT Befehl wird in einer SQL Select Abfrage direkt hinter dem Select platziert. Mithilfe des DISTINCT Befehls werden Redundanzen, die in einer Tabellen auftreten können, ausgeblendet und die Werte werden jeweils nur ein Mal angezeigt.

Der Befehl Distinct kommt weniger in relationalen Datenbanken vor. Er wird häufiger in einem Data Warehouse und der Report-Erstellung genutzt, also dort wo durchaus Redundanzen auftreten können. Die SQL Syntax einer Select-Distinct-Abfrage ist wie folgt aufgebaut:

  SELECT DISTINCT  "Spaltenname" 
  FROM             "Tabellenname" 

Wir möchten nun die Farben der Autos sehen, die in unserer Tabelle gespeichert sind. Dafür wird der SQL Distinct Befehl wie folgt eingesetzt, damit die Farbe "rot" nicht mehrmals vorkommt:

  SELECT Distinct FARBE
  FROM            AUTO

Ergebnis:

FARBE
rot
weiss
blau

Ohne DISTINCT würde die Tabelle so aussehen: Ergebnis:

FARBE
rot
rot
weiss
blau

WHERE

Mithilfe des WHERE-Befehls werden in SQL Abfragen nur bestimmten Datensätze ausgewählt. Der WHERE-Befehl funktioniert im Prinzip wie ein Filter, der es ermöglicht, nur Datensätze anzuzeigen, die bestimmte Kriterien erfüllen. Soll ein SQL Statement eine bestimmte Bedingung erfüllen, muss eine WHERE-Bedingung eingebaut und erfüllt werden, damit die Abfrage eine Ergebnismenge liefern kann. Nehmen wir an, wir möchten zum Beispiel alle Autos sehen, die rot sind. Dazu verwenden wir das Schlüsselwort WHERE. Die Syntax sieht folgendermaßen aus:

  SELECT "SpaltenName"
  FROM   "TabellenName"
  WHERE  "Bedingung"; 

Mithilfe des WHERE wird definiert, welche Bedingung positiv erfüllt werden muss, damit die richtige Ergebnismenge geliefert wird. Die Ergenismenge kann mithilfe der folgenden Vergleichoperatoren spezifiziert werden:

Gleich (=) oder Ungleich(<=)

Größer als (>) oder Kleiner als (<)

Größer gleich (>=) oder Kleiner gleich(<=)

Um zum Beispiel alle Autos, die rot sind, in der Tabelle FARBE auszuwählen, geben wir:

  SELECT MARKE, FARBE
  FROM   AUTO
  WHERE  FARBE = "rot";

Ergebnis:

MARKE FARBE
BMW rot
Audi rot

AND / OR

Nun haben wir das Schlüsselwort WHERE kennen gelernt, mit dem sich Daten aus einer Tabelle auswählen lassen, die bestimmte Bedingungen erfüllen. Dabei kann es sich um eine einfache Bedingung (wie im vorigen Beispiel) oder eine zusammengesetzte Bedingung handeln. Zusammengesetzte Bedingungen bestehen aus mehreren durch AND oder OR verbundenen einfachen Bedingungen. Eine einzelne SQL-Anweisung kann eine unbegrenzte Anzahl einfacher Bedingungen enthalten.

Die Syntax für eine zusammengesetzte Bedingung sieht folgendermaßen aus:

  SELECT    "Spalten_Name"
  FROM      "Tabellen_Name"
  WHERE     "einfache Bedingung"
 {[AND|OR]  "einfache Bedingung"}+;

Das Symbol { }+ bedeutet, dass der Ausdruck in der Klammer einmal oder mehrere Male auftreten kann. Beachten Sie, dass AND und OR austauschbar verwendet werden können. Zusätzlich kann mit dem Klammersymbol ( ) die Reihenfolge der Bedingung angegeben werden.

Um zum Beispiel alle Autos auszuwählen, die rot sind und eine Leistung über 250 PS haben, geben wir:

  SELECT  MARKE, FARBE, LEISTUNG
  FROM    AUTO
  WHERE   LEISTUNG > 250 AND FARBE = "rot";

Ergebnis:

MARKE FARBE LEISTUNG
BMW rot 260

Ein weiteres Beispiel wäre, dass wir alle Autos sehen möchten, die mehr als 240 PS haben oder einen Neupreis von mehr als 30.000 € haben. Diese Abfrage würde folgendermaßen aussehen:

  SELECT  MARKE,  LEISTUNG, NEUPREIS
  FROM    Auto
  WHERE   LEISTUNG > 240 OR NEUPREIS > 30000

Ergebnis:

MARKE LEISTUNG NEUPREIS
BMW 260 15000
Audi 250 50000
Mercedes 230 35000

LIKE

Der SQL LIKE Befehl ermöglicht eine Suche auf der Grundlage eines vorher definierten regulären Musters anstelle eines festen Suchbegriffs oder der Definition eines Bereichs. Oft wird der SQL Like Befehl in Texten bzw. Zeichenketten verwendet, um mit regulären Mustern Ergebnisse zurückzuliefern.

Die SQL Syntax einer Select-Abfrage mit WHERE und LIKE kann wie folgt aufgebaut werden:

  SELECT  "Spaltenname"
  FROM    "Tabellenname" 
  WHERE   "Spaltenname" LIKE 'MUSTER' 

Das 'MUSTER' kann nach folgenden Strukturen aufgebaut werden:

  • 'L_S': Alle Zeichenketten die mit einem 'L' beginnen, inklusive einem Folgezeichen und mit einem 'S' enden.
  • 'BEST%': Alle Zeichenketten, die mit 'BEST' beginnen.
  • '%UNG': Alle Zeichenketten, die auf 'UNG' enden.
  • '%ST%': Alle Zeichenketten, die an irgendeiner Stelle das Muster 'ST' enthalten.

Nun wollen wir alle Automarken haben, die mit einem M anfangen. Unsere Abfrage müsste so aussehen:

  SELECT  MARKE
  FROM    AUTO
  WHERE   MARKE LIKE 'M%'

Nun kommen wir zu unserer ersten Übung. Bevor wir mit dem nähsten Kapitel beginnen, solltest du diese Fragen beantworten: SQL Quiz 1(Learningapps)

Aggregation von Daten(Gruppenfunktionen)

Akoeksu B1.jpg

Da wir uns hier bereits mit Zahlen beschäftigt haben, liegt natürlich die Frage nahe, ob mir mit diesen Zahlen Rechenoperationen wie Addition oder Mittelwertbildung durchführen können. Die Antwort lautet ja! SQL verfügt über mehrere arithmetische Funktionen, diese beziehen sich entweder auf die gesamte Selektion einer Anfrage oder auf Gruppen von Datensätzen, die mit GROUP BY gebildet werden können. SQL spezifiziert die folgende Aggregatfunktionen in:

  • SUM
  • COUNT
  • MAX
  • MIN
  • AVG(=Mittelwert)
SUM

SUM summiert die Werte einer Spalte (gegebenenfalls innerhalb einer Gruppe). Die Vorgehensweise bei SUM gilt genauso für die anderen Aggregatfunktionen. Syntax:

  SELECT  SUM("SpaltenName")
  FROM    "TabellenName"


Beispiel: Ein Kunde möchte alle Autos kaufen, die nach 2011 gebaut worden sind. Da es sich um einen sehr reichen Herrn handelt, möchte er nur den Preis als Summe aller Autos haben, die in Frage kommen. Die Abfrage müsste folgendermaßen aussehen:

  SELECT  SUM(NEUPREIS) AS Summe
  FROM    AUTO
  Where   BAUJAHR>2011

Kurze Erläuterung zu AS: Es wird eine neue Spalte als Teil einer Abfrage wie folgt erstellt: <Ausdruck> [AS] <Name der neuen Spalte> Ausdruck ist allgemein der Hinweis auf etwas, das an der betreffenden Stelle verwendet wird: ein konstanter Wert, der Inhalt einer oder mehrerer Spalten, eine Berechnung mit diesen Spalten, das Ergebnis einer Funktion oder das Ergebnis einer Unterabfrage. Der Spalte, die das Ergebnis aufnimmt, wird mit AS ein eigener Name, ein Alias zugewiesen; das AS kann auch entfallen.

Ergebnis:

SUMME
74500
COUNT

Eine weitere arithmetische Funktion ist mit COUNT verfügbar. Sie erlaubt die Zählung (COUNT) der Zeilen in einer bestimmten Tabelle. Die Syntax lautet:

  SELECT COUNT("Spalten_Name")
  FROM   "Tabellen_Name"

Beispiel: Der Autohändler möchte die Anzahl seiner Autos wissen, die noch zum Verkauf zur Verfügung stehen.

  SELECT COUNT(FHRZGNR) AS Anzahl
  FROM   AUTO

Ergebnis:

Anzahl
4
MIN / MAX

Durch Min und Max können wir das Minimum bzw. das Maximum in einer Spalte bestimmen. Dabei sieht die Syntax folgendermaßen aus:

  SELECT MAX("Spaltenname")
  FROM   "TabellenName"
  

Angenommen wir möchten wissen, welches das blligste/teuerste Auto in unserer Tabelle ist. Dazu würden wir folgende Abfrage durchführen:

  SELECT MARKE, MAX(NEUPREIS) AS teuerstes Auto / MIN (NEUPREIS) AS günstigstes Auto
  FROM   Auto

Dabei würde das Ergebnis so aussehen(für MAX):

MARKE teuerstes Auto
Audi 50000
AVG

Wie der Name schon sagt können wir mit der Funktion AVG(=average) den Mittelwert in einer Spalte bestimmen. Dies würde sich in anderen Tabellen warscheinlich besser eignen als bei unserer aber uns geht es ja nur darum, etwas zu üben und auszuprobieren.Bsp: Unser Autohändler ist schon relativ alt, er hat vergessen wie die Preise seiner Autos sind. Um sich einen groben Überblick zu verschaffen, bittet er einen seiner Mitarbeiter, ihm den durchschnittlichen Preis all seiner Autos zu bestimmen. Die Syntax ist fast die selbe wie bei MIN/MAX oder COUNT, deshalb überspringen wir diese und schauen uns direkt die Abfrage an.

  SELECT AVG(NEUPREIS) AS durchschnittlicher Preis
  FROM   AUTO

Ergebnis:

durchschnittlicher Preis
31125.00

Nun kommen wir wieder zu einer Übung, um unser Wissen zu festigen. Bevor wir mit dem nähsten Kapitel beginnen, solltest du diese Fragen beantworten: SQL Quiz 2(LearningApps)

Gruppierung

Akoeksu B1.jpg

ORDER BY

Bisher haben wir uns mit dem Abrufen von Daten aus einer Tabelle unter Verwendung der Befehle SELECT und WHERE beschäftigt. In vielen Fällen müssen die ausgegebenen Daten jedoch auf eine bestimmte Weise sortiert werden. Dies könnte beispielsweise in aufsteigender oder absteigender Reihenfolge oder auf der Grundlage eines Zahlenwerts oder Textwerts geschehen. In solchen Fällen können wir das Schlüsselwort ORDER BY einsetzen.

Die Syntax für eine ORDER BY-Anweisung sieht folgendermaßen aus:

  SELECT     "Spaltenname" 
  FROM       "Tabellenname" 
  ORDER BY   "Spaltenname" 'Sortierungsparameter' 

Der 'Sortierungsparameter' kann nach folgenden Strukturen aufgebaut werden:

  • ASC: Das Ergebnis wird aufsteigend sortiert
  • DESC: Das Ergebnis wird absteigend sortiert

Nun wollen wir die Pkw's nach ihrem Preis aufsteigend sortieren. Das SQL-Statement mit der ORDER BY-Bedingung würde wie folgt aussehen:

  SELECT       MARKE, NEUPREIS
  FROM         AUTO
  ORDER BY     NEUPREIS ASC

Ergebnis:

MARKE NEUPREIS
BMW 15000
Opel 24500
Mercedes 35000
Audi 50000

GROUP BY

Das Schlüsselwort GROUP BY wird verwendet, wenn mehrere Spalten aus einer Tabelle ausgewählt werden und mindestens ein arithmetischer Operator in der SELECT-Anweisung enthalten ist. In diesem Fall müssen wir nach allen anderen ausgewählten Spalten GRUPPIEREN, d.h. nach allen Spalten außer denjenigen, auf die sich der arithmetische Operator bezieht. Syntax:

  SELECT       "SpaltenName1", SUM("SpaltenName2")
  FROM         "TabellenName"
  GROUP BY     "SpaltenName1";

Beispiel: Der Autohändler möchte dieses mal wissen, wie viele Autos das Baujahr 2012 in unserem Repertoire besitzen. Die SQL-Abfrage mit der GROUP BY-Bedingung würde wie folgt aussehen:

  SELECT      MARKE, SUM(BAUJAHR) AS Baujahr
  FROM        AUTO
  WHERE       BAUJAHR = '2012'
  GROUP BY    MARKE

Ergebnis: Ergebnis:

Marke Baujahr
Audi 2012
Opel 2012

HAVING

Das SQL HAVING ist das SQL WHERE in einem SQL GROUP BY-Statement, dass ermöglicht eine gruppierte Ergebnismenge einzuschränken. Mit SQL HAVING kann die Ergebnismenge auf Basis der Aggregatfunktionen (AVG, COUNT, MAX, MIN, SUM) eingeschränkt und ausgegeben werden. Die SQL HAVING Syntax einer Select-Abfrage mit GROUP BY ist wie folgt aufgebaut:

  SELECT     "Spaltenname" 
  FROM       "Tabellenname" 
  [WHERE Bedingung] 
  GROUP BY   "Spaltenname" 
  HAVING      Ausdruck

Beispiel: Der Autohändler hat jetzt die Information aus der vorherigen Abfrage bekommen, dass er zwei Autos hat, die im Jahr 2012 gebaut sind. Nun möchte er zusätzlich, dass alle Automarken angezeigt werden, die im Jahre 2012 gebaut worden sind und eine Leistung über 200 PS haben.(Mit den Automarken sind hier jeweils nur einzelne Fahrzeuge gemeint)

    SELECT        MARKE, LEISTUNG, SUM(BAUJAHR) AS Baujahr
    FROM          AUTO
    WHERE         BAUJAHR = 2012
    GROUP BY      MARKE, LEISTUNG
    HAVING        LEISTUNG > 200

Ergebnis:

Marke Leistung Baujahr
Audi 250 2012

Übungen und Aufgaben

Jetzt bist du auf dich alleine gestellt :) Überprüfe dich selber, indem du diese Aufgaben alleine bearbeitest. Wenn du die Selbstlerneinheit komplett durchgelesen und an deinem eigenen PC die Abfragen durchgeführt hast, wirst du diese Aufgaben lösen können. Falls du Probleme haben solltest, kannst du immer hoch scrollen und schauen wie die einzelnen Aufgaben gelöst worden sind.

Aufgabe 1: Da du dich seit neustem mit Datenbanken gut auskennst, möchte dein Freund, dass du für ihn eine Datenbank erstellt, womit er seine Bücher verwalten kann. Erstelle die Tabelle "Buch" an deinem PC. Diese soll folgende Spalten besitzen: ISBN(PK), Autor, Titel, Erscheinungsjahr, Seitenanzahl

Fülle den Inhalt der Tabelle mit folgenden Informationen:

  1. 1234, Stahlknecht, Wirtschaftsinformatik, 1985, 410
  2. 2234, Schwarze, Sql, 1999, 337
  3. 8762, Wikizum, Abfragen, 2012, 158
  4. 6591, Köksu, Mathematik, 2013, 66
  5. 6640, Zumwiki, Informatik, 2005, 244
  6. 3456, Hansen, Didaktik, 2009, 549

Aufgabe 2: Nun möchte dein Freund einige Fragen beantwortet haben, ohne die Bücher in die Hand nehmen zu müssen. Führe folgende Abfragen am PC aus.

  • Frage 1: Wie heißen die Titel all meiner Bücher?
  • Frage 2: Wie viele Bücher habe ich?
  • Frage 3: Welche meiner Bücher haben mehr als 300 Seiten? --> Folgende Spalten sollen ausgegeben werden : ISBN, Titel, Seitenanzahl
  • Frage 4: Nenne mir alle Bücher, die vor 2005 erschienen sind und der Name des Autors mit einem 'S' beginnt. --> Folgende Spalten sollen ausgegeben werden : ISBN, Autor, Erscheinungsjahr
  • Frage 5: Wie viele Seiten haben all meine Bücher gemeinsam?(Summe aller Seiten) --> Folgende Spalten sollen ausgegeben werden : Neue Spalte namens SeitenGesamt
  • Frage 6: Welches meiner Bücher hat die meisten Seiten ? --> Folgende Spalten sollen ausgegeben werden: Titel, Seitenanzahl
  • Frage 7: Ich möchte eine Tabelle, wo die Titel all meiner Bücher alphabetisch in absteigender Reihenfolge geordnet sind. Spalten: Autor, Titel
  • Frage 8: Wie viele Seiten haben meine Bücher, die nach 2002 erschienen sind, insgesamt(summe) ? Spalten: ISBN, Titel, Seitenanzahl


Lösungen: <document>Akoeksu_Datenbanken_–_Einfache_Abfragen_in_SQL.pdf</document>

Quellenangaben