Syntax einer Join-Operation: join-op := CROSS JOIN | [NATURAL] {LEFT | RIGHT | FULL} [OUTER] JOIN | [NATURAL] [INNER] JOIN | UNION JOIN SS 2001 AIFB SQL-92 bietet Operatoren zur direkten Darstellung von Joins an. Es können sowohl mit SELECT hergeleitete Tabellen in der Form: (SELECT … FROM … WHERE …) join-op (SELECT … FROM … WHERE …) [join-spec]; als auch Basis-Tabellen in der Form: SELECT … FROM table join-op table [join-spec] WHERE … miteinander verbunden werden. (1/9) SQL - Structured Query Language 2.3.7 Join-Operationen in SQL-92 1 2.3.7 Join-Operationen in SQL-92 (2/9) Kartesisches Produkt: table1 CROSS JOIN table2 Wenn nicht alle Attribute mit gleichem Namen in die Join-Bedingung eingehen sollen, kann dies mit join-spec := USING (column-list) auf die angegebenen Attribute eingeschränkt werden. AIFB Natural Join: Die Verwendung des Schlüsselworts NATURAL führt zur Berechnung des Natural Join. SQL - Structured Query Language SELECT * FROM table1, table2 SS 2001 berechnet das Kartesische Produkt und entspricht 2 2.3.7 Join-Operationen in SQL-92 (3/9) Theta-Join: Outer-Join: Sämtliche Variationen des Outer-Join (FULL, LEFT, RIGHT) können formuliert werden. Dabei kann entweder ein – Natural-Join (NATURAL, opt. USING-Klausel) oder ein – Theta-Join (ON-Klausel) durchgeführt werden. Das Schlüsselwort OUTER ist optional, sollte aber aus Gründen der Leserlichkeit benutzt werden. AIFB angegeben wird (predicate entspricht der Klausel, die nach WHERE in einer SELECT-Anfrage angegeben werden kann) SQL - Structured Query Language join-spec := ON predicate SS 2001 Ein Theta-Join wird mit INNER JOIN (oder nur JOIN) durchgeführt, wobei die Join-Bedingung mit 3 2.3.7 Join-Operationen in SQL-92 (4/9) Union-Join: Der Union-Join kann mit Hilfe des Schlüsselworts Die Join-Operationen in SQL-92 können zwar auch mit früheren SQLVersionen formuliert werden, allerdings z.T. nur sehr umständlich. Die neuen Schlüsselworte dienen der verbesserten Lesbarkeit; insbesondere die WHERE-Klausel wird dadurch von Join-Bedingungen entlastet. AIFB Bemerkung: SQL - Structured Query Language durchgeführt werden. SS 2001 UNION JOIN 4 2.3.7 Join-Operationen in SQL-92 (5/9) Beispiel 2-3 (Umformulierung der Bsp. 22-26) In SQL-92: SELECT P-NR, NAME FROM angestellte NATURAL JOIN ang-pro; AIFB SQL - Structured Query Language SELECT P-NR, a.ANG-NR, NAME, WOHNORT, ABT-NR, PROZ-ARBZEIT FROM angestellte a, ang-pro ap WHERE a.ANG-NR=ap.ANG-NR; SS 2001 27. (Beispiel 22, S.41, „Natural Join“) „Alle Projekt mit den Informationen der zugehörigen Angestellten.“ 5 2.3.7 Join-Operationen in SQL-92 (6/9) Beispiel 2-3 (Umformulierung der Bsp. 22-26) oder SELECT P-NR, NAME FROM angestellte INNER JOIN ang-pro ON (angestellte.ANG-NR=ang-pro.ANG-NR AND PROZ-ARBZEIT=50); AIFB In SQL-92: SELECT P-NR, NAME FROM angestellte NATURAL JOIN ang-pro WHERE PROZ-ARBZEIT = 50; SQL - Structured Query Language SELECT P-NR, NAME FROM angestellte a, ang-pro ap WHERE a.ANG-NR=ap.ANG-NR AND PROZ-ARBZEIT=50; SS 2001 28. (Beispiel 23, S.41, Join mit Auswahlbedingung) „Alle Projekt-Nummern mit den Namen derjenigen Angestellten, die zu 50% mitarbeiten.“ 6 2.3.7 Join-Operationen in SQL-92 (7/9) In SQL-92: SELECT P-NR, NAME FROM angestellte JOIN projekt ON (ANG-NR <> P-LEITER); AIFB SELECT P-NR, NAME FROM angestellte, projekt WHERE ANG-NR <> P-LEITER; SQL - Structured Query Language 29. (Beispiel 24, S.42, allgemein -Join) „Gib für jedes Projekt die Projektnummer und die Namen aller Angestellten an, die dort nicht Projektleiter sind.“ (Angestellter muß nicht an Projekt mitarbeiten) SS 2001 Beispiel 2-3 (Umformulierung der Bsp. 22-26) 7 2.3.7 Join-Operationen in SQL-92 (8/9) In SQL-92: SELECT NAME, P-FILIALE FROM angestellte NATURAL JOIN ang-pro NATURAL JOIN projekt; AIFB SELECT NAME, P-FILIALE FROM angestellte a, ang-pro ap, projekt p WHERE a.ANG-NR=ap.ANG-NR AND ap.P-NR=p.P-NR; SQL - Structured Query Language 30. (Beispiel 25, S.42, Join mit 3 Relationen) „Gib für jeden Angestellten seinen Namen, sowie die Projekt-Filialen der Projekte an, an denen er mitarbeitet.“ SS 2001 Beispiel 2-3 (Umformulierung der Bsp. 22-26) 8 2.3.7 Join-Operationen in SQL-92 (9/9) In SQL-92 SELECT a.NAME, b.NAME FROM (angestellte a) NATURAL JOIN (angestellte b) USING (WOHNORT) WHERE a.NAME < b.NAME; AIFB SELECT a.NAME A-NAME, b.NAME B-BNAME FROM angestellte a, angestellte b WHERE a.WOHNORT=b.WOHNORT AND a.NAME<b.NAME; SQL - Structured Query Language 31. (Beispiel 26, S.43, Join mit derselben Relation) „Suche Paare von (unterschiedlichen) Angestellten, die in der selben Stadt wohnen.“ (Das Ergebnis sollte keine redundanten Angaben enthalten) SS 2001 Beispiel 2-3 (Umformulierung der Bsp. 22-26) 9