tbee's page
   home  work  myself  mixed  guestbook  
   
      INHALT MySQL Der Datenbank - Join im Detail

Wer mir was gutes tun will kauft über diesen Link bei Amazon ein !

Der Datenbank Join im Detail

Wir betrachten die beiden Tabellen:
  • BUCHSTABEN
  • ZAHLEN
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.ID

Ergebnis:

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

  1. Tabellen Buchstaben und Zeichen anlegen und mit Datensätzen erweitern
    • Alle drei Joins nachvollziehen
  2. Verschiedene Joins mit Drei Tabellen.
    • Join als kartesisches Produkt
    • Equi Join
    • Left Join
    • Right Join
  1. Join über Zeichen auf sich selbst (alle Doubletten raussuchen) und dazu die ID aus Buchstaben
    • Ergebnis soll sein Zeichen.Name | Buchstaben.Id

     

 

Wie verknüpft man Tabellen Was versteht man unter einem Join in MySQL

 

Druckerversion     [valid html 4.01]      [english]
style: blauer Stylegelber Styleroter Stylegruener StyleStandard Style
© 2001 by  tbee / Impressum last update at: 01.01. 1970 01:01:00
url: www.tbee.de