|
|
Der Datenbank Join im Detail
Wir betrachten die beiden Tabellen:
Beide haben jeweils eine ID und ein weiteres Feld (NAME bzw. NUMMER). Nun wollen wir das Produkt von beiden Tabellen bilden und entsprechende Einschränkungen vornehmen.
Hier die Tabellendeffinitionen:
CREATE TABLE BUCHSTABEN (
ID int(8) NOT NULL default '0',
NAME varchar(64) NOT NULL default '',
PRIMARY KEY (ID)
);
INSERT INTO BUCHSTABEN VALUES (10, 'ANFANG');
INSERT INTO BUCHSTABEN VALUES (12, 'MARTHA');
CREATE TABLE ZAHLEN (
ID int(6) NOT NULL default '0',
NUMMER decimal(16,0) NOT NULL default '0',
PRIMARY KEY (ID)
)
INSERT INTO ZAHLEN VALUES (10, '1');
INSERT INTO ZAHLEN VALUES (11, '2');
INSERT INTO ZAHLEN VALUES (12, '3');
|
Das Kartesische Produkt
Beide Tabellen werden mit einander "multipliziert, d.h. jedes Element der einen Tabelle mit jedem Element der anderen Tabelle verbunden.
So ergibt sich aus 2 Elementen aus Tabelle Buchstaben mal 3 Elementen aus Tabelle Zahlen 6 Ergebnisse.
D.h.: Anzahl der Tupel aus Tabelle A X Anzahl der Tupel aus Tabelle B = Treffermenge
SELECT
ZAHLEN.ID AS "Z.ID"
,ZAHLEN.NUMMER AS "Z.NUMMER"
,BUCHSTABEN.ID AS "B.ID"
,BUCHSTABEN.NAME AS "B.NAME"
FROM BUCHSTABEN
,ZAHLEN
|
Die zu multiplizierenden Tabellen werden nach FROM aufgeführt.Ergebnis:
Z.ID |
Z.NUMMER |
B.ID |
B.NAME |
10 |
1 |
10 |
ANFANG |
10 |
1 |
12 |
MARTHA |
11 |
2 |
10 |
ANFANG |
11 |
2 |
12 |
MARTHA |
12 |
3 |
10 |
ANFANG |
12 |
3 |
12 |
MARTHA |
Equi Join / Natural Join
Beide Tabellen werden mit einander multipliziert aber nur die Werte in die Ergebnismenge aufgenommen die bei beiden tabellen übereinstimmen.
z.B.: B.ID=Z.ID
Das Ergebnis kann nie größer als die Gesamttupelmenge der größten Tabelle werden.
SELECT
ZAHLEN.ID AS "Z.ID"
,ZAHLEN.NUMMER AS "Z.NUMMER"
,BUCHSTABEN.ID AS "B.ID"
,BUCHSTABEN.NAME AS "B.NAME"
FROM BUCHSTABEN
,ZAHLEN
WHERE BUCHSTABEN.ID=ZAHLEN.ID
|
Der Vergleich wird in der WHERE Bedingung wie bekannt vollzogen Z.D=B.IDErgebnis:
Z.ID |
Z.NUMMER |
B.ID |
B.NAME |
10 |
1 |
10 |
ANFANG |
12 |
3 |
12 |
MARTHA |
Inner/Outer/Right/Left Join
Erläuterungen anhand des LEFT JOIN. Wir vergleichen nun ausgehenden von einer Master Tabelle aus die Werte der anderen Tabelle mit dieser, dabei bilden wir alle Werte der anderen Tabelle auf unsere Master Tabelle soweit vorhanden ab.
(z.B.:ZAHLEN LEFT JOIN BUCHSTABEN)
Das Ergebnis ist immer die Gesamttupelmenge der Master Tabelle.
SELECT
ZAHLEN.ID AS "Z.ID"
,ZAHLEN.NUMMER AS "Z.NUMMER"
,BUCHSTABEN.ID AS "B.ID"
,BUCHSTABEN.NAME AS "B.NAME"
FROM ZAHLEN
LEFT JOIN BUCHSTABEN
ON BUCHSTABEN.ID=ZAHLEN.ID
|
In diesem Fall wird der JOIN mit FROM Tabelle LEFT JOIN Tabelle2 gebildet.
Right Join ist zu Left Join spiegelverkehrt zu sehen.Ergebnis:
Z.ID |
Z.NUMMER |
B.ID |
B.NAME |
10 |
1 |
10 |
ANFANG |
11 |
2 |
NULL |
NULL |
12 |
3 |
12 |
MARTHA |
Auto-Join/Self-Join
Auto-Join bedeutet ein Join mit sich selbst das heisst die Tabelle wird it sich selbst multipliziert.
Dazu fügen wir folgende Daten ein:
INSERT INTO BUCHSTABEN VALUES (11, 'ANFANG');
INSERT INTO BUCHSTABEN VALUES (13, 'BERTA');
|
In diesem Fall ist die Ergebnis Menge genau die Tupelmenge in der Datenbank. Wir Joinen auf uns selbst:
SELECT
B1.ID AS "B1.ID"
,B1.NAME AS "B1.NUMMER"
,B2.ID AS "B2.ID"
,B2.NAME AS "B2.NAME"
FROM BUCHSTABEN B1
,BUCHSTABEN B2
WHERE B1.ID=B2.ID
|
Wir müssen bei einem Self Join auf jeden Fall Tabellen Aliase verwenden ansonsten können wir keinen Join durchführen z.B.: Tabelle AS T1, Tabelle as T2
Ergebnis:
B1.ID |
B1.NUMMER |
B2.ID |
B2.NAME |
10 |
ANFANG |
10 |
ANFANG |
11 |
ANFANG |
11 |
ANFANG |
12 |
MARTHA |
12 |
MARTHA |
13 |
BERTA |
13 |
BERTA |
Wo macht der Einsatz eines Self Joins Sinn?
Z.B.: Doubletten innerhalb einer Tabelle suchen:
SELECT
B1.ID AS "B1.ID"
,B1.NAME AS "B1.NUMMER"
,B2.ID AS "B2.ID"
,B2.NAME AS "B2.NAME"
FROM BUCHSTABEN B1
,BUCHSTABEN B2
WHERE B1.ID!=B2.ID
ANND B1.NAME = B2.NAME
|
Keine gleiche ID aber sehr wohl gleicher Name.Ergebnis:
B1.ID |
B1.NUMMER |
B2.ID |
B2.NAME |
11 |
ANFANG |
10 |
ANFANG |
10 |
ANFANG |
11 |
ANFANG |
Aufgaben zum Join
- Tabellen Buchstaben und Zeichen anlegen und mit Datensätzen erweitern
- Alle drei Joins nachvollziehen
- Verschiedene Joins mit Drei Tabellen.
- Join als kartesisches Produkt
- Equi Join
- Left Join
- Right Join
- Join über Zeichen auf sich selbst (alle Doubletten raussuchen) und
dazu die ID aus Buchstaben
- Ergebnis soll sein Zeichen.Name | Buchstaben.Id
|
|