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