Inhaltsverzeichnis

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.

  1. Gib die Liste mit den Namen aller jemals bestellen Artikel mitsamt ihres Bestelldatums aus.
  2. Gib die Liste aller Kundennummern zusammen mit den Namen der Artikel, die unter dieser Nummer bestellt wurden, aus.
  3. Gib alle Zeitpunkte aus, zu denen Thomas Tischler Artikel im Webshop bestellt hat.
  4. Gib die Namen aller Artikel aus, die Maximilian Mayer bestellt hat.
  5. Gib die Namen aller Kunden aus, die mindestens einmal einen Artikel bestellt haben, absteigend sortiert nach dem Datum der letzten Bestellung.
  6. Gib pro Kunde aus, wie viele Artikel er insgesamt bestellt hat. Die Liste soll absteigend sortiert nach der Anzahl der Bestellungen ausgegeben werden.
  7. 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.
  8. Gib pro Kunde aus, wie viel Geld er insgesamt ausgegeben hat.
  9. Gib die Nummern und Namen der Kundenpaare aus, die den gleichen Artikel bestellt haben.
  10. Zusatzaufgabe: Gib die Liste aller Kunden aus, die noch nie einen Artikel im Webshop bestellt haben.2)

Lösungsvorschläge

Material

FilenameFilesizeLast modified
04-sql-joins.odp1.4 MiB26.11.2020 08:39
04-sql-joins.pdf681.6 KiB26.11.2020 08:39
auswahl_080.png254.2 KiB21.10.2020 17:12
auswahl_081.png120.7 KiB21.10.2020 17:29
auswahl_082.png98.3 KiB21.10.2020 17:28
schule500_sus_keine_keys.zip10.5 KiB26.11.2020 08:38
schule500_sus_keys.zip11.8 KiB26.11.2020 08:38
schule_klein.sql.zip1.1 KiB26.11.2020 08:38
1)
Das kartesische Produkt der Tabellen
2)
Tipp: WHERE attribute NOT IN (SQL-Klausel).