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?
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:
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.
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.
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
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.
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 |