28

Informatik (Subject) / Datenbanksysteme1 (Lesson)

Kapitel 3 - Die Relationale Algebra

This lesson was created by daschinka.

Learn lesson

This lesson is not released for learning.

Advertisement
  • Arbeiten mit Relationen Wichtige Beispiele   - Relationale Algebra - Relationen-Kalkül Sie dienen als theoretisches Fundament für konkrete Anfragesprachen wie – SQL: Basiert i.w. auf der relationalen Algebra – QBE (= Query By Example) und Quel:  Basieren auf dem Relationen-Kalkül
  • Begriff Relationale Algebra Mathematik -Mathematik:   Algebra ist eine Operanden-Menge mit Operationen Abgeschlossenheit: Werden Elemente der Menge mittels eines Operators verknüpft, ist das Ergebnis wieder ein Element der Menge  Beispiele Natürliche Zahlen mit Addition, Multiplikation Zeichenketten mit Konkatenation Boolche Algebra: Wahrheitswerte mit ¬, und, oder Mengen-Algebra: -Wertebereich: die Menge(Klasse) der Mengen - Operationen z.B.: ∩, -, Vereinigung  
  • Begriff Relationale Algebra -Relationale Algebra: "Rechnen mit Relationen" Was sind Operanden? Relationen (Tabellen) Beispiele für Operationen? Selektion von Tupeln nach Kriterien (z.B Gehalt>1000) Kombination mehrerer Tabellen Abgeschlossenheit: Ergebnis einer Anfrage ist immer eine (neue) Relation (oft ohne eigenen Namen) Damit können einfache Terme der relationalen Algebra zu komplexeren zusammengesetzt werden
  • Grundoperationen 5 5 Grundoperationen der Relationalen Algebra: Vereinigung Differenz: R=S - T  Kartesisches Produkt (Kreuzprodukt): R=S × T Selektion: R=σF(S) Projektion: R=πA,B,...(S)  Mit den Grundoperationen lassen sich weitere Operationen, (z.B. die Schnittmenge) nachbilden  Manchmal wird die Umbenennung von Attributen als 6.Grundoperation bezeichnet
  • Vereinigung der Differenz Operationen sind nur anwendbar, wenn die Schemata der beiden Relationen S und T übereinstimmen (Name und Domäne) Die Ergebnis-Relation R bekommt dieses Schema Was wissen wir über die Kardinalität des Ergebnisses (Anzahl der Tupel von R)? |R|=|SυT| ≤ |S| + |T| |R|=|S-T| ≥ |S| - |T| Achtung:Zwei Tupeln gelten nur dann als gleich, wenn alle ihre Attributwerte gleich sind.
  • Kartesisches Produkt Die Meng aller möglichen Kombinationen von Tupeln aus S und T Für die Anzahl der Tupeln gilt:  |S×T| = |S| * |T|
  • Selektion Mit der Selektion R= σF(S) werden diejenigen Tupel aus einer Relation S ausgewählt, die eine durch die logische Formel F vorgegebene Eigenschaft erfüllen R bekommt das gleiche Schema wie S Die Formel F besteht aus: – Konstanten („Meier“) – Attributen: Als Name (PNr) oder Nummer ($1) – Vergleichsoperatoren: = , < , ≤, > , ≥, ≠ – Boole‘sche Operatoren: ν, ¬, Λ  Formel Fnwird für jedes Tupel von S ausgewertet
  • Projektion  Die Projektion R= πA,B,...(S) erlaubt es, – Spalten einer Relation auszuwählen – bzw. nicht ausgewählte Spalten zu streichen – die Reihenfolge der Spalten zu verändern  In den Indizes sind die selektierten Attribut-Namen oder -Nummern ($1) aufgeführt  Für die Anzahl der Tupel des Ergebnisses gilt:   |πA,B,...(S)| ≤ |S| Grund: Nach dem Streichen von Spalten können Duplikat-Tupel entstanden sein, die eliminiert werden, damit wieder eine Relation (Menge von Tupeln) entsteht.
  • Duplikat-Elimination Erforderlich nach... – Projektion – Vereinigung →"billige" Basisoperationen, aber... Wie funktioniert Duplikat-Elimination? for(int i = 0 ; i< R.length ; i++) for(int j = 0 ; j< i; j++) if(R[i] == R[j])       // R[j] markieren um es später zu löschen Aufwand? n=R.length: O(n2) Besserer Algorithmus mit Sortieren: O(n log n) → An sich billige Grund-Operationen werden nur durch die Duplikat-Elimination teuer 
  • Abgeleitete Operationen • Eine Reihe nützlicher Operationen lassen sich mit Hilfe der 5 Grundoperationen ausdrücken: – Durchschnitt R = S ∩ T – Quotient R = S ÷ T – Join R = S |×|T
  • Advertisement
  • Durchschnitt • Idee: Finde gemeinsame Elemente in zwei Relationen  (Schemata müssen übereinstimmen): R‘= S∩T= {t | tεSΛtεT} • Implementierung der Operation „Durchschnitt“ mit Hilfe der Grundoperation „Differenz“: • A ∩ B = A - (A -B)
  • Quotient Dient zur Simulation eines Allquantors Beispiel: welche Programmierer programmieren in allen Sprachen Umkehrung des kartesischen Produkts 
  • Join Selektion über Kreuzprodukt zweier Relationen Theta-Join (Θ): R|A×(theta)|B S  Allgemeiner Vergleich: A ist ein Attribut von R und B ein Attribut von S. Θ ist einer der Operatoren <, >, ≤,≥,≠,= Equi-Join: R|A×(ist gleich)|BS Natural Join: R|×|S: • Ein Equi-Join bezüglich aller gleichbenannten Attribute in R und S. • Gleiche Spalten werden gestrichen (Projektion) Implementierung mit Hilfe der Grundoperation R|A×(theta)|B S = σAΘB(R×S)
  • SQL • Die wichtigste Datenbank-Anfragesprache SQL beruht wesentlich auf der relationalen Algebra • Grundform einer Anfrag*: Projektion -> SELECT (Liste von Attributnamen Kreuzprodunkt -> FROM (ein oder mehrere Relationennamen) Selektion -> [WHERE  (Bedingung) • Mengenoperationen: SELECT ... FROM ... WHERE UNION SELECT ... FROM ... WHERE • Hauptunterschied zwischen SQL und rel. Algebra: – Operatoren bei SQL nicht beliebig schachtelbar – Jeder Operator hat seinen festen Platz • Trotzdem: – Man kann zeigen, daß jeder Ausdruck der relationalen Algebra gleichwertig in SQL formuliert werden kann – Die feste Anordnung der Operatoren ist also keine wirkliche Einschränkung (Übersichtlichkeit) – Man sagt, SQL ist relational vollständig • Weitere Unterschiede: – Nicht immer werden Duplikate eliminiert (Projektion) – zus. Auswertungsmöglichkeiten (Aggregate, Sortieren)
  • Select • Entspricht Projektion in der relationalen Algebra • Aber: Duplikatelimination nur, wenn durch das Schlüsselwort DISTINCT explizit verlangt • Syntax: SELECT *FROM ... --Keine Projektion                           SELECT A1, A2, ...FROM ... --Projektion ohne  Duplikatelimination SELECT DISTINCTA1, A2, ... --Projektion mit Duplikatelimination • Bei der zweiten Form kann die Ergebnis„relation“ also u.U. Duplikate enthalten • Grund: Performanz • Bei den Attributen A1, A2, ... lässt sich angeben... – Ein Attributname einer beliebigen Relation, die in der FROM-Klausel angegeben ist – Ein skalarer Ausdruck, der Attribute und Konstanten mittels arithmetischer Operationen verknüpft – Im Extremfall: Nur eine Konstante – Aggregationsfunktionen (siehe später) – Ein Ausdruck der Form A1 AS A2: A2 wird der neue Attributname (Spaltenüberschrift)
  • From • Enthält mindestens einen Eintrag der Form R1 • Enthält die FROM-Klausel mehrere Einträge – FROM R1, R2, ...so wird das kartesische Produkt gebildet: – R1 × R2 × ... • Enthalten zwei verschiedene Relationen R1, R2 ein Attribut mit gleichem Namen, dann ist dies in der SELECT- und WHERE-Klausel mehrdeutig • Eindeutigkeit durch vorangestellten Relationennamen: SELECT Mitarbeiter.Name, Abteilung.Name, ... FROM Mitarbeiter, Abteilung WHERE ... • Man kann Schreibarbeit sparen, indem man den Relationen lokal (innerhalb der Anfrage) kurze Namen zuweist (Alias-Namen): SELECT m.Name, a.Name, ... FROM Mitarbeiter m, Abteilung a WHERE ... • Dies lässt sich in der SELECT-Klausel auch mit der Sternchen-Notation kombinieren: SELECT m.*, a.Name AS Abteilungsname, ... FROM Mitarbeiter m, Abteilung a WHERE ... • Manchmal Self-Join einer Relation mit sich selbst: SELECT m1.Name, m2.Name, ... FROM Mitarbeiter m1, Mitarbeiter m2 WHERE ...
  • Where • Entspricht der Selektion der relationalen Algebra • Enthält genau ein logisches Prädikat Φ (Funktion die einen booleschen  Wert (wahr/falsch) zurück gibt). • Das logische Prädikat besteht aus – Vergleichen zwischen Attributwerten und Konstanten – Vergleichen zwischen verschiedenen Attributen – Vergleichsoperatoren: <, >, ≤, ≥, =, ≠ – Test auf Wert undefiniert: A1 IS NULL/IS NOT NULL – Inexakter Stringvergleich: A1 LIKE‘Datenbank%‘ –A1 IN (2, 3, 5, 7, 11, 13) • Innerhalb eines Prädikates: Skalare Ausdrücke: – Numerische Werte/Attribute mit +, -, *, / verknüpfbar – Strings: char_length, Konkatenation || und substring – Spezielle Operatoren für Datum und Zeit – Übliche Klammernsetzung. • Einzelne Prädikate können mit AND, OR, NOT zu komplexeren zusammengefasst werden • Idee der Anfrageauswertung: Alle Tupel des kartesischen Produktes aus der FROM - Klausel werden getestet, ob sie Φ erfüllen • Effizientere Ausführung ist meist möglich  • Das DBMS optimiert die Anfragen automatisch sehr gut • Inexakte Stringsuche: A1 LIKE‘Datenbank%‘ – bedeutet: Alle Datensätze, bei denen Attribut A1 mit dem Präfix Datenbankbeginnt. – Entsprechend: A1 LIKE ‘%Daten%‘ – In dem Spezialstring hinter LIKE ... % steht für einen beliebig belegbaren Teilstring _steht für genau ein einzelnes frei belegbares Zeichen
  • Join in SQL • Normalerweise wird der Join wie bei der relationalen Algebra als Selektionsbedingung über dem kartesischen Produkt formuliert. • Beispiel: Join zwischen Mitarbeiter und Abteilung select * fromMitarbeiter m, Abteilungen a where m.ANr = a.ANr • In neueren SQL-Dialekten auch möglich: – select * from Mitarbeiter m join Abteilungen a on a.ANr=m.ANr – select * from Mitarbeiter join Abteilungen using(ANr) –selectn* from Mitarbeiter natural join Abteilungen • Nach diesen Konstrukt können mit einer WHERE-Klausel weitere Bedingugngen an das Ergebnis gestellt werden.
  • Outer Join • Problem: Beim gewöhnlichen („inner“) Join gehen diejenigen Tupel verloren, die keine Join-Partner in der jeweiligen anderen Relation haben. • Ein Outer Join ergänzt das Join-Ergebnis um die Tupel,  die keinen Joinpartner in der anderen Relation haben. • Das Ergebnis wird mit NULL-Werten aufgefüllt: select * from kunde natural outer join auftrag • Aufstellung aller Möglichkeiten: – [inner] join: keine verlustfreie Relation  – left [outer] join: die linke Relation ist verlustfrei – right [outer] join: die rechte Relation ist verlustfrei – full[outer] join: beide Relationen verlustfrei • Kombinierbar mit Schlüsselworten natural, on, using: select * from L [left/right/full [outer]] natural join R
  • Union, Intersect, Except • Üblicherweise werden mit diesen Operationen die Ergebnisse zweier select-from-where-Blöcke verknüpft: select* from Mitarbeiter where name like‘A%´ union select* from Studenten where name like ‘A%‘ • Bei neueren Datenbanksystemen ist auch möglich: select* from Mitarbeiter union Studenten where... • Es gibt folgende Mengen-Operationen: –union: Vereinigung mit Duplikatelimination –union all: Vereinigung ohne Duplikatelimination –intersect: Schnittmenge –except, minus: Mengen-Differenz • Achtung: Zwei Tupel sind nur dann gleich, wenn alle ihre Attributwerte gleich sind • Die relationale Algebra verlangt, dass die beiden Relationen, die verknüpft werden, das gleiche Schema besitzen (Namen und Wertebereiche) • SQLverlangt nur kompatible Wertebereiche, d.h.: – beide Wertebereiche sind character(Länge usw. egal) – beide Wertebereiche sind Zahlen (Genauigkeit egal) – oder beide Wertebereiche sind gleich • Die Namen der Attribute müssen nicht gleich sein • Befinden sich Attribute gleichen Namens auf unterschiedlichen Positionen, sind trotzdem nur die Positionen maßgeblich (das ist oft irritierend) • Mit dem Schlüsselwort corresponding beschränken sich die Operationen automatisch auf die gleich benannten Attribute (Projektion)  
  • UNION, INTERSECT, EXCEPT corresponding • Mit dem Schlüsselwort corresponding beschränken sich die Operationen automatisch auf die gleich benannten Attribute (Projektion) • Bei corresponding wird vorder Vereinigung automatisch eine Projektion bezüglich aller gleich benannten Attribute durchgeführt • Dies kann man besser durch explizites Aufzählen der Attribute in den select - Klauseln erreichen • Bei corresponding ist ggf. die Reihenfolge der Attribute der erstgenanntenTeilanfrage maßgeblich
  • Änderungs-Operationen • Änderungsoperationen modifizieren den Inhalt eines oder mehrerer Tupel einer Relation • Grundsätzlich unterscheiden wir: – INSERT: Einfügen von Tupeln in eine Relation  – DELETE: Löschen von Tupeln aus einer Relation – UPDATE: Ändern von Tupeln einer Relation • Diese Operationen sind verfügbar als... – Ein-Tupel-Operationen    z.B. die Erfassung eines neuen Mitarbeiters – Mehr-Tupel-Operationen z.B. die Erhöhung aller Gehälter um 2.1%
  • Die Update - Anweisung • Syntax: update relation set attribut1 = ausdruck1 [ , ... , attributn =ausdruckn ] [where bedingung] • Wirkung: In allen Tupeln der Relation, die die Bedingung erfüllen  (falls angegeben, sonst in allen Tupeln), werden die Attributwerte wie angegeben gesetzt. • UPDATE ist i.a. eine Mehrtupel-Operation • Beispiel: update Angestellte set Gehalt = 6000 • Wie kann man sich auf ein einzelnes Tupel beschränken? Spezifikation des Schlüssels in WHERE-Bedg. • Beispiel: update Angestellte set Gehalt = 6000 where PNr = 7  • Der alte Attribut-Wert kann bei der Berechnung des neuen Attributwertes herangezogen werden • Beispiel: Erhöhe das Gehalt aller Angestellten, die weniger als 3000€ verdienen, um 2% update Angestellte set Gehalt = Gehalt * 1.02 where Gehalt < 3000 • UPDATE-Operationen können zur Verletzung von Integritätsbedingungen führen: Abbruch der Operation mit Fehlermeldung.
  • Die DELETE-Anweisung • Syntax: delete from relation [where bedingung] • Wirkung: – Löscht alle Tupel, die die Bedingung erfüllen – Ist keine Bedingung angegeben, werden alle Tupel gelöscht – Abbruch der Operation, falls eine Integritätsbedingung verletzt würde (z.B. Fremdschlüssel ohne cascade) • Beispiel: Löschen aller Angestellten mit Gehalt 0 delete from Angestellte where Gehalt = 0
  • Die INSERT-Anweisung • Zwei unterschiedliche Formen: – Einfügen konstanter Tupel (Ein-Tupel-Operation) – Einfügen berechneter Tupel (Mehr-Tupel-Operation) • Syntax zum Einfügen konstanter Tupel: insert into relation ( attribut1, attribut2,...) values (konstante1, konstante2, ...) • oder: insert into relation values ( konstante1, konstante2, ...)
  • Einfügen konstanter Tupeln wenn die optimale Attributliste hinter dem Relationennamen angegeben ist • Wirkung: Ist die optionale Attributliste hinter dem Relationennamen angegeben, dann... – können unvollständige Tupel eingefügt werden: Nicht aufgeführte Attribute werden mit NULL belegt – werden die Werte durch die Reihenfolge in der  Attributsliste zugeordnet • Beispiel: insert into Angestellte (Vorame, Name, PNr) values ('Donald', 'Duck', 678) PNr Name Vorname ANr 678 Duck Donald NULL  
  • Einfügen konstanter Tupeln wenn die Attributliste nicht angeben ist • Wirkung: Ist die Attributliste nicht angegeben, dann... – können unvollständige Tupel nur durch explizite Angabe von NULL eingegeben werden – werden die Werte durch die Reihenfolge in der DDL-Definition der Relation zugeordnet (mangelnde Datenunabhängigkeit!) • Beispiel: insert intoAngestellte values(678, 'Duck', 'Donald', NULL) Tabelle: PNr Name Vorname ANr 678 Duck Donald NUL
  • Einfügen berechneter Tupel • Syntax zum Einfügen berechneter Tupel: insert intor elation[(attribut1 , ...)] ( select ... from... where... ) • Wirkung: – Alle Tupel des Ergebnisses der SELECT-Anweisung werden in die Relation eingefügt – Die optionale Attributliste hat dieselbe Bedeutung wie bei der entsprechenden Ein-Tupel-Operation – Bei Verletzung von Integritätsbedingungen (z.B. Fremdschlüssel nicht vorhanden) wird die Operation nicht ausgeführt (Fehlermeldung) • Beispiel: Füge alle Lieferanten in die Kunden-Relation ein (mit Kontostand 0) • Datenbankschema: – Kunde (KName, KAdr, Kto) – Lieferant (LName, LAdr, Ware, Preis) insert into Kunde (select distinct LName, LAdr, 0 from Lieferant)