Verbundoperatoren (Join): Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Kowa (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| (12 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
=Definition= | {{Qualität | ||
|correctness = 3 | |||
|extent = 3 | |||
|numberOfReferences = 3 | |||
|qualityOfReferences = 3 | |||
|conformance = 3 | |||
}} | |||
==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 15: | Zeile 22: | ||
*Full Outer Join, Full Join | *Full Outer Join, Full Join | ||
*Union Join | *Union Join | ||
*Theta 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. | ||
<source lang="SQL"> | |||
SELECT * | |||
FROM a CROSS JOIN b | |||
</source> | |||
== 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, | 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, müssen explizit angegeben werden. | ||
<source lang="SQL"> | |||
SELECT * | |||
FROM a JOIN b ON a.a1 = b.b1 | |||
</source> | |||
== 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. | ||
SELECT * FROM | <source lang="SQL"> | ||
SELECT * | |||
FROM a NATURAL JOIN b | |||
</source> | |||
=== 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. | |||
<source lang="SQL"> | |||
SELECT * | |||
FROM a LEFT JOIN b ON a.a1 = b.b1 | |||
</source> | |||
=== 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. | |||
<source lang="SQL"> | |||
SELECT * | |||
FROM a RIGHT JOIN b ON a.a1 = b.b1 | |||
</source> | |||
=== 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. | |||
= | <source lang="SQL"> | ||
SELECT * | |||
FROM a FULL JOIN b ON a.a1 = b.b1 | |||
</source> | |||
===Union Join=== | |||
Der UNION JOIN nimmt die Datensätze beider Tabellen auf und gibt sie in einer Tabelle aus. | |||
Dieser Join-Operator steht nicht immer zur Verfügung, da er zum SQL 92 Intermediate Level gehört. | |||
In PostgreSQL gibt es ihn nicht. | |||
= | <source lang="SQL"> | ||
SELECT * | |||
FROM a UNION JOIN b | |||
</source> | |||
ist gleichwertig zu | |||
= | <source lang="SQL"> | ||
SELECT * | |||
FROM a FULL JOIN b | |||
WHERE FALSE | |||
</source> | |||
===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. | |||
= | <source lang="SQL"> | ||
SELECT * | |||
FROM a JOIN b ON a.a1 <= b.b1 | |||
</source> | |||
===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. | |||
=Beispiele= | ==Beispiele== | ||
==Cross Join== | ===Cross Join=== | ||
SELECT * FROM TabelleA CROSS JOIN TabelleB | SELECT * FROM TabelleA CROSS JOIN TabelleB | ||
| Zeile 72: | Zeile 119: | ||
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 82: | Zeile 129: | ||
== Natural Join == | === Natural Join === | ||
SELECT * FROM TabelleA NATURAL JOIN TabelleB | SELECT * FROM TabelleA NATURAL JOIN TabelleB | ||
| Zeile 91: | Zeile 138: | ||
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 100: | Zeile 147: | ||
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 109: | Zeile 156: | ||
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 118: | Zeile 165: | ||
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 130: | Zeile 177: | ||
NULL NULL 5 08.11.2001 | NULL NULL 5 08.11.2001 | ||
=Quellen= | === 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== | |||
*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/ | *http://www.thomaskaelin.ch/modules/files/content/studium/bsc-zf/db1.pdf | ||
*http://www.postgresql.org/docs/8.3/interactive/queries-table-expressions.html | *http://www.postgresql.org/docs/8.3/interactive/queries-table-expressions.html | ||
*http://www.tinohempel.de/info/info/datenbank/operation.htm | *http://www.tinohempel.de/info/info/datenbank/operation.htm | ||
*https://wiki.selfhtml.org/wiki/Datenbank | |||
* http://rowa.giso.de/oracle/latex/Komplexere_SQL_Abfragen.html | |||
[[Kategorie:Glossar]] | [[Kategorie:Glossar]] | ||
[[Kategorie:SQL]] | |||
Aktuelle Version vom 28. Oktober 2022, 08:42 Uhr
Dieser Artikel erfüllt die GlossarWiki-Qualitätsanforderungen nur teilweise:
| Korrektheit: 3 (zu größeren Teilen überprüft) |
Umfang: 3 (einige wichtige Fakten fehlen) |
Quellenangaben: 3 (wichtige Quellen vorhanden) |
Quellenarten: 3 (gut) |
Konformität: 3 (gut) |
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 a CROSS JOIN b
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, müssen explizit angegeben werden.
SELECT *
FROM a JOIN b ON a.a1 = b.b1
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 a NATURAL JOIN b
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 a LEFT JOIN b ON a.a1 = b.b1
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 a RIGHT JOIN b ON a.a1 = b.b1
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 a FULL JOIN b ON a.a1 = b.b1
Union Join
Der UNION JOIN nimmt die Datensätze beider Tabellen auf und gibt sie in einer Tabelle aus. Dieser Join-Operator steht nicht immer zur Verfügung, da er zum SQL 92 Intermediate Level gehört. In PostgreSQL gibt es ihn nicht.
SELECT *
FROM a UNION JOIN b
ist gleichwertig zu
SELECT *
FROM a FULL JOIN b
WHERE FALSE
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 a JOIN b ON a.a1 <= b.b1
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.
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
- http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/chap7.htm
- http://www.thomaskaelin.ch/modules/files/content/studium/bsc-zf/db1.pdf
- http://www.postgresql.org/docs/8.3/interactive/queries-table-expressions.html
- http://www.tinohempel.de/info/info/datenbank/operation.htm
- https://wiki.selfhtml.org/wiki/Datenbank
- http://rowa.giso.de/oracle/latex/Komplexere_SQL_Abfragen.html
