Relationale Theorie
This commit is contained in:
parent
ba5d082c59
commit
2ad82c3d23
@ -632,8 +632,359 @@ Minimalität
|
||||
> Vierte Normalform: erweitertes Relationenschema $R = (R, \bf{K})$ ist in vierter Normalform (4NF) bezüglich M genau dann, wenn für alle $X\rightarrow\rightarrow Y \in M^+$ gilt: $X\rightarrow\rightarrow Y$ ist trivial oder $X\supseteq K$ für ein $K\in\bf{K}$
|
||||
|
||||
|
||||
# Relationale Theorie
|
||||
## Rechnen mit FDs
|
||||
- gilt für f über R $SAT_R(F)\subseteq SAT_R(f)$, dann impliziert F die FD f (kurz: $F|= f$)
|
||||
- Hüllenbildung: Ermittlung aller funktionalen Abhängigkeiten, die aus einer gegebenen FD_Menge abgeleitet werden können
|
||||
- Hülle: $F_R^+ := \{ f | (f \text{ FD über R} ) \wedge F |= f\}$
|
||||
|
||||
# die Datenbanksprache SQL
|
||||
Ableitungsregel:
|
||||
- F1: Reflexivität $X\supseteq Y \Rightarrow X\rightarrow Y$
|
||||
- F2: Augumentation $\{X\rightarrow Y\}\Rightarrow XZ\rightarrow YZ, \text{ sowie } XZ\rightarrow Y$
|
||||
- F3: Transitivität $\{ X\rightarrow Y,Y\rightarrow Z\}\Rightarrow X\rightarrow Y$
|
||||
- F4: Dekomposition $\{X\rightarrow YZ\} \Rightarrow X\rightarrow Y$
|
||||
- F5: Vereinigung $\{X\rightarrow Y, X\rightarrow Z\}\Rightarrow X\rightarrow YZ$
|
||||
- F6: Pseudotransitivität $\{X\rightarrow Y, WY\rightarrow Z\}\Rightarrow WX\rightarrow Z$
|
||||
|
||||
F1-F3 bekannt als Armstrong-Axiome (sound, complete)
|
||||
- gültig (sound): Regeln leiten keine FDs ab, die logisch nicht impliziert
|
||||
- vollständig (complete): alle implizierten FDs werden abgeleitet
|
||||
- unabhängig (independent) oder auch bzgl. ⊆ minimal: keine Regel kann weggelassen werden
|
||||
|
||||
Alternative Regelmenge
|
||||
- B-Axiome oder RAP-Regeln
|
||||
- R Reflexivität $\{\}\Rightarrow X\rightarrow X$
|
||||
- A Akkumulation $\{X\rightarrow YZ, Z\rightarrow AW\}\Rightarrow X\rightarrow YZA$
|
||||
- P Projektivität $\{X\rightarrow YZ\}\Rightarrow X\rightarrow Y$
|
||||
- Regelmenge ist vollständig, da Armstrong-Axiome daraus abgeleitet werden können
|
||||
|
||||
> Membership Problem: Kann eine bestimmte FD $X\rightarrow Y$ aus der vorgegebenen Menge F abgeleitet werden, d.h. wird sie von F impliziert? $X\rightarrow Y \in F^+$
|
||||
- Hülle einer Attributmenge X bzgl. F ist $X^+_F := \{A | X\rightarrow A \in F^+\}$
|
||||
- Membership-Problem kann durch das modifizierte Problem $Y\subseteq X_F^+$ in linearer Zeit gelöst werden
|
||||
|
||||
Überdeckungen
|
||||
- F heißt äquivalent zu G; oder
|
||||
- F Überdeckung von G; kurz: $F\equiv G$ falls $F^+=G^+$
|
||||
- verschiedene Formen von Überdeckung: nicht-redundant, reduziert, minimal, ringförmig
|
||||
|
||||
Reduktionsoperationen
|
||||
- Ziel: Entfernen überflüssiger Attribute auf linker bzw. rechter Seite von FDs
|
||||
- Linksreduktion: entfernt unwesentliche Attribute auf der linken Seite einer FD
|
||||
- Rechtsreduktion: entsprechend auf der rechten Seite
|
||||
- erw. Relationenschema $R = (R, K)$, FD-Menge F über R, A ist ein Attribut aus R und $X\rightarrow Y$ eine FD aus F
|
||||
> Unwesentliche Attribute
|
||||
> A heißt unwesentlich in $X\rightarrow Y$ bzgl. F, wenn
|
||||
>- $X=AZ,Z\not= X \Rightarrow (F-\{X\rightarrow Y\})\cup \{Z\rightarrow Y\} \equiv F$ oder
|
||||
>- $Y=AW, W\not=Y\Rightarrow (F-\{X\rightarrow Y\})\cup \{X\rightarrow W\} \equiv F$
|
||||
- A kann also aus der FD $X\rightarrow Y$ entfernt werden, ohne dass sich die Hülle von F ändert
|
||||
- FD $X\rightarrow Y$ heißt linksreduziert, wenn kein Attribut in X unwesentlich ist
|
||||
- FD $X\rightarrow Y$ heißt rechtsreduziert, wenn kein Attribut in Y unwesentlich ist
|
||||
|
||||
Minimale Überdeckung
|
||||
- Eine minimale Überdeckung ist eine Überdeckung, die eine minimale Anzahl von FDs enthält
|
||||
- Auswahl der kleinsten aller nicht-redundanten Überdeckungen
|
||||
- FD-Menge F heißt minimal gdw. $\forall F' [F'\equiv \Rightarrow |F|\leq |F'|]$
|
||||
- Bestimmung etwa durch reduzierte Überdeckung mit anschließender Äquivalenzklassenbildung (später)
|
||||
|
||||
Äquivalenzklassen
|
||||
- FDs mit äquivalenten linken Seiten werden zu einer Äquivalenzklasse zusammengefasst
|
||||
- FDs $X_1 \rightarrow Y_1$ und $X_2\rightarrow Y_2$ liegen in einer Äquivalenzklasse, wenn $X_1\rightarrow X_2$ und $X_2\rightarrow X_1$ gelten
|
||||
- In einigen Fällen können nun zwei solche FDs in einer Äquivalenzklasse zu einer FD $X\rightarrow Y_1 Y_2$ zusammengefasst werden
|
||||
- Da die FDs einer Äquivalenzklasse in die Form $X_1\rightarrow X_2, X_2\rightarrow X_3,..., X_n\rightarrow X_1, X_1\rightarrow Y$ überführt werden können, nennt man eine Überdeckung dieser Form eine ringförmige Überdeckung
|
||||
- linke Seiten sind äquivalent, wenn sie sich gegenseitig funktional bestimmen
|
||||
|
||||
|
||||
## Mehr zu Normalformen
|
||||
- partielle Abhängigkeit liegt vor, wenn ein Attribut funktional schon von einem Teil des Schlüssels abhängt
|
||||
- Hinweis: partiell abhängiges Attribut stören nur, wenn es kein Primattribut ist
|
||||
- 2NF formal: erweitertes Relationenschema $R = (R, K)$, FD-Menge F über R
|
||||
|
||||
> Zweite Normalform
|
||||
> - Y hängt partiell von X bzgl. F ab, wenn die FD $X\rightarrow Y$ nicht linksreduziert ist
|
||||
> - Y hängt voll von X ab, wenn die FD $X\rightarrow Y$ linksreduziert ist
|
||||
> - R ist in 2NF, wenn R in 1NF ist und jedes Nicht-Primattribut von R voll von jedem Schlüssel von R abhäng
|
||||
|
||||
## Entwurfsverfahren
|
||||
Ziele:
|
||||
- Universum $U$ und FD-Menge F gegeben
|
||||
- lokal erweitertes Datenbankschema $S=\{(R_1, K_1),...,(R_p, K_p)\}$ berechnen mit
|
||||
- T1: S charakterisiert vollständig F
|
||||
- S1: S ist in 3NF bezüglich F
|
||||
- T2: Dekomosition von $U$ in $R_1,...,R_p$ ist verbundtreu bezüglich F
|
||||
- S2: Minimalität, d.h. $\not\exists S':S'$ erfüllt T1,S1,T2 und $|S'|<|S|$
|
||||
|
||||
Dekomposition:
|
||||
- Geg.: initiales Universalrelationenschema $R = (U, K(F))$ mit allen Attributen und einer von erfassten FDs F über R implizierten Schlüsselmenge
|
||||
- Attributmenge U und eine FD-Menge F
|
||||
- suche alle $K\rightarrow U$ mit K minimal, für die $K\rightarrow U \in F^+$ gilt $(K(F))$
|
||||
- Ges.: Zerlegung in $D = \{R_1, R_2,... \}$ von 3NF-Relationenschemata
|
||||
- Beispiel:
|
||||
- initiales Relationenschema $R=ABC$
|
||||
- funktionale Abhängigkeiten $F=\{A\rightarrow B, B\rightarrow C\}$
|
||||
- Schlüssel $K=A$
|
||||
- Bewertung
|
||||
- Vorteile: 3NF, Verbundtreue
|
||||
- Nachteile: restliche Kriterien nicht, reihenfolgeabhängig, NP-vollständig (Schlüsselsuche)
|
||||
|
||||
Details zum Syntheseverfahren
|
||||
- Prinzip: Synthese formt Original-FD-Menge F in resultierende Menge von Schlüsselabhängigkeiten G so um, dass $F\equiv G$ gilt
|
||||
- „Abhängigkeitstreue“ im Verfahren verankert
|
||||
- 3NF und Minimalität wird auch erreicht, reihenfolgeunabhängig
|
||||
- Zeitkomplexität: quadratisch
|
||||
|
||||
Syntheseverfahren für Relationenschema R mit FDs F
|
||||
- Ges.: verlustfreie und abhängigkeitstreue Zerlegung in $R_1,... R_n$, wobei alle $R_i$ in 3NF sind
|
||||
- Bilde Äquivalentklassen $C_i$ von FD aus $\hat{F}$ mit gleichen oder äquivalenten linken Seiten, d.h. $C_i=\{X_i\rightarrow A_{i1},X_i\rightarrow A_{i2},...\}$. Bilde zu jeder Äquivalenzklasse $C_i$ ein Schema der Form $R_{Ci}=\{X_i\cup \{A_{i1}\}\cup \{A_{i2}\}\cup ... \}$. Falls keines der Schemata $R_{Ci}$ enthält einen Schlüssel von R, erzeuge weiteres Relationenschema $R_K$ mit Attributen aus R, die Schlüssel bilden
|
||||
- Beispiel
|
||||
- FD-Menge $F=\{A\rightarrow B, AB\rightarrow C, A\rightarrow C, B\rightarrow A, C\rightarrow E\}$
|
||||
- minimale Überdeckung $\hat{F}=\{A\rightarrow B,B\rightarrow C, B\rightarrow A, C\rightarrow E\}$
|
||||
- Zusammenfassung zu Äquivalenzklassen $C_1=\{A\rightarrow B,B\rightarrow C, B\rightarrow A\}, C_2=\{C\rightarrow E\}$
|
||||
- Syntheseergebnis: $(ABC,\{\{A\},\{B\}\}),(CE,\{C\})$
|
||||
|
||||
Erreichung der Verbundtreue
|
||||
- Erreichen der Verbundtreue durch einfachen „Trick“:
|
||||
- Erweitern der Original-FD-Menge F um $U\rightarrow \delta$ um Dummy-Attribut $\delta$
|
||||
- $\delta$ wird nach Synthese entfernt
|
||||
- Beispiel: $\{A\rightarrow B, C\rightarrow E\}$
|
||||
- Syntheseergebnis $(AB, \{A\}), (CE, \{C\})$ ist nicht verbundtreu, da Universalschlüssel in keinem Schema enthalten ist
|
||||
- Dummy-FD $ABCE\rightarrow \delta$; reduziert auf $AC\rightarrow\delta$
|
||||
- liefert drittes Relationenschema $(AC,\{AC\})$
|
||||
|
||||
|
||||
# Die relationale Anfragesprache SQL
|
||||
## Aufbau von SQL-Anfragen
|
||||
- `select`
|
||||
- Projektionsliste
|
||||
- Festlegung der Projektionsattribute
|
||||
- arithmetische Operationen und Aggregatfunktionen
|
||||
- Attribute der hinter from stehenden Relationen, optional mit Präfix, der Relationennamen oder Namen der Tupelvariablen angibt
|
||||
- arithmetische Ausdrücke über Attributen dieser Relationen und passenden Konstanten
|
||||
- Aggregatfunktionen über Attributen dieser Relationen
|
||||
- Spezialfall der Projektionsliste: * ,liefert alle Attribute der Relation(en) aus dem from-Teil
|
||||
- distinct eliminiert Duplikate
|
||||
- `from`
|
||||
- zu verwendende Relationen, evtl. Umbenennungen
|
||||
- einfachste Form; hinter jedem Relationennamen kann optional eine Tupelvariable stehen
|
||||
- `where`
|
||||
- Selektions-, Verbundbedingungen
|
||||
- Geschachtelte Anfragen (wieder ein SFW-Block)
|
||||
|
||||
### Verbunde
|
||||
- bei mehr als einer Relation wird das kartesische Produkt gebildet:
|
||||
`select * from WEINE, ERZEUGER`
|
||||
- alle Kombinationen werden ausgegeben!
|
||||
- Einführung von Tupelvariablen erlaubt mehrfachen Zugriff auf eine Relation:
|
||||
`select * from WEINE w1, WEINE w2`
|
||||
- Spalten lauten dann:
|
||||
`w1.WeinID, w1.Name, w1.Farbe, w1.Jahrgang, w1.Weingut, w2.WeinID, w2.Name, w2.Farbe, w2.Jahrgang, w2.Weingut`
|
||||
- Natürlicher Verbund in SQL92
|
||||
`select * from WEINE, ERZEUGER where WEINE.Weingut = ERZEUGER.Weingut`
|
||||
- Verbund mit "join"; kennen mehrere explizite Verbundoperatoren (engl. join); als Abkürzung für die ausführliche Anfrage mit Kreuzprodukt aufzufassen
|
||||
`select * from WEINE natural join ERZEUGER`
|
||||
- Verbund mit beliebigem Prädikat: `select * from WEINE join ERZEUGER on WEINE.Weingut = ERZEUGER.Weingut`
|
||||
- Gleichverbund mit using: `select * from WEINE join ERZEUGER using (Weingut)`
|
||||
- Kreuzprodukt `select * from WEINE, ERZEUGER`
|
||||
- als cross join `select * from WEINE cross join ERZEUGER`
|
||||
- "Zwischenrelationen" aus SQL-Operationen oder einem SFW-Block können über Tupelvariablen mit Namen versehen werden
|
||||
`select Ergebnis.Weingut from (WEINE natural join ERZEUGER) as Ergebnis`
|
||||
- Präfixe für Eindeutigkeit `select Name, Jahrgang, ERZEUGER.Weingut from WEINE natural join ERZEUGER`
|
||||
- bei der Verwendung von Tupelvariablen, kann der Name einer Tupelvariablen zur Qualifizierung eines Attributs benutzt werden:
|
||||
`select w1.Name, w2.Weingut from WEINE w1, WEINE w2`
|
||||
|
||||
### Selektionen
|
||||
- where Klausel: `select ...from ... where bedingung`
|
||||
- Formen der Bedingung:
|
||||
- Vergleich eines Attributs mit einer Konstanten: `attribut θ konstante`
|
||||
- mögliche Vergleichssymbole θ abhängig vom Wertebereich; etwa =, <>, >, <, >= sowie <=.
|
||||
- Vergleich zwischen zwei Attributen mit kompatiblen Wertebereichen: `attribut1 θ attribut2`
|
||||
- logische Konnektoren or, and und not
|
||||
- Verbundbedingung
|
||||
- Verbundbedingung hat die Form: `relation1.attribut = relation2.attribut`
|
||||
- Beispiel: `select Name, Jahrgang, ERZEUGER.Weingut from WEINE, ERZEUGER where WEINE.Weingut = ERZEUGER.Weingut`
|
||||
- Bereichsselektion
|
||||
- `attrib between konstante_1 and konstante_2`
|
||||
- ist Abkürzung für `attrib ≥ konstante_1 and attrib ≤ konstante_2`
|
||||
- schränkt damit Attributwerte auf das abgeschlossene Intervall $[konstante_1 , konstante_2 ]$ ein
|
||||
- Beispiel: `select * from WEINE where Jahrgang between 2000 and 2005`
|
||||
- Ungewissheitsselektion
|
||||
- Notation `attribut like spezialkonstante`
|
||||
- Mustererkennung in Strings (Suche nach mehreren Teilzeichenketten)
|
||||
- Spezialkonstante kann die Sondersymbole `%` und `_` beinhalten
|
||||
- `%` steht für kein oder beliebig viele Zeichen
|
||||
- `_` steht für genau ein Zeichen
|
||||
- Beispiel: `select * from WEINE where Name like 'La Rose%'`
|
||||
|
||||
### Mengenoperationen
|
||||
Mengenoperationen erfordern kompatible Wertebereiche für Paare korrespondierender Attribute:
|
||||
- beide Wertebereiche sind gleich oder
|
||||
- beide sind auf character basierende Wertebereiche (unabhängig von der Länge der Strings) oder
|
||||
- beide sind numerische Wertebereiche (unabhängig von dem genauen Typ) wie integer oder float
|
||||
- Ergebnisschema := Schema der „linken“ Relation
|
||||
```sql
|
||||
select A, B, C from R1
|
||||
union
|
||||
select A, C, D from R2
|
||||
```
|
||||
|
||||
- Vereinigung, Durchschnitt und Differenz als union, intersect und except
|
||||
- orthogonal einsetzbar:
|
||||
- `select * from (select Weingut from ERZEUGER except select Weingut from WEINE)`
|
||||
- äquivalent zu `select * from ERZEUGER except corresponding WEINE`
|
||||
- über corresponding by-Klausel: Angabe der Attributliste, über die Mengenoperation ausgeführt wird
|
||||
- `select * from ERZEUGER except corresponding by (Weingut) WEINE`
|
||||
- bei Vereinigung: Defaultfall ist Duplikateliminierung (union distinct); ohne Duplikateliminierung durch union all
|
||||
|
||||
### Geschachtelte Anfragen
|
||||
Schachtelung von Anfragen
|
||||
- für Vergleiche mit Wertemengen notwendig:
|
||||
- Standardvergleiche in Verbindung mit den Quantoren all ($\forall$) oder any ($\exists$)
|
||||
- spezielle Prädikate für den Zugriff auf Mengen, in und exists
|
||||
- in-Prädikat und geschachtelte Anfragen
|
||||
- Notation: `attribut in ( SFW-block )`
|
||||
- Beispiel: `select Name from WEINE where Weingut in (select Weingut from ERZEUGER where Region = 'Bordeaux')`
|
||||
- Auswertung von geschachtelten Anfragen
|
||||
1. Auswertung der inneren Anfrage zu den Weingütern aus Bordeaux
|
||||
2. Einsetzen des Ergebnisses als Menge von Konstanten in die äußere Anfrage hinter in
|
||||
3. Auswertung der modifizierten Anfrage
|
||||
`select Name from WEINE where Weingut in ( 'Château La Rose', 'Château La Pointe')`
|
||||
- interne Auswertung: Umformung in einen Verbund
|
||||
`select Name from WEINE natural join ERZEUGER where Region = 'Bordeaux'`
|
||||
- Negation des in-Prädikats
|
||||
- Simulation des Differenzoperators $^π Weingut^{(ERZEUGER)}- ^π Weingut^{(WEINE)}$ durch SQL-Anfrage
|
||||
`select Weingut from ERZEUGER where Weingut not in ( select Weingut from WEINE )`
|
||||
|
||||
|
||||
### Mächtigkeit des SQL-Kerns
|
||||
| Relationenalgebra | SQL |
|
||||
| -- | -- |
|
||||
| Projektion | select distinct |
|
||||
| Selektion | where ohne Schachtelung |
|
||||
| Verbund | from, where\\ from mit join oder natural join |
|
||||
| Umbenennung | from mit Tupelvariable; as |
|
||||
| Differenz | where mit Schachtelung\\ except corresponding |
|
||||
| Durchschnitt | where mit Schachtelung\\ intersect corresponding |
|
||||
| Vereinigung | union corresponding |
|
||||
|
||||
## Erweiterungen des SFW-Blocks
|
||||
Erweiterungen des SFW-Blocks
|
||||
- innerhalb der from-Klausel weitere Verbundoperationen (äußerer Verbund),
|
||||
- innerhalb der where-Klausel weitere Arten von Bedingungen und Bedingungen mit Quantoren,
|
||||
- innerhalb der select-Klausel die Anwendung von skalaren Operationen und Aggregatfunktionen,
|
||||
- zusätzliche Klauseln group by und having
|
||||
- rekursive Anfragen
|
||||
|
||||
### Skalare Ausdrücke
|
||||
Umbenennung von Spalten: `ausdruck as neuer-name`
|
||||
- skalare Operationen auf
|
||||
- numerischen Wertebereichen: etwa +, −, ∗ und /,
|
||||
- Strings: Operationen wie char_length (aktuelle Länge eines Strings), die Konkatenation ∥ und die Operation substring (Suchen einer Teilzeichenkette an bestimmten Positionen des Strings),
|
||||
- Datumstypen und Zeitintervallen: Operationen wie current_date (aktuelles Datum), current_time (aktuelle Zeit), +, − und ∗
|
||||
- bedingte Ausdrücke
|
||||
- Typkonvertierung
|
||||
- skalare Ausdrücke können mehrere Attribute umfassen
|
||||
- Anwendung ist tupelweise: pro Eingabetupel entsteht ein Ergebnistupel
|
||||
- Ausgabe der Namen aller Grand Cru-Weine
|
||||
`select substring(Name from 1 for (char_length(Name) - position('Grand Cru' in Name))) from WEINE where Name like '%Grand Cru'`
|
||||
- Annahme: zusätzliches Attribut HerstDatum in WEINE
|
||||
`alter table WEINE add column HerstDatum date update WEINE set HerstDatum = date '2004-08-13' where Name = 'Zinfandel'`
|
||||
- Anfrage:
|
||||
`select Name, year(current_date - HerstDatum) as Alter from WEINE`
|
||||
|
||||
### Bedingte Ausdrücke
|
||||
- case-Anweisung: Ausgabe eines Wertes in Abhängigkeit von der Auswertung eines Prädikats
|
||||
`case when prädikat_1 then ausdruck_1 ... when prädikat_n−1 then ausdruck_n−1 [ else ausdruck_n ] end`
|
||||
- Einsatz in select- und where-Klausel
|
||||
`select case when Farbe = 'Rot' then 'Rotwein' when Farbe = 'Weiß' then 'Weißwein' else 'Sonstiges' end as Weinart, Name from WEINE`
|
||||
|
||||
### Typkonvertierung
|
||||
- explizite Konvertierung des Typs von Ausdrücken
|
||||
`cast(ausdruck as typname)`
|
||||
- Beispiel: int-Werte als Zeichenkette für Konkatenationsoperator
|
||||
`select cast(Jahrgang as varchar) || 'er ' || Name as Bezeichnung from WEINE`
|
||||
|
||||
### Quantoren und Mengenvergleiche
|
||||
- Quantoren: all, any, some und exists
|
||||
- Notation
|
||||
`attribut θ { all | any | some } ( select attribut from ...where ...)`
|
||||
- all: where-Bedingung wird erfüllt, wenn für alle Tupel des inneren SFW-Blocks der θ-Vergleich mit attribut true wird
|
||||
- any bzw. some: where-Bedingung wird erfüllt, wenn der θ-Vergleich mit mindestens einem Tupel des inneren SFW-Blocks true wird
|
||||
- Bestimmung des ältesten Weines
|
||||
`select * from WEINE where Jahrgang <= all ( select Jahrgang from WEINE)`
|
||||
- alle Weingüter, die Rotweine produzieren
|
||||
`select * from ERZEUGER where Weingut = any ( select Weingut from WEINE where Farbe = 'Rot')`
|
||||
|
||||
### Vergleich von Wertemengen
|
||||
- Test auf Gleichheit zweier Mengen allein mit Quantoren nicht möglich
|
||||
- Beispiel: „Gib alle Erzeuger aus, die sowohl Rot- als auch Weißweine produzieren.“
|
||||
- falsche Anfrage `select Weingut from WEINE where Farbe = 'Rot' and Farbe = 'Weiß'`
|
||||
- richtige Anfrage `select w1.Weingut from WEINE w1, WEINE w2 where w1.Weingut = w2.Weingut and w1.Farbe = 'Rot' and w2.Farbe = 'Weiß'`
|
||||
|
||||
### Das exists/not exists-Prädikat
|
||||
- einfache Form der Schachtelung
|
||||
`exists ( SFW-block )`
|
||||
- liefert true, wenn das Ergebnis der inneren Anfrage nicht leer ist
|
||||
- speziell bei verzahnt geschachtelten (korrelierte) Anfragen sinnvoll
|
||||
- in der inneren Anfrage wird Relationen- oder Tupelvariablen-Name aus dem from-Teil der äußeren Anfrage verwendet
|
||||
|
||||
### Verzahnt geschachtelte Anfragen
|
||||
Weingüter mit 1999er Rotwein
|
||||
```sql
|
||||
select * from ERZEUGER
|
||||
where 1999 in (
|
||||
select Jahrgang from WEINE
|
||||
where Farbe='Rot' and
|
||||
WEINE.Weingut = ERZEUGER.Weingut)
|
||||
```
|
||||
konzeptionelle Auswertung
|
||||
1. Untersuchung des ersten ERZEUGER-Tupels in der äußeren Anfrage (Creek) und Einsetzen in innere Anfrage
|
||||
2. Auswertung der inneren Anfrage
|
||||
3. Weiter bei 1. mit zweitem Tupel ...
|
||||
|
||||
## Aggregatfunktionen und Gruppierungen
|
||||
- Aggregatfunktionen berechnen neue Werte für eine gesamte Spalte, etwa die Summe oder den Durchschnitt der Werte einer Spalte
|
||||
- Beispiel: Ermittlung des Durchschnittspreises aller Artikel oder des Gesamtumsatzes über alle verkauften Produkte
|
||||
- bei zusätzlicher Anwendung von Gruppierung: Berechnung der Funktionen pro Gruppe, z.B. der Durchschnittspreis pro Warengruppe oder der Gesamtumsatz pro Kunde
|
||||
- Aggregatfunktionen in Standard-SQL:
|
||||
- count: berechnet Anzahl der Werte einer Spalte oder alternativ (im Spezialfall count(∗)) die Anzahl der Tupel einer Relation
|
||||
- sum: berechnet die Summe der Werte einer Spalte (nur bei numerischen Wertebereichen)
|
||||
- avg: berechnet den arithmetischen Mittelwert der Werte einer Spalte (nur bei numerischen Wertebereichen)
|
||||
- max bzw. min: berechnen den größten bzw. kleinsten Wert einer Spalte
|
||||
- Argumente einer Aggregatfunktion:
|
||||
- ein Attribut der durch die from-Klausel spezifizierten Relation,
|
||||
- ein gültiger skalarer Ausdruck oder
|
||||
- im Falle der count-Funktion auch das Symbol ∗
|
||||
- vor dem Argument (außer im Fall von count(∗)) optional auch die Schlüsselwörter distinct oder all
|
||||
- distinct: vor Anwendung der Aggregatfunktion werden doppelte Werte aus der Menge von Werten, auf die die Funktion angewendet wird
|
||||
- all: Duplikate gehen mit in die Berechnung ein (Default-Voreinstellung)
|
||||
- Nullwerte werden in jedem Fall vor Anwendung der Funktion aus der Wertemenge eliminiert (außer im Fall von count(∗))
|
||||
- Beispiel: Anzahl der Weine:
|
||||
`select count(*) as Anzahl from WEINE`
|
||||
- Beispiel: Anzahl der verschiedenen Weinregionen:
|
||||
`select count(distinct Region) from ERZEUGER`
|
||||
- Weine, die älter als der Durchschnitt sind:
|
||||
`select Name, Jahrgang from WEINE where Jahrgang < ( select avg(Jahrgang) from WEINE)`
|
||||
- Schachtelung von Aggregatfunktionen nicht erlaubt
|
||||
`select f 1 (f 2 (A)) as Ergebnis from R ...` -- (falsch!);
|
||||
mögliche Formulierung: `select f 1 (Temp) as Ergebnis from ( select f 2 (A) as Temp from R ...)`
|
||||
|
||||
- Aggregatfunktionen in where-Klausel
|
||||
- Aggregatfunktionen liefern nur einen Wert ⇝ Einsatz in Konstanten-Selektionen der where-Klausel möglich
|
||||
- alle Weingüter, die nur einen Wein liefern:
|
||||
`select * from ERZEUGER e where 1 = ( select count(*) from WEINE w where w.Weingut = e.Weingut )`
|
||||
|
||||
- group by und having
|
||||
- Notation
|
||||
- select ...
|
||||
- from ...
|
||||
- [where ...]
|
||||
- [group by attributliste ]
|
||||
- [having bedingung ]
|
||||
- Beispiel
|
||||
- Regionen mit mehr als einem Wein
|
||||
`select Region, count(*) as Anzahl from ERZEUGER natural join WEINE group by Region having count(*) > 1`
|
||||
|
||||
|
||||
## Rekursion
|
||||
|
||||
|
||||
# Grundlagen von Anfragen: Algebra & Kalkül
|
||||
|
Loading…
Reference in New Issue
Block a user