SFW-Block (1) SFW

Werbung
SFW-Block (1)
l Grundgerüst einer SQL-Anfrage: SFW-Block
SELECT
FROM
[WHERE
[GROUP BY
[HAVING
Projektionsliste
Tabellenausdruck
Prädikat]
Attributliste]
Gruppenprädikat]
l Was ist das Ergebnis einer Anfrage in SQL-99?
–
–
–
ü
Tupeltabelle
ü
Objekttabelle
Wert bzw. Kollektion — (In SQL:200n soll dies möglich sein)
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-86
SFW-Block (2)
l SELECT: Was darf in der Projektionsliste stehen?
–
–
–
Attribute (auch abgeleitete, berechnete)
Methodenaufrufe
Unterabfragen
ü
ü
(ü)
Nur skalare Unterabfragen,
die genau einen Wert liefern!
l Beispiel:
SELECT m.Name, 12*m.Einkommen, (SELECT COUNT(*)
FROM Mitarbeiter
WHERE Vorgesetzter = REF(m))
FROM Manager m;
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-87
SFW-Block (3)
l FROM: Welche Tabellenausdrücke sind erlaubt?
–
–
–
–
–
Tupeltabellen
Objekttabellen (auch flache Extensionen)
Kollektionsabgeleitete Tabellen
Methodenaufrufe (die Tabellen liefern)
Unterabfragen (abgeleitete Tabellen)
ü
ü
ü
—
ü
l Beispiele: Kollektionsabgeleitete bzw. mittels Unterabfragen abgeleitete Tabellen
SELECT *
FROM Manager m, UNNEST(m.Leitet) p;
SELECT *
FROM (SELECT * FROM (Tabelle1 UNION Tabelle2) INTERSECT Tabelle3);
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-88
SFW-Block (4)
l WHERE: Welche Prädikate sind erlaubt?
–
–
–
Prädikate über Attribute
Prädikate mit Methodenaufrufen
Prädikate mit Unterabfragen
ü
ü
ü
l Beispiel:
SELECT *
FROM Manager m
WHERE Name LIKE 'T%' AND Einkommen > 50000 AND
3 < (SELECT COUNT(*)
FROM Mitarbeiter
WHERE Vorgesetzter = REF(m));
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-89
Rekursive Anfragen
l Selbstreferenzierende Tabellenausdrücke
l Notwendig, um etwa Erreichbarkeitsfragen zu beantworten bzw. transitive
Hüllen zu berechnen
l Grundgerüst einer rekursiven Anfrage
WITH RECURSIVE RekursiveTabelle AS
(SELECT ... FROM Tabelle WHERE ...
UNION
SELECT ... FROM Tabelle, RekursiveTabelle WHERE ...)
SELECT * FROM RekursiveTabelle;
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-90
Rekursive Anfragen - Beispiel
CREATE TABLE Flug (
Abflug
VARCHAR(30),
Ziel
VARCHAR(30),
Carrier
VARCHAR(30),
Preis
Franken
);
Flug
Abflug
Ziel
Carrier Preis
Frankfurt Sydney
LH 1009
Zürich
London
BA 599
Paris New York AF 1299
Sydney New York TWA 1549
Zürich Frankfurt SR 499
WITH RECURSIVE Erreichbar(Abflug, Ziel) AS (
SELECT Abflug, Ziel
FROM Flug
Erreichbar'
UNION
SELECT e.Abflug, f.Ziel
FROM Erreichbar e, Flug f
WHERE e.Ziel = f.Abflug
)
SELECT * FROM Erreichbar WHERE Abflug = 'Zürich';
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
Abflug
Ziel
Zürich London
Zürich Frankfurt
Zürich Sydney
Zürich New York
4-91
Rekursive Anfragen - Problem
l Sicherheit (Endlichkeit der Rekursion)
–
Fixpunkt existiert, wenn die Transformation der rechten Seite der Rekursion
monoton steigend ist
l Alle Konstrukte, die Elemente der linken Seite der Rekursion
(Resultatsmenge) ändern bzw. löschen gefährden die Sicherheit
–
Negation (Differenz), Aggregatfunktionen, skalare Funktionen
l SQL gewährleistet Sicherheit nicht durch Fixpunkteigenschaft, sondern
über die Angabe von Steuerungsparametern
–
Abarbeitungsreihenfolge, Suchtiefe, Zyklenerkennung
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-92
Auswertung einer rekursiven Anfragen
l Semi-naive Auswertungsstrategie
–
–
Erreichbar ist monoton steigend ("Neue transitive Verbindungen kommen hinzu")
Sobald sich Erreichbar nicht mehr ändert, d.h. keine neuen transitiven
Verbindungen abgeleitet werden können, ist der Fixpunkt erreicht
BEGIN
Erreichbar := FLUG;
REPEAT
Temp := Erreichbar;
Erreichbar := Erreichbar UNION (SELECT e.Abflug, f.Ziel
FROM Erreichbar e, Flug f
WHERE e.Ziel = f.Abflug);
UNTIL Temp = Erreichbar (Fixpunkt erreicht);
END;
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-93
Zyklenbehandlung durch Einschränkung der Rekursionstiefe
Flug
l Finde alle Städte, die mit maximal einmal
Umsteigen von Zürich aus erreichbar sind
Abflug
Ziel
Carrier Preis
Frankfurt Sydney
LH 1009
Zürich
London
BA 599
Paris New York AF 1299
Sydney New York TWA 1549
Zürich Frankfurt SR 499
WITH RECURSIVE Erreichbar(Abflug, Ziel, Via) AS (
SELECT Abflug, Ziel, 0
FROM Flug
Erreichbar'
UNION
SELECT e.Abflug, f.Ziel, e.Via+1
FROM Erreichbar e, Flug f
WHERE e.Ziel = f.Abflug AND e.Via < 1
)
SELECT * FROM Erreichbar WHERE Abflug = 'Zürich';
Abflug
Ziel
Via
Zürich London
0
Zürich Frankfurt 0
Zürich Sydney
1
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-94
Einsatz von Steuerungsparameter - Beispiel
l SQL bietet deklaratives Konstrukt, um Zyklen zu behandeln
§ Angabe von Attributen, die zur Zyklenerkennung dienen bzw. Zyklen notieren
§ Unten: In Tabelle Via werden sich Zyklen gemerkt (Wert '1')
WITH RECURSIVE Erreichbar(Abflug, Ziel) AS (
SELECT Abflug, Ziel
FROM Flug
UNION
SELECT e.Abflug, f.Ziel
FROM Erreichbar e, Flug f
WHERE e.Ziel = f.Abflug
)
CYCLE Ziel SET Abflug TO '1' DEFAULT '0' USING Via
SELECT * FROM Erreichbar WHERE Abflug = 'Zürich';
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-95
Breiten- vs. Tiefensuche (1)
l Art der Graphtraversierung ist entscheidend für geordnete Ergebnisausgabe
l Rekursive Anfrage mittels Breitensuche benötigt keine neuen SQL-Konstrukte
§ Sortierung nach Pfadtiefe ergibt Ordnung nach Breitensuche
§ Unten: Sortierung nach Anzahl des Umsteigens
WITH RECURSIVE Erreichbar(Abflug, Ziel, Via) AS (
SELECT Abflug, Ziel, 0
FROM Flug
Erreichbar'
UNION
SELECT e.Abflug, f.Ziel, e.Via+1
FROM Erreichbar e, Flug f
WHERE e.Ziel = f.Abflug
)
SELECT * FROM Erreichbar WHERE Abflug = 'Zürich'
ORDER BY Via, Ziel;
Abflug
Ziel
Via
Zürich Frankfurt 0
Zürich London
0
Zürich Sydney
1
Zürich New York 2
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-96
Breiten- vs. Tiefensuche (2)
l Rekursive Anfrage mittels Tiefensuche benötigt keine neuen SQL-Konstrukte
§ Sortierung nach konkatenierten Pfaden ergibt Ordnung nach Tiefensuche
§ Unten: Pfad wird mit jedem Umsteigen erweitert
WITH RECURSIVE Erreichbar(Abflug, Ziel, Via) AS (
SELECT Abflug, Ziel, CAST(Abflug||Ziel AS VARCHAR(2500))
FROM Flug
Erreichbar' Abflug
UNION
Zürich
SELECT e.Abflug, f.Ziel, e.Via||f.Ziel
Zürich
FROM Erreichbar e, Flug f
Zürich
WHERE e.Ziel = f.Abflug
Zürich
)
SELECT Abflug, Ziel FROM Erreichbar WHERE Abflug = 'Zürich'
ORDER BY Via, Ziel DESC;
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
Ziel
Frankfurt
Sydney
New York
London
4-97
Breiten- vs. Tiefensuche (3)
l SQL bietet dennoch Konstrukte, um Breiten- bzw. Tiefensuche deklarativ festzulegen
§ Folgende Anfrage hat denselben Effekt wie die vorige für Breitensuche
WITH RECURSIVE Erreichbar(Abflug, Ziel) AS (
SELECT Abflug, Ziel
FROM Flug
UNION
SELECT e.Abflug, f.Ziel
FROM Erreichbar e, Flug f
WHERE e.Ziel = f.Abflug
)
DEPTH statt BREADTH
SEARCH BREADTH FIRST BY Ziel SET Via
SELECT * FROM Erreichbar WHERE Abflug = 'Zürich' liefert Tiefensuchordnung
ORDER BY Via;
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-98
"Sichere" Negation (Differenz) in rekursiven Anfragen
l Negation (Differenz) ist sicher, wenn sie nur auf Tabellen angewandt wird, die zum
Anwendungszeitpunkt vollständig bekannt (berechnet) sind
WITH RECURSIVE Erreichbar(Abflug, Ziel) AS (
Finde alle Städte, die von
SELECT Abflug, Ziel
einer Stadt erreichbar
FROM Flug
sind, die nicht Zürich ist
UNION
SELECT e.Abflug, f.Ziel
FROM Erreichbar e, Flug f
WHERE e.Ziel = f.Abflug
)
SELECT * FROM Erreichbar
EXCEPT
SELECT * FROM Erreichbar WHERE Abflug = 'Zürich';
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-99
"Sichere" Aggregation in rekursiven Anfragen
l Aggregation ist sicher, wenn sie nur auf Tabellen angewandt wird, die zum
Anwendungszeitpunkt vollständig bekannt (berechnet) sind
WITH RECURSIVE Erreichbar(Abflug, Ziel, Kosten) AS ( Finde jeweils die
SELECT Abflug, Ziel, Kosten
günstigsten Verbindungen
FROM Flug
zwischen zwei Städten
UNION
SELECT e.Abflug, f.Ziel, e.Kosten+f.Kosten
FROM Erreichbar e, Flug f
WHERE e.Ziel = f.Abflug
)
SELECT Abflug, Ziel, MIN(Kosten)
FROM Erreichbar
GROUP BY e.Abflug, f.Ziel;
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-100
Ausblick - Weitere Kollektionstypen (1)
l Kollektionentypen SET, MULTISET, LIST für SQL4 geplant
CREATE TABLE PrivatPersonen (
Name
VARCHAR(30),
Anschriften
LIST(ROW(Strasse VARCHAR(30),
Nr
DECIMAL(4),
PLZ DECIMAL(5),
Ort VARCHAR(40),
Land VARCHAR(25))),
Hobbies
SET(VARCHAR(15))
);
Name
[Anschriften]
{Hobbies}
<Anschrift>
Hobby
Strasse Nr PLZ Ort Land
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-101
Ausblick - Weitere Kollektionstypen (2)
l Verwendung von Kollektionskonstruktoren
INSERT INTO PrivatPersonen
VALUES ('Billy Bär',
LIST(ROW('Seefeldstrasse', 31, 8008, 'Zürich', 'CH'),
ROW('Editharing', 31, 65307, 'Bad Schwalbach', 'D')),
SET('Reisen', 'Lesen', 'Sport'));
l Denkbare Möglichkeit zur Manipulation einer Kollektion
UPDATE PrivatPersonen
SET Hobbies = SET('Reisen', 'Lesen', 'Sport', 'Essen', 'Ausgehen')
WHERE Name = 'Billy Bär';
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-102
Ausblick - Geschachtelte Anfragen auf Kollektionen (1)
l Selektion-Selektion kombiniert
SELECT *
FROM PrivatPersonen
WHERE EXISTS(SELECT Anschrift
FROM UNNEST(Anschriften) Anschrift
WHERE Anschrift.PLZ > 40000);
–
Liefert alle Personen, die mindestens einen Wohnsitz in einer Stadt mit einer
PLZ grösser als 40000 haben
Name
–
[Anschriften]
{Hobbies}
<Anschrift>
Hobby
Strasse Nr PLZ Ort Land
Tupel- und typerhaltende Anfrage
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-103
Ausblick - Geschachtelte Anfragen auf Kollektionen (2)
l Selektion-Projektion kombiniert
SELECT *
FROM PrivatPersonen
WHERE 'Seestrasse' IN (SELECT Anschrift.Strasse
FROM UNNEST(Anschriften) Anschrift);
–
Liefert alle Personen, die mindestens einen Wohnsitz an "einer" Seestrasse haben
Name
–
[Anschriften]
{Hobbies}
<Anschrift>
Hobby
Strasse Nr PLZ Ort Land
Tupel- und typerhaltende Anfrage
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-104
Ausblick - Geschachtelte Anfragen auf Kollektionen (3)
l Projektion-Projektion kombiniert
SELECT Name, (SELECT Anschrift.Ort
FROM UNNEST(Anschriften) Anschrift) AS Orte
FROM PrivatPersonen;
–
Liefert die Namen und alle zugehörigen Wohnorte
Name
{Orte}
<Ort>
–
–
Tupelerhaltende, aber typändernde Anfrage
Typ des Anfrageresultats
MULTISET(ROW(VARCHAR(30),
MULTISET(ROW(VARCHAR(40)))))
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
!?!
4-105
Ausblick - Geschachtelte Anfragen auf Kollektionen (4)
l Projektion-Selektion kombiniert
SELECT Name, (SELECT Anschrift
FROM UNNEST(Anschriften) Anschrift
WHERE Anschrift.PLZ > 40000) AS Anschriften
FROM PrivatPersonen;
– Liefert die Namen und alle Anschriften mit einer PLZ grösser als 4000
Name
–
{Anschriften}
<Anschrift>
Strasse Nr PLZ Ort Land
Typ des Anfrageresultats
MULTISET(ROW(VARCHAR(30),
MULTISET(ROW(VARCHAR(30), DECIMAL(4),
DECIMAL(5), VARCHAR(40),
VARCHAR(25)))))
!?!
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-106
Ausblick - Geschachtelte Anfragen auf Kollektionen (5)
l Kollektionsabgeleitete Tabellen in der FROM-Klausel
§ Transformation einer Kollektion in eine Tabelle für Anfragezwecke
SELECT Name, Anschrift.Ort, Anschrift.Land
FROM PrivatPersonen, UNNEST(Anschriften) Anschrift
WHERE 'Reisen' IN (SELECT * FROM UNNEST(Hobbies)) AND
CARDINALITY(Anschriften) > 1;
l Kollektionsabgeleitete Tabellen, die Sortierung bleibehalten
SELECT Name, Anschrift.Ort
FROM PrivatPersonen, UNNEST(Anschriften) Anschrift WITH ORDINALITY
ORDER BY Anschriften.Ort;
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-107
Ausblick - Kollektion(selemente) als Anfrageresultate
l Kollektion als Anfrageresultate
SELECT ITEM Name
FROM Personen;
Liefert eine Multimenge vom Typ
MULTISET(VARCHAR(30))
SELECT DISTINCT ITEM ROW Name
FROM Personen;
Liefert eine Menge vom Typ
SET(ROW(VARCHAR(30)))
l Element einer einelementigen Multimenge
THE(SELECT Hobbies
FROM Personen
WHERE Name = 'Billy');
Liefert ein Element vom Typ
LIST(VARCHAR(20))
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-108
Zusammenfassung
l SQL-99 : Objektrelationale Erweiterung von SQL-92
–
–
–
–
–
–
Neue Basisdatentypen und Typkonstruktoren
Benutzerdefinierte Datentypen und Typhierarchien
Typisierte Tabellen und Tabellenhierarchien
Typisierte Sichten und Sichtenhierarchien
Rekursion
Neue Anfragenkonstrukte, z.B.
n Objektattributzugriff mittels Dot-Operator
n Dereferenzierung mittels DEREF und Pfeil-Operator
n Zugriff auf flache Extension einer Tabelle mittels ONLY
n Zugriff auf Typ eines Attributs bzw. Variablen mittels IS OF
n Zugriff auf Subtyp eines Attributs mittels TREAT
Vorlesung "Objektrelationale, erweiterbare Datenbanken" - WS 2001/2002 (Dr. C. Türker)
4-109
Herunterladen