Komplexe SQL-Abfragen
Transcrição
Komplexe SQL-Abfragen
SQL Lutz Kleinostendarp JOBELMANN-SCHULE Komplexe Abfragen Komplexe Abfragen verknüpfen mehrere Tabellen miteinander. Voraussetzung für das Verständnis ist die Beherrschung einfacher SELECT-Abfragen SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Die Möglichkeit, Tabellen zu verknüpfen, ist eine grundlegende Eigenschaft relationaler Datenbanken. Die Verknüpfungen (Joins) stellen dabei das Äquivalent der Beziehungen im EntityRelationship-Modell dar. Joins werden daher in den meisten Fällen zwischen dem Primärschlüssel der einen und dem zugehörigen Fremdschlüssel der anderen Tabelle hergestellt. Es ist allerdings auch möglich, eine Tabelle mit sich selbst zu verknüpfen. Kartesisches Produkt Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join 2 27.11.2007 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Auch der Mengenoperator UNION verknüpft zwei Tabellen. Er unterscheidet sich aber in zweierlei Hinsicht von den Joins: 1. UNION verknüpft zwei Abfragen, d.h. er bildet die Gesamtmenge aus zwei SELECTAnweisungen. Joins stellen eine Verknüpfung zwischen zwei Tabellen her und führen darauf die SELECT-Anweisung durch. Î UNION verbindet Reihen. Joins verknüpfen Spalten. Kartesisches Produkt Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join 2. 27.11.2007 3 1 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Das Kartesische Produkt Im Kartesischen Produkt wird jede Reihe (Datensatz) der einen Tabelle mit jeder Reihe der anderen Tabelle verknüpft. Die Ergebnismenge entspricht damit dem Produkt aus Datensatzmenge der einen Tabelle und Datensatzmenge der anderen Tabelle. Enthält also die eine Tabelle 7 Datensätze und die andere Tabelle 3 Datensätze, so besteht das Kartesische Produkt aus 7 * 3 = 21 Datensätzen. Kartesisches Produkt Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join 4 27.11.2007 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Kartesisches Produkt Beispiel: SELECT * FROM mitarbeiter, abteilung Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join 5 27.11.2007 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE An diesem Beispiel wird deutlich, dass das Kartesische Produkt in der Praxis nur selten sinnvolle Ergebnisse liefern wird. Das Kartesische Produkt stellt somit eine Vorstufe zur Auswahl zusammengehöriger Datensätze dar. Wir sprechen auch dann noch von einem Kartesischen Produkt, wenn mit Hilfe bestimmter Kriterien eine Auswahl aus einer Tabelle getroffen wird. Kartesisches Produkt Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join 27.11.2007 6 2 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Kartesisches Produkt Equijoin Beispiel: SELECT * FROM arbeiten, projekt WHERE arbeiten.pr_nr = ´p3´ Natürlicher Join Thetajoin Outer Join Left Join Right Join 7 27.11.2007 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Kartesisches Produkt Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join Das Kartesische Produkt enthält meist auch doppelte Datenwerte ( in unseren Beispielen mitarbeiter.abt_nr und abteilung.abt_nr bzw. arbeiten.pr_nr und projekt.pr_nr). In diesen Fällen wird (und muss) zur eindeutigen Kennzeichnung des Spaltennamens der Tabellenname dem Spaltennamen getrennt durch einen Punkt vorangestellt. mitarbeiter.abt_nr arbeiten.pr_nr abteilung.abt_nr projekt.pr_nr 8 27.11.2007 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Kartesisches Produkt Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join 27.11.2007 Der Equijoin bereinigt das Kartesische Produkt von allen „sinnlosen“ Zeilen. Während das Katesische Produkt alle möglichen Verknüpfungen darstellt, zeigt der Equijoin nur die unter einer bestimmten Fragestellung tatsächlich vorhandenen Verknüpfungen an. Es werden aber weiterhin alle Spalten der Ursprungstabelle angezeigt. Beispiel: Zeige für jeden Mitarbeiter die persönlichen Daten und die Daten der Abteilung an, in der er arbeitet. 9 3 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Kartesisches Produkt Kartesisches Produkt: SELECT * FROM mitarbeiter, abteilung Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join 10 27.11.2007 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Kartesisches Produkt Equijoin Equijoin: SELECT * FROM mitarbeiter, abteilung WHERE mitarbeiter.abt_nr = abteilung.abt_nr Natürlicher Join Thetajoin Outer Join Left Join Right Join •Doppelte Spalten!! 11 27.11.2007 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Entfernt man nun noch die doppelten Spalten, so erhält man den Natürlichen Join: SELECT mitarbeiter.*, abt_name, stadt FROM mitarbeiter, abteilung WHERE mitarbeiter.abt_nr = abteilung.abt_nr Kartesisches Produkt Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join 27.11.2007 12 4 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Bisher wurde der JOIN indirekt durch einen Vergleich zweier Attribute dargestellt. Die Art des JOIN bzw. sein Vorhandensein musste also aus dem Kontext erkannt werden. Der SQL92-Standard hat nun die Möglichkeit geschaffen, den JOIN explizit anzugeben. Beispiel in herkömmlicher Schreibweise: SELECT mitarbeiter.*, abt_name, stadt FROM mitarbeiter, abteilung WHERE mitarbeiter.abt_nr = abteilung.abt_nr; Beispiel in expliziter Schreibweise: SELECT mitarbeiter.*, abt_name, stadt FROM mitarbeiter JOIN abteilung ON mitarbeiter.abt_nr = abteilung.abt_nr; Kartesisches Produkt Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join 13 27.11.2007 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Kartesisches Produkt Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join Als Thetajoin bezeichnet man ganz allgemein eine Abfrage, in der die korrespondierenden Attribute zweier Tabellen in der WHERE-Klausel mit einem Vergleichsoperator (Θ) verglichen werden. Da auch das Gleichheitszeichen dazu gehört, ist jeder Equijoin (Natürliche Join) auch ein Thetajoin. Beispiel: Finde die Mitarbeiter, die nicht am Arbeitsort wohnen. SELECT mit_erweiter.*, abt_name, stadt FROM mit_erweiter, abteilung WHERE wohnort <> stadt Oder SELECT mit_erweiter.*, abt_name, stadt FROM mit_erweiter JOIN abteilung ON wohnort <> stadt 14 27.11.2007 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen Kartesisches Produkt Equijoin JOBELMANN-SCHULE SELECT mit_erweiter.*, abt_name, stadt FROM mit_erweiter, abteilung WHERE wohnort <> stadt AND mit_erweiter.abt_nr = abteilung.abt_nr Natürlicher Join Thetajoin Outer Join Left Join Right Join 27.11.2007 15 5 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Alle bisher dargestellten Verknüpfungen von Tabellen können auch über mehr als zwei Tabellen ausgeweitet werden. Dabei sind die jeweils korrespondierenden Attribute der Tabellen als zusätzliche Bedingung mit aufzunehmen. Es ist auch möglich, eine Tabelle mit sich selbst zu verknüpfen. Dabei müssen zur Unterscheidung der beiden Instanzen der Tabelle Alias-Namen vergeben werden. Beispiele finden sich bei Herdt: SQL, S. 86f Kartesisches Produkt Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join 16 27.11.2007 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Bei mehr als zwei Tabellen ist in der expliziten Schreibweise auf die Reihenfolge der Tabellen zu achten, da das Schlüsselwort JOIN immer zwischen den verknüpften Tabellen stehen muss. SELECT m_name, m_vorname FROM arbeiten JOIN mitarbeiter ON arbeiten.m_nr = mitarbeiter.m_nr JOIN abteilung ON mitarbeiter.abt_nr = abteilung.abt_nr; Kartesisches Produkt Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join 17 27.11.2007 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Kartesisches Produkt Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join 27.11.2007 Bei allen bisherigen „Inner Joins“ wurden Reihen (Datensätze) auf Grund des Vergleichs zweier Spalten ausgewählt. Datensätze, die die Bedingung nicht erfüllten, wurden also nicht Teil der Ergebnismenge. Manchmal ist es aber notwendig, eine Tabelle vollständig aufzunehmen. Ist die Bedingung nicht erfüllt, bleiben die Attribute der anderen Tabelle dann leer (NULL). Eine solche Auswahl nennt man Outer Join. Beispiel: Es sollen in einem Haushaltsprogramm alle zugewiesenen Summen dargestellt werden, auch wenn zu dieser Zuweisung noch keine Ausgaben erfolgt sind. Ansonsten sollen die Ausgaben der Zuweisung gegenüber gestellt werden. 18 6 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE In einem Outer Join wird immer eine Tabelle vollständig angezeigt. Von der anderen Tabelle sind nur die Datensätze Teil der Ergebnismenge, die die Auswahlkriterien erfüllen. Je nachdem, ob nun die linke oder die rechte Tabelle des Bedingungsvergleichs vollständig dargestellt werden soll, spricht man von einem linken Outer Join (kurz: Left Join) oder einem rechten Outer Join (kurz: Right Join). Kartesisches Produkt Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join 19 27.11.2007 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Die Syntax von Left Join lautet wie folgt: Standard-SQL: SELECT {Attributliste} FROM {Tabellenliste} WHERE Tabelle1.attribut *= Tabelle2.attribut; ACCESS-SQL: SELECT {Attributliste} FROM Tabelle1 LEFT JOIN Tabelle2 ON Tabelle1.attribut = Tabelle2.attribut; Kartesisches Produkt Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join Korrelierte Unterabfragen Exists 20 27.11.2007 SQL-Komplexe Abfragen Lutz Kleinostendarp Grundlagen JOBELMANN-SCHULE Die Syntax von Right Join lautet entsprechend: Standard-SQL: SELECT {Attributliste} FROM {Tabellenliste} WHERE Tabelle1.attribut =* Tabelle2.attribut; ACCESS-SQL: SELECT {Attributliste} FROM Tabelle1 RIGHT JOIN Tabelle2 ON Tabelle1.attribut = Tabelle2.attribut; Kartesisches Produkt Equijoin Natürlicher Join Thetajoin Outer Join Left Join Right Join 27.11.2007 21 7