Mengenoperationen in SQL

Werbung
Mengenoperationen in SQL
• Mengenoperationen
- (Ungefähre) Entsprechungen der Mengenoperationen Vereinigung (∪), Differenz (–) und Schnittmenge (∩) der relationalen Algebra
- Erlauben das Zusammenführen der Ergebnis-Relationen R1 und R2 zweier
Queries Q1 und Q2 zu einer Ergebnisrelation T
- Erfordern Vereinigungsverträglichkeit der Eingabe-Relationen:
-Zuordnung jedoch über Spaltenposition statt über Spaltenname
-Typverträglichkeit der zusammengeführten Spalten erforderlich
⇒Evtl. Umordnung/Projektion der Spalten in der SELECT-Klausel der Eingabe-Anfragen erforderlich
- Jeweils in einer Version mit und ohne Duplikatelimierung verfügbar:
-Bei Angabe von DISTINCT: mit Duplikateliminierung
-Bei Angabe von ALL: keine Duplikateliminierung
-Standardverhalten (ohne Angabe von DISTINCT bzw. ALL):
mit Duplikateliminierung!
• Erweiterung des Syntaxdiagrams von Seite 4-4
full-query:
UNION
query
EXCEPT
DISTINCT
ALL
full-query
INTERSECT
- Einsetzen von full-query an Stelle von query in den anderen Teilen der
Grammatik
• Beispiel-Relationen
R1
A
B
INTEGER VARCHAR(10)
C
INTEGER
R2
A
X
Y
INTEGER
INTEGER
VARCHAR(10)
1
abc
42
4
16
hij
2
def
23
2
23
def
1
3
abc
42
42
abc
stu
15
1
3
15
vwx
• Vereinigung
- R1 UNION [DISTINCT] R2:
Vereinigt die Tupel der Eingabe-Relationen R1 und R2. Bestehen Duplikate in
R1 oder R2 oder entstünden Duplikate durch die Vereinigung, enthält das Ergebnis keine Duplikate.
- R1 UNION ALL R2:
Vereinigt die Tupel der Eingabe-Relationen R1 und R2, bestehende oder durch
die Vereinigung neu entstehende Duplikate bleiben vollständig erhalten
- Beispiele:
-SELECT * FROM R1 UNION DISTINCT SELECT * FROM R2
⇒Fehler, da R1.B nicht verträglich mit R1.X (bzw. R1.C n. vertr. mit R2.Y)
-SELECT * FROM R1 UNION DISTINCT SELECT A, Y, X FROM R2
⇒Vereinigungsverträglichkeit durch Umsortieren hergestellt
A
B
INTEGER VARCHAR(10)
C
INTEGER
1
abc
42
2
def
23
3
stu
15
4
3
hij
vwx
16
15
keine Duplikate!
-SELECT * FROM R1 UNION ALL SELECT A, Y, X FROM R2
A
B
INTEGER VARCHAR(10)
C
INTEGER
1
abc
42
2
def
23
1
3
abc
42
4
stu
hij
15
16
2
def
23
1
3
abc
42
vwx
15
Alle Duplikate aus R1
und R2 bleiben erhalten
• Differenz
- R1 EXCEPT [DISTINCT] R2:
Das Ergebnis enthält alle Tupel aus R1, die nicht auch in R2 enthalten sind.
Enthält R1 Duplikate eines Tupels r, das nicht ebenfalls (mindestens einmal) in
R2 existiert, so enthält das Ergebnis das Tupel r genau einmal.
- R1 EXCEPT ALL R2:
Das Ergebnis enthält alle Tupel aus R1, die nicht auch in R2 enthalten sind. Sei
n die Anzahl der Duplikate eines Tupels r aus R1, sei m die Anzahl der Duplikate des gleichen Tupels in R2, so ist die Anzahl der Duplikate im Ergebnis
MAX(m-n, 0)
- Beispiele
-SELECT * FROM R1 EXCEPT DISTINCT SELECT A, Y, X FROM R2
A
B
INTEGER VARCHAR(10)
3
stu
C
INTEGER
15
-SELECT * FROM R1 EXCEPT ALL SELECT A, Y, X FROM R2
A
B
INTEGER VARCHAR(10)
C
INTEGER
1
abc
42
3
stu
15
Tupel bleibt 1x im
Ergebnis erhalten (da 2x in R1
aber nur 1x in R2)
• Schnittmenge
- R1 INTERSECT [DISTINCT] R2:
Das Ergebnis enthält alle Tupel, die sowohl in R1 als auch in R2 enthalten sind.
Enthalten R1 und R2 Duplikate eines Tupels r, so enthält das Ergebnis das Tupel r genau einmal.
- R1 INTERSECT ALL R2:
Das Ergebnis enthält alle Tupel, die sowohl in R1als auch in R2 enthalten sind.
Sei n die Anzahl der Duplikate eines Tupels r aus R1, sei m die Anzahl der Duplikate des gleichen Tupels in R2, so ist die Anzahl der Duplikate im Ergebnis
MIN(m,n).
- Beispiele
-SELECT * FROM R1 INTERSECT DISTINCT SELECT A, Y, X FROM R2
A
B
C
INTEGER VARCHAR(10)
INTEGER
1
abc
42
2
def
23
-Zusätzliche Eingaberelation R2’:
R2’
A
X
Y
INTEGER
INTEGER
VARCHAR(10)
4
16
hij
2
23
def
1
3
42
abc
1
15
42
vwx
abc
2
23
def
Dann liefert
SELECT * FROM R1 INTERSECT ALL SELECT A, Y, X FROM R2’
R1
A
B
INTEGER VARCHAR(10)
C
INTEGER
1
abc
42
1
abc
42
2
def
23
2x in R1 und 2x in R2’
1x in R1 und 2x in R2’
Herunterladen