Verbundoperatoren (Join): Unterschied zwischen den Versionen

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
Kowa (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Kowa (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
=Definition=
==Definition==


Verbundoperatoren (auch Joins genannt) verbinden die Spalten zweier Tabellen zu einer Tabelle.  
Verbundoperatoren (auch Joins genannt) verbinden die Spalten zweier Tabellen zu einer Tabelle.  


 
==Beschreibung==
=Beschreibung=


Es existieren verschiedene Verbundoperatoren:
Es existieren verschiedene Verbundoperatoren:
Zeile 18: Zeile 17:
*Self Join
*Self Join


 
=== Cross Join ===
 
== Cross Join ==
Der Cross Join (auch als Kartesisches Produkt oder Kreuzprodukt bezeichnet)verbindet jede Zeile der ersten Tabelle mit jeder Zeile der Zweiten Tabelle. Die Ergebnistabelle eines Cross Joins kann sehr groß werden und ist häufig nutzlos.  
Der Cross Join (auch als Kartesisches Produkt oder Kreuzprodukt bezeichnet)verbindet jede Zeile der ersten Tabelle mit jeder Zeile der Zweiten Tabelle. Die Ergebnistabelle eines Cross Joins kann sehr groß werden und ist häufig nutzlos.  


  SELECT * FROM TabelleA CROSS JOIN TabelleB
  SELECT * FROM TabelleA CROSS JOIN TabelleB


== Inner Join ==
=== Inner Join ===
Der Inner Join verbindet Datensätze aus zwei Tabellen, welche in beiden Tabellen denselben Werte enthalten. Die Spalten die in beiden Tabellen verglichen werden sollen, muß explizit angegeben werden.
Der Inner Join verbindet Datensätze aus zwei Tabellen, welche in beiden Tabellen denselben Werte enthalten. Die Spalten die in beiden Tabellen verglichen werden sollen, muß explizit angegeben werden.


  SELECT * FROM TabelleA INNER JOIN TabelleB ON TabelleA.Index = TabelleB.Index
  SELECT * FROM TabelleA INNER JOIN TabelleB ON TabelleA.Index = TabelleB.Index


== Natural Join ==
=== Natural Join ===
Der Natural Join verknüpft die beiden Tabellen über die gleichheit der Felder, in Spalten mit gleichem Namen.
Der Natural Join verknüpft die beiden Tabellen über die gleichheit der Felder, in Spalten mit gleichem Namen.
Spalten mit gleichem Namen werden im Ergebnis nur einmal angezeigt. Haben die Tabellen keine Spalten mit gleichem Namen, wird der Natural Join automatisch zum Cross Join.
Spalten mit gleichem Namen werden im Ergebnis nur einmal angezeigt. Haben die Tabellen keine Spalten mit gleichem Namen, wird der Natural Join automatisch zum Cross Join.
Zeile 36: Zeile 33:
  SELECT * FROM TabelleA NATURAL JOIN TabelleB
  SELECT * FROM TabelleA NATURAL JOIN TabelleB


== Left Join ==
=== Left Join ===
Der Left Join (auch Left  Outer Join genannt) erstellt eine so genannte linke Inklusionsverknüpfung. Diese schließt alle Datensätze aus der ersten (linken) Tabelle ein, auch wenn keine entsprechenden Werte für die Datensätze in der zweiten (rechten) Tabelle existieren. Die zu vergleichenden Spalten müssen explizit Angegeben werden.
Der Left Join (auch Left  Outer Join genannt) erstellt eine so genannte linke Inklusionsverknüpfung. Diese schließt alle Datensätze aus der ersten (linken) Tabelle ein, auch wenn keine entsprechenden Werte für die Datensätze in der zweiten (rechten) Tabelle existieren. Die zu vergleichenden Spalten müssen explizit Angegeben werden.


  SELECT * FROM TabelleA LEFT JOIN TabelleB ON TabelleA.Index = TabelleB.Index
  SELECT * FROM TabelleA LEFT JOIN TabelleB ON TabelleA.Index = TabelleB.Index


== Right Join ==
=== Right Join ===
Der Right Join (auch Right Outer Join genannt) erstellt eine so genannte rechte Inklusionsverknüpfung. Diese schließt alle Datensätze aus der zweiten (rechten) Tabelle ein, auch wenn keine entsprechenden Werte für die Datensätze in der ersten (linken) Tabelle existieren. Die zu vergleichenden Spalten müssen explizit Angegeben werden.
Der Right Join (auch Right Outer Join genannt) erstellt eine so genannte rechte Inklusionsverknüpfung. Diese schließt alle Datensätze aus der zweiten (rechten) Tabelle ein, auch wenn keine entsprechenden Werte für die Datensätze in der ersten (linken) Tabelle existieren. Die zu vergleichenden Spalten müssen explizit Angegeben werden.


  SELECT * FROM TabelleA RIGHT JOIN TabelleB ON TabelleA.Index = TabelleB.Index
  SELECT * FROM TabelleA RIGHT JOIN TabelleB ON TabelleA.Index = TabelleB.Index


== Full Join ==
=== Full Join ===
Der Full Join (auch  Full Outer Join genannt) ist eine Kombination von Left Join und Right Join. Die zu vergleichenden Spalten müssen explizit Angegeben werden.
Der Full Join (auch  Full Outer Join genannt) ist eine Kombination von Left Join und Right Join. Die zu vergleichenden Spalten müssen explizit Angegeben werden.


  SELECT * FROM TabelleA FULL JOIN TabelleB ON TabelleA.Index = Tabelle.Index
  SELECT * FROM TabelleA FULL JOIN TabelleB ON TabelleA.Index = Tabelle.Index


==Union Join==
===Union Join===
Der Union Join nimmt die Datensätze beider Tabellen auf und gibt sie in einer Tabelle aus.
Der Union Join nimmt die Datensätze beider Tabellen auf und gibt sie in einer Tabelle aus.
Der Union Join steht nicht immer zur Verfügung, da er zum SQL 92 Intermediate Level gehört.  
Der Union Join steht nicht immer zur Verfügung, da er zum SQL 92 Intermediate Level gehört.  
Zeile 58: Zeile 55:
  SELECT * FROM TabelleA UNION JOIN TabelleB
  SELECT * FROM TabelleA UNION JOIN TabelleB


==Theta Join==
===Theta Join===
Der Theta Join ist eine Verallgemeinerung des Inner Join. Beim Inner Join wird die Gleichheit des Inhalts zweier Attribute verglichen und beim Theta Join wird der Inhalt der Attribute x und y mit einer beliebigen Formel, zum Beispiel "<", "<=", ">", ">=", "<>" verglichen.
Der Theta Join ist eine Verallgemeinerung des Inner Join. Beim Inner Join wird die Gleichheit des Inhalts zweier Attribute verglichen und beim Theta Join wird der Inhalt der Attribute x und y mit einer beliebigen Formel, zum Beispiel "<", "<=", ">", ">=", "<>" verglichen.
  SELECT * FROM TabelleA INNER JOIN TabelleB ON TabelleA.x <= TabelleB.y
  SELECT * FROM TabelleA INNER JOIN TabelleB ON TabelleA.x <= TabelleB.y


==Self Join==
===Self Join===
Der Self Join dient dazu, um in bestimmten Situationen einen Verbund innerhalb einer einzigen Tabelle bilden zu können. Dazu muss man der Tabelle zwei verschiedene Aliasnamen geben. Self Joins können mit allen Joins durchgeführt werden. Ein Beispiel für den Gebrauch eines Self Joins ist zum Beispiel ein Vergleich innerhalb einer Tabelle.  
Der Self Join dient dazu, um in bestimmten Situationen einen Verbund innerhalb einer einzigen Tabelle bilden zu können. Dazu muss man der Tabelle zwei verschiedene Aliasnamen geben. Self Joins können mit allen Joins durchgeführt werden. Ein Beispiel für den Gebrauch eines Self Joins ist zum Beispiel ein Vergleich innerhalb einer Tabelle.  


=Beispiele=
==Beispiele==
==Cross Join==
===Cross Join===
  SELECT * FROM TabelleA CROSS JOIN TabelleB
  SELECT * FROM TabelleA CROSS JOIN TabelleB


Zeile 81: Zeile 78:
                                                         3          Anne          5        08.11.2001
                                                         3          Anne          5        08.11.2001


== Inner Join ==
=== Inner Join ===
  SELECT * FROM TabelleA INNER JOIN TabelleB ON TabelleA.Index = TabelleB.Liste
  SELECT * FROM TabelleA INNER JOIN TabelleB ON TabelleA.Index = TabelleB.Liste


Zeile 91: Zeile 88:
                                                          
                                                          
                                                          
                                                          
== Natural Join ==
=== Natural Join ===
  SELECT * FROM TabelleA NATURAL JOIN TabelleB
  SELECT * FROM TabelleA NATURAL JOIN TabelleB


Zeile 100: Zeile 97:
     3      Anne          5    08.11.2001
     3      Anne          5    08.11.2001


== Left Join ==
=== Left Join ===
  SELECT * FROM TabelleA LEFT JOIN TabelleB ON TabelleA.Index = TabelleB.Index
  SELECT * FROM TabelleA LEFT JOIN TabelleB ON TabelleA.Index = TabelleB.Index


Zeile 109: Zeile 106:
     3      Anne          5    08.11.2001              3          Anne        NULL          NULL
     3      Anne          5    08.11.2001              3          Anne        NULL          NULL


== Right Join ==
=== Right Join ===
  SELECT * FROM TabelleA RIGHT JOIN TabelleB ON TabelleA.Index = TabelleB.Index
  SELECT * FROM TabelleA RIGHT JOIN TabelleB ON TabelleA.Index = TabelleB.Index


Zeile 118: Zeile 115:
     3      Anne          5    08.11.2001              NULL        NULL          5        08.11.2001
     3      Anne          5    08.11.2001              NULL        NULL          5        08.11.2001


== Full Join ==
=== Full Join ===
  SELECT * FROM TabelleA FULL JOIN TabelleB ON TabelleA.Index = Tabelle.Index
  SELECT * FROM TabelleA FULL JOIN TabelleB ON TabelleA.Index = Tabelle.Index


Zeile 127: Zeile 124:
     3      Anne          5    08.11.2001              3          Anne        NULL          NULL
     3      Anne          5    08.11.2001              3          Anne        NULL          NULL
                                                         NULL        NULL          5        08.11.2001
                                                         NULL        NULL          5        08.11.2001
== Union Join ==
=== Union Join ===
  SELECT * FROM Mitarbeiter UNION JOIN Projekte
  SELECT * FROM Mitarbeiter UNION JOIN Projekte


Zeile 139: Zeile 136:
                                                         NULL        NULL          5        08.11.2001
                                                         NULL        NULL          5        08.11.2001


== Theta Join ==  
=== Theta Join ===  
Sie haben eine Tabelle mit Mannschaften und möchten diese im Weltmeisterschaftsmodus (Für Hin- und Rückspiel müssen Sie einfach den Operator "<>" verwenden) gegeneinander antreten lassen:
Sie haben eine Tabelle mit Mannschaften und möchten diese im Weltmeisterschaftsmodus (Für Hin- und Rückspiel müssen Sie einfach den Operator "<>" verwenden) gegeneinander antreten lassen:
  SELECT x.Team AS Heim, y.Team AS Gast FROM Mannschaften AS x INNER JOIN Mannschaften AS y ON h.m_id > g.m_id
  SELECT x.Team AS Heim, y.Team AS Gast FROM Mannschaften AS x INNER JOIN Mannschaften AS y ON h.m_id > g.m_id
Zeile 151: Zeile 148:
                                                         Italien      Spanien           
                                                         Italien      Spanien           
                                                         Italien      Holland           
                                                         Italien      Holland           
== Self Join ==  
=== Self Join == =
Sie haben eine Tabelle mit Namen, Personalnummer und der Personalnummer des Vorgesetzten. Es soll zu jedem Mitarbeiter der Name des Vorgesetzten ermittelt werden:  
Sie haben eine Tabelle mit Namen, Personalnummer und der Personalnummer des Vorgesetzten. Es soll zu jedem Mitarbeiter der Name des Vorgesetzten ermittelt werden:  
  SELECT x.Name, x.Personalnummer, y.Name "Chef" FROM Mitarbeiter x, Mitarbeiter y WHERE x.ChefsPersonalnummer = y.Personalnummer   
  SELECT x.Name, x.Personalnummer, y.Name "Chef" FROM Mitarbeiter x, Mitarbeiter y WHERE x.ChefsPersonalnummer = y.Personalnummer   
Zeile 161: Zeile 158:
         3          Kuenstler    1                      Kuenstler          3            Maier           
         3          Kuenstler    1                      Kuenstler          3            Maier           
                                          
                                          
=Quellen=
==Quellen==
*http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/chap7.htm
*http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/chap7.htm
*http://www.thomaskaelin.ch/media/archive1/zusammenfassungen/db1.pdf
*http://www.thomaskaelin.ch/media/archive1/zusammenfassungen/db1.pdf
Zeile 168: Zeile 165:
*http://aktuell.de.selfhtml.org/artikel/datenbanken/
*http://aktuell.de.selfhtml.org/artikel/datenbanken/
* http://rowa.giso.de/oracle/latex/Komplexere_SQL_Abfragen.html
* http://rowa.giso.de/oracle/latex/Komplexere_SQL_Abfragen.html


[[Kategorie:Glossar]]
[[Kategorie:Glossar]]
[[Kategorie:SQL]]
[[Kategorie:SQL]]

Version vom 16. Mai 2018, 11:10 Uhr

Definition

Verbundoperatoren (auch Joins genannt) verbinden die Spalten zweier Tabellen zu einer Tabelle.

Beschreibung

Es existieren verschiedene Verbundoperatoren:

  • Cross Join
  • Inner Join, Equivalent Join
  • Natural Join
  • Left Join, Left Outer Join
  • Right Outer Join, Right Join
  • Full Outer Join, Full Join
  • Union Join
  • Theta Join
  • Self Join

Cross Join

Der Cross Join (auch als Kartesisches Produkt oder Kreuzprodukt bezeichnet)verbindet jede Zeile der ersten Tabelle mit jeder Zeile der Zweiten Tabelle. Die Ergebnistabelle eines Cross Joins kann sehr groß werden und ist häufig nutzlos.

SELECT * FROM TabelleA CROSS JOIN TabelleB

Inner Join

Der Inner Join verbindet Datensätze aus zwei Tabellen, welche in beiden Tabellen denselben Werte enthalten. Die Spalten die in beiden Tabellen verglichen werden sollen, muß explizit angegeben werden.

SELECT * FROM TabelleA INNER JOIN TabelleB ON TabelleA.Index = TabelleB.Index

Natural Join

Der Natural Join verknüpft die beiden Tabellen über die gleichheit der Felder, in Spalten mit gleichem Namen. Spalten mit gleichem Namen werden im Ergebnis nur einmal angezeigt. Haben die Tabellen keine Spalten mit gleichem Namen, wird der Natural Join automatisch zum Cross Join.

SELECT * FROM TabelleA NATURAL JOIN TabelleB

Left Join

Der Left Join (auch Left Outer Join genannt) erstellt eine so genannte linke Inklusionsverknüpfung. Diese schließt alle Datensätze aus der ersten (linken) Tabelle ein, auch wenn keine entsprechenden Werte für die Datensätze in der zweiten (rechten) Tabelle existieren. Die zu vergleichenden Spalten müssen explizit Angegeben werden.

SELECT * FROM TabelleA LEFT JOIN TabelleB ON TabelleA.Index = TabelleB.Index

Right Join

Der Right Join (auch Right Outer Join genannt) erstellt eine so genannte rechte Inklusionsverknüpfung. Diese schließt alle Datensätze aus der zweiten (rechten) Tabelle ein, auch wenn keine entsprechenden Werte für die Datensätze in der ersten (linken) Tabelle existieren. Die zu vergleichenden Spalten müssen explizit Angegeben werden.

SELECT * FROM TabelleA RIGHT JOIN TabelleB ON TabelleA.Index = TabelleB.Index

Full Join

Der Full Join (auch Full Outer Join genannt) ist eine Kombination von Left Join und Right Join. Die zu vergleichenden Spalten müssen explizit Angegeben werden.

SELECT * FROM TabelleA FULL JOIN TabelleB ON TabelleA.Index = Tabelle.Index

Union Join

Der Union Join nimmt die Datensätze beider Tabellen auf und gibt sie in einer Tabelle aus. Der Union Join steht nicht immer zur Verfügung, da er zum SQL 92 Intermediate Level gehört. In PostgreSQL steht der Union Join nicht zur Verfügung.

SELECT * FROM TabelleA UNION JOIN TabelleB

Theta Join

Der Theta Join ist eine Verallgemeinerung des Inner Join. Beim Inner Join wird die Gleichheit des Inhalts zweier Attribute verglichen und beim Theta Join wird der Inhalt der Attribute x und y mit einer beliebigen Formel, zum Beispiel "<", "<=", ">", ">=", "<>" verglichen.

SELECT * FROM TabelleA INNER JOIN TabelleB ON TabelleA.x <= TabelleB.y

Self Join

Der Self Join dient dazu, um in bestimmten Situationen einen Verbund innerhalb einer einzigen Tabelle bilden zu können. Dazu muss man der Tabelle zwei verschiedene Aliasnamen geben. Self Joins können mit allen Joins durchgeführt werden. Ein Beispiel für den Gebrauch eines Self Joins ist zum Beispiel ein Vergleich innerhalb einer Tabelle.

Beispiele

Cross Join

SELECT * FROM TabelleA CROSS JOIN TabelleB
     TabelleA             TabelleB                                    Ergebnis
  Index | Name         Index | Geb.Datum          TabelleA.Index |  Name | TabelleB.Index | Geb.Datum
   1      Jan            1     16.05.1976               1           Jan           1         16.05.1976
   2      Tom            2     29.07.1985               1           Jan           2         29.07.1985
   3      Anne           5     08.11.2001               1           Jan           5         08.11.2001
                                                        2           Tom           1         16.05.1976
                                                        2           Tom           2         29.07.1985
                                                        2           Tom           5         08.11.2001
                                                        3           Anne          1         16.05.1976
                                                        3           Anne          2         29.07.1985
                                                        3           Anne          5         08.11.2001

Inner Join

SELECT * FROM TabelleA INNER JOIN TabelleB ON TabelleA.Index = TabelleB.Liste
      TabelleA             TabelleB                                    Ergebnis
  Index | Name         Index | Geb.Datum          TabelleA.Index |  Name | TabelleB.Index | Geb.Datum
   1      Jan            1     16.05.1976               1           Jan           1         16.05.1976
   2      Tom            2     29.07.1985               2           Tom           2         29.07.1985
   3      Anne           5     08.11.2001               
                                                        
                                                        

Natural Join

SELECT * FROM TabelleA NATURAL JOIN TabelleB
      TabelleA             TabelleB                       Ergebnis
  Index | Name         Index | Geb.Datum           Index |  Name |  Geb.Datum
   1      Jan            1     16.05.1976            1      Jan     16.05.1976
   2      Tom            2     29.07.1985            2      Tom     29.07.1985
   3      Anne           5     08.11.2001

Left Join

SELECT * FROM TabelleA LEFT JOIN TabelleB ON TabelleA.Index = TabelleB.Index
      TabelleA             TabelleB                                    Ergebnis
  Index | Name         Index | Geb.Datum          TabelleA.Index |  Name | TabelleB.Index | Geb.Datum
   1      Jan            1     16.05.1976               1           Jan           1         16.05.1976
   2      Tom            2     29.07.1985               2           Tom           2         29.07.1985
   3      Anne           5     08.11.2001               3           Anne         NULL          NULL

Right Join

SELECT * FROM TabelleA RIGHT JOIN TabelleB ON TabelleA.Index = TabelleB.Index
      TabelleA             TabelleB                                    Ergebnis
  Index | Name         Index | Geb.Datum          TabelleA.Index |  Name | TabelleB.Index | Geb.Datum
   1      Jan            1     16.05.1976               1           Jan           1         16.05.1976
   2      Tom            2     29.07.1985               2           Tom           2         29.07.1985
   3      Anne           5     08.11.2001              NULL         NULL          5         08.11.2001

Full Join

SELECT * FROM TabelleA FULL JOIN TabelleB ON TabelleA.Index = Tabelle.Index
      TabelleA             TabelleB                                    Ergebnis
  Index | Name         Index | Geb.Datum          TabelleA.Index |  Name | TabelleB.Index | Geb.Datum
   1      Jan            1     16.05.1976               1           Jan           1         16.05.1976
   2      Tom            2     29.07.1985               2           Tom           2         29.07.1985
   3      Anne           5     08.11.2001               3           Anne         NULL          NULL
                                                       NULL         NULL          5         08.11.2001

Union Join

SELECT * FROM Mitarbeiter UNION JOIN Projekte
      TabelleA             TabelleB                                    Ergebnis
  Index | Name         Index | Geb.Datum          TabelleA.Index |  Name | TabelleB.Index | Geb.Datum
   1      Jan            1     16.05.1976               1           Jan          NULL          NULL
   2      Tom            2     29.07.1985               2           Tom          NULL          NULL
   3      Anne           5     08.11.2001               3           Anne         NULL          NULL
                                                       NULL         NULL          1         16.05.1976
                                                       NULL         NULL          2         29.07.1985
                                                       NULL         NULL          5         08.11.2001

Theta Join

Sie haben eine Tabelle mit Mannschaften und möchten diese im Weltmeisterschaftsmodus (Für Hin- und Rückspiel müssen Sie einfach den Operator "<>" verwenden) gegeneinander antreten lassen:

SELECT x.Team AS Heim, y.Team AS Gast FROM Mannschaften AS x INNER JOIN Mannschaften AS y ON h.m_id > g.m_id
     Mannschaften                                            Ergebnis
  m_id  | Team                                          Heim    |    Gast
   1      Deutschland                                   Spanien      Deutschland                  
   2      Spanien                                       Holland      Deutschland          
   3      Holland                                       Italien      Deutschland               
   4      Italien                                       Holland      Spanien          
                                                        Italien      Spanien          
                                                        Italien      Holland          

== Self Join ==

Sie haben eine Tabelle mit Namen, Personalnummer und der Personalnummer des Vorgesetzten. Es soll zu jedem Mitarbeiter der Name des Vorgesetzten ermittelt werden:

SELECT x.Name, x.Personalnummer, y.Name "Chef" FROM Mitarbeiter x, Mitarbeiter y WHERE x.ChefsPersonalnummer = y.Personalnummer  
              Mitarbeiter                                              Ergebnis
  Personalnummer  | Name |  ChefsPersonalnummer         Name    |    Personalnummer   |   Chef
        1          Maier         2                      Maier              1             Mueller
        2          Mueller       3                      Mueller            2             Kuenstler       
        3          Kuenstler     1                      Kuenstler          3             Maier          
                                       

Quellen