SQL-Joins - Grundlagen
Wie werden die Tabellen (und Entitäten) jetzt aber mit SQL Abfragen verbunden, so dass die gewünschten "zusammengesetzten" Informationen als Ergebnis der Abfrage vorliegen?
Abfragen über mehrere Tabellen
Bei Abfragen aus mehreren Tabellen wird ohne weitere Bedingung die Besziehung zwischen den Entitäten nicht berücksichtigt - es werden einfach alle Kombinationen aller Datensätze der beiden Tabellen gebildet und ausgegeben1). Die meisten der so aggregierten Datensätze sind sinnfrei.
Beipiel: Die Tabelle lehrer
hat 6 Datensätze, die Tabelle schueler
12. Die Abfrage
SELECT * FROM `lehrer`,`schueler`
liefert als Ergebnis eine Tabelle mit ($6\cdot 12=$) 72 Datensätzen:
Sinnvolle Datensätze bilden
Sinnvoll sind in diesem Fall nur die Datensätze, bei denen in der Schülertabelle die klassenlehrer_id
des zugehörigen Klassenlehrers mit der lehrer_id
in der lehrer
Tabelle übereinstimmt.
SELECT * FROM `lehrer`,`schueler` WHERE schueler.klassenlehrer_id=lehrer.lehrer_id
Wenn man Felder verschiedener Tabellen in einer Abfrage verwendet, muss man diese in der Form Tabelle.Attribut
angeben. Das Ergebnis sieht jetzt so aus:
Das macht Sinn, das ist eine Liste aller Lehrer und Schüler, und zwar passend, so das die Schüler bei Ihren Klassenlehrern mitgelistet werden.
Allgemeiner Aufbau
Eine Klausel für SQL-Joins ist im Wesentlichen folgendermaßen aufgebaut:
SELECT [DISTINCT] { spalten | * } FROM tabelle1, tabelle2, ... WHERE tabelle1.spalte1=tabelle2.spalte1, tabelle1.spalte2=tabelle2.spalte2, ...
Um die Ausdrücke abzukürzen, kann man Tabellen mit mit dem Schlüsselwort AS
mit Aliasen bezeichnen:
SELECT [DISTINCT] { spalten | * } FROM tabelle1 AS t1, tabelle2 AS t2, ... WHERE t1.spalte1=t2.spalte1,t1.spalte2=t2.spalte2, ...
Das Ergebnis eines Joins ist eine Tabelle mit allen Spalten, die in der SQL-Klausel angegeben wurden. Die Spaltenbezeichnung muss eindeutig sein. Enthalten die Tabellen tabelle1
und tabelle2
gleichnamige Spalten wie id
, muss die Spalte mit tabelle1.id
eindeutig benannt sein.
Wird keine WHERE-Bedingung angegeben, wird das Kreuzprodukt der Tabellen gebildet, d.h. jeder Datensatz einer Tabelle wird mit jedem der anderen Tabelle(n) kombiniert.
Beispiele
Ausgabe aller Kunden mit den Nummern ihrer bestellten Artikel
SELECT k.KNr, k.KVorname, k.KNachname, b.ANr FROM Kunden AS k, Bestellt AS b WHERE k.KNr=b.KNr
Ausgabe aller Kunden mit den Namen ihrer bestellten Artikel
SELECT k.KNr, k.KVorname, k.KNachname, a.Name FROM Kunden AS k, Bestellt AS b, Artikel AS a WHERE k.KNr=b.KNr AND b.ANr=a.ANr
(A1)
Sofern noch nicht geschehen: Importiere die Datenbank webshop in deinen mysql-Datenbankbereich.
Löse die folgenden Aufgaben innerhalb der Datenbank webshop
, indem du das SQL-Abfragefenster verwendest. Speichere deine Lösungen in einer Textdatei/deinem Infoheft. Vermeide die Ausgabe von Duplikaten.
- Gib die Liste mit den Namen aller jemals bestellen Artikel mitsamt ihres Bestelldatums aus.
- Gib die Liste aller Kundennummern zusammen mit den Namen der Artikel, die unter dieser Nummer bestellt wurden, aus.
- Gib alle Zeitpunkte aus, zu denen Thomas Tischler Artikel im Webshop bestellt hat.
- Gib die Namen aller Artikel aus, die Maximilian Mayer bestellt hat.
- Gib die Namen aller Kunden aus, die mindestens einmal einen Artikel bestellt haben, absteigend sortiert nach dem Datum der letzten Bestellung.
- Gib pro Kunde aus, wie viele Artikel er insgesamt bestellt hat. Die Liste soll absteigend sortiert nach der Anzahl der Bestellungen ausgegeben werden.
- Gib die Namen der Artikel aus mitsamt der Information, wie oft sie insgesamt bestellt wurden. Die Liste soll absteigend sortiert nach der Anzahl der Bestellungen ausgegeben werden.
- Gib pro Kunde aus, wie viel Geld er insgesamt ausgegeben hat.
- Gib die Nummern und Namen der Kundenpaare aus, die den gleichen Artikel bestellt haben.
- Zusatzaufgabe: Gib die Liste aller Kunden aus, die noch nie einen Artikel im Webshop bestellt haben.2)
Material
Filename | Filesize | Last modified |
---|---|---|
04-sql-joins.odp | 1.4 MiB | 26.11.2020 08:39 |
04-sql-joins.pdf | 681.6 KiB | 26.11.2020 08:39 |
auswahl_080.png | 254.2 KiB | 21.10.2020 17:12 |
auswahl_081.png | 120.7 KiB | 21.10.2020 17:29 |
auswahl_082.png | 98.3 KiB | 21.10.2020 17:28 |
schule500_sus_keine_keys.zip | 10.5 KiB | 26.11.2020 08:38 |
schule500_sus_keys.zip | 11.8 KiB | 26.11.2020 08:38 |
schule_klein.sql.zip | 1.1 KiB | 26.11.2020 08:38 |