====== 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 ausgegeben((Das kartesische Produkt der Tabellen)). 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:
{{ :faecher:informatik:oberstufe:datenbanken:joins:auswahl_081.png |}}
==== 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:
{{ :faecher:informatik:oberstufe:datenbanken:joins:auswahl_082.png |}}
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
----
{{:aufgabe.png?nolink |}}
=== (A1) ===
Sofern noch nicht geschehen: Importiere die Datenbank {{ :faecher:informatik:oberstufe:datenbanken:er_modelle_praxis:webshop.zip|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.((Tipp: ''WHERE attribute NOT IN'' (SQL-Klausel). ))
-> [[.:loseungen|Lösungsvorschläge]]
===== Material =====
{{simplefilelist>:faecher:informatik:oberstufe:datenbanken:joins:*}}