5.4.3.1 Anfragen auf einer Relation A1: Gib alle Angestellten aus, die von Beruf ´Hundezüchter´ sind Selektion a) In „Langform“ SELECT ALL ANGNR, Name, Wohnort, Beruf, AbtNr FROM Angest WHERE Beruf = ´Hundezüchter´ ALL ist „default“, kann also weggelassen werden. b) „1. Kurzform“ SELECT ANGNR, Name, Wohnort, Beruf, AbtNr FROM Angest WHERE Beruf = ´Hundezüchter´ Enthält die Zielliste alle Attribute der Eingangsrelation, darf statt dessen geschrieben werden. c) „2. Kurzform“ SELECT FROM Angest WHERE Beruf = ´Hundezüchter´ Datenbanksysteme 1 16.01.2012 273 Frage: DISTINCT als Spezifikation in der SELECT-Klausel sorgt für Duplikatelimination. Hätten wir im vorliegenden Fall (a-c) auch SELECT DISTINCT schreiben können? Was hätte das DBVS jeweils „daraus machen“ können/sollen? (hoffentlich) gar nichts, will heißen, die DISTINCT-Spezifikation ignorieren! A2: Gib für alle Angestellten Beruf und Wohnort aus und zwar in dieser Reihenfolge Projektion „mehr“ als Algebra SELECT Beruf, Wohnort FROM Angest • WHERE-Klausel weggelassen (keine Selektion), da alle Angestellten erfragt sind. Alternative: SELECT Beruf, Wohnort FROM Angest WHERE true Datenbanksysteme 1 16.01.2012 274 • Attributreihenfolge (Spaltenreihenfolge) in Ergebnisrelation aus „streng relationaler Sicht“ eigentlich bedeutungslos (Attribut/Spaltenmenge!), aber für Ausgabe (Bildschirmdarstellung) für Benutzer natürlich manchmal schon wesentlich aus Gründen der Übersichtlichkeit etc. Frage: Würde diesmal DISTINCT semantisch einen Unterschied bedeuten? SELECT DISTINCT Beruf, Wohnort FROM Angest Was müsste das DBVS hier tun und wie? Duplikate eliminieren, d.h. i.d.R. sortieren (Ausgabe erfolgt dann vermutlich ebenfalls sortiert, obwohl nicht explizit via ORDER BY spezifiziert ... auf so etwas darf man sich als Benutzer/Anwendungsentwickler aber nicht verlassen, sondern wenn Ausgabesortierung benötigt wird, dann stets explizit mit ORDER BY (siehe unten) durchführen!!!!) Datenbanksysteme 1 16.01.2012 275 A3: Gib die Namen aller Angestellten mit AbtNr zwischen 2 und 6 aus Projektion und Selektion a) SELECT Name FROM Angest WHERE AbtNr >= 2 AND AbtNr <= 6 b) oder ... WHERE AbtNr BETWEEN 2 AND 6 c) oder ... WHERE AbtNr IN (2,3,4,5,6) ! Bemerkungen zu c) • Nach IN folgt Multimenge atomarer Werte (die natürlich auch einelementig oder leer sein darf) • Typischerweise Ersatz (Kurzschreibweise) für OR-Verknüpfung: ... AbtNr = 16 OR Abt = 95 OR ... AbtNr IN (16,95,...) • Nach IN darf auch SFW-Ausdruck ( Tupelmenge) stehen betrachten wir später Subquery oder Subselect genannt Datenbanksysteme 1 16.01.2012 276 A4: Erzeugung eines sortierten Anfrageergebnisses: Gib die Angest-Relation (Attribute: Name, Wohnort) aufsteigend sortiert nach den Werten des Attributs Name aus SELECT Name, Wohnort FROM Angest ORDER BY Name ASC Die ASC-Angabe kann weggelassen werden, da „default“. Frage: In welcher Reihenfolge erscheinen die Werte für Wohnort in der Ausgabe? Name Abeln Abeln Dittrich Dittrich Dittrich Kühne Kühne Kühne Datenbanksysteme 1 Wohnort Karlsruhe Mannheim Jena Augsburg Zittau Zwickau Leipzig Leipzig 16.01.2012 unsortiert („zufällige“ Reihenfolge) 277 A5: Erzeuge eine Ausgabe wie bei A4, jedoch sollen innerhalb einer Namensangabe in der Ausgabe die Wohnortangaben absteigend sortiert sein SELECT Name, Wohnort FROM Angest ORDER BY Name, Wohnort DESC Wir hätten auch formulieren können: Name sei 1. Sortierkriterium (1. Priorität), Wohnort 2. Sortierkriterium (2. Priorität) Name Abeln Abeln Dittrich Dittrich Dittrich Kühne Kühne Kühne Datenbanksysteme 1 Wohnort Mannheim Karlsruhe Zittau Jena Augsburg Zwickau Leipzig Leipzig 16.01.2012 Reihenfolge der Sortierkriterien in der ORDER BY Klausel ist wesentlich (hier: ERST nach Name, DANN „lokal“ nach Wohnort) 278 Hinweis: In attr_ref in der ORDER BY-Klausel ist es auch gestattet, eine Attributnummer statt eines Attributnamens zu verwenden (Position des Attributs in der Zielliste) Im Beispiel: SELECT Name, Wohnort FROM Angest ORDER BY 1, 2 DESC Macht das so üblicherweise Sinn? Nein!!! aber ... A6: Gib die Namen aller Angestellten aus aufsteigend nach der Summe aus Jahresurlaub und Resturlaub (angenommen, die beiden Attribute existieren in Angest) SELECT Name, Jahresurlaub + Resturlaub FROM Angest arith. Ausdruck ORDER BY 2 Datenbanksysteme 1 16.01.2012 279 A7: Benutzung von eingebauten Funktionen („built-in functions“) in SQL (auch „set functions“) SQL kennt u.a. die eingebauten Funktionen COUNT, SUM, AVG, MIN, MAX, die somit innerhalb von SQLAnweisungen benutzt werden können Wieviele Mitarbeiter arbeiten in unserer Firma? Schöner/klarer wäre: SELECT COUNT( ) COUNT(SELECT FROM Angest) FROM Angest COUNT(Angest) A8: Wieviele Mitarbeiter wohnen in Erfurt? Später: Zusätzlich zu den eingeb. SELECT COUNT( ) Funktionen gibt es noch sog. FROM Angest User-defined Functions (UDF) WHERE Wohnort = ´Erfurt´ A9: Wie lautet die maximale Abteilungsnummer? Wenn´s gut läuft, kann AnfrageSELECT MAX(AbtNr) ergebnis aus entsprechendem FROM Angest Index entnommen werden entsprechendes ist mit MIN, SUM und AVG möglich (wenngleich bei unserer Angest-Relation nicht immer semantisch sinnvoll anwendbar) Datenbanksysteme 1 16.01.2012 280 A10: Benutzung von eingebauten Funktionen in Zshg. mit dem GROUP BY Operator Gib eine Liste der Wohnorte aus zusammen mit dem mittleren Resturlaub der Mitarbeiter, die jeweils an diesem Ort wohnen SELECT Wohnort, AVG (Resturlaub) FROM Angest GROUP BY Wohnort die Durchschnittsbildung AVG wird hier nicht auf die gesamte Angest-Relation einmal angewandt, sondern jeweils für eine Gruppe von Mitarbeitern mit gleichem Wohnort. Man kann sich hier vorstellen, dass eine solche Gruppierung vom DBVS intern als Zwischenergebnis* erzeugt wird. 1. Gruppe 2. Gruppe 3. Gruppe Wohnort Aachen Aachen Berlin Erfurt Erfurt Erfurt Resturlaub 14 10 8 6 12 9 AVG = 12 AVG = 8 AVG = 9 * ob das DBVS wirklich ein Zwischenergebnis dieser Art materialisiert, sei einmal dahingestellt (nach Möglichkeit eher nicht ...) Datenbanksysteme 1 16.01.2012 281 A11: Formulierung von Gruppierungs-Nebenbedingungen / Auswahl bestimmter Gruppen Anfrage wie bei A10, es soll aber die Durchschnittsbildung AVG – und zusätzlich eine Summenbildung SUM – nur für solche Gruppen erfolgen, die mindestens 3 Elemente! besitzen und außerdem sollen Mitarbeiter mit Beruf Ingenieur nicht einbezogen werden SELECT Wohnort, AVG (Resturlaub), SUM (Resturlaub) FROM Angest WHERE Beruf <> ´Ingenieur´ GROUP BY Wohnort HAVING COUNT ( ) >= 3 Ausführungsreihenfolge (vgl. Folie 262): 1. SELECT ... FROM ... WHERE ... (ohne „built-in functions“) 2. GROUP BY ... 3. „built-in functions“ 4. HAVING ... 5. ORDER BY ... Datenbanksysteme 1 16.01.2012 282 A12: Gib mir jenen Angestellten, der den geringsten Resturlaub aufweist (soll für eine Beförderung vorgeschlagen werden): 1. Lösung SELECT FROM Angest ORDER BY Resturlaub liefert (auch) den gesuchten Angestellten, sogar als erstes Ergebnistupel, aber auch alle anderen Angestelltentupel 2. Lösung SELECT FROM WHERE liefert 1 Wert Angest Resturlaub = subquery in der WHERE-Klausel, die Bezug auf eine Relation nimmt, hier „zufälligerweise“ auf die gleiche Relation, wie in der Anfrage selbst (Angest) leitet über auf Anfragen, die auf mehr als eine Relation Bezug nehmen (siehe 5.4.3.2 unten) Datenbanksysteme 1 (SELECT MIN (Resturlaub) FROM Angest) 16.01.2012 283 A13: Formulierung von unscharfen Suchanfragen, „pattern matching“ Was ist das Problem / die Fragestellung? Gib mir den Wohnort des Angestellten Graf SELECT Wohnort FROM Angest WHERE Name = ´Graf´ Angest ANGNR Name Wohnort Beruf AbtNr ... 4711 ... ... Graf, P. ... ... Mannheim ... ... Jongleur ... ... ... ... Anfrage liefert keinen Treffer, da ´Graf´ ´Graf, P.´ statt dessen wie folgt schreiben: SELECT Wohnort FROM Angest Wertpräfix WHERE Name LIKE ´Graf%´ sucht in Spalte Name nach Attributwerten, die mit ´Graf´ beginnen (findet somit z.B. auch ´Grafinski´ u.ä.) Datenbanksysteme 1 16.01.2012 284 SELECT FROM WHERE Wohnort Angest Name = ´Graf´ OR Name LIKE ´Graf%´ Allgemeines zum Vergleichoperator LIKE • Anwendbar auf Character-Attribute fester oder variabler Länge • Zwei Markierungszeichen („wild cards“): % an der durch % markierten Stelle können beliebig viele (auch keine!) zu ignorierende Zeichen stehen _ („underscore“) an der durch _ markierten Stelle wird genau ein Zeichen ignoriert • % und _ dürfen in einem Suchausdruck in beliebiger Weise gemischt vorkommen • Beispiele a) ... Wohnort LIKE ´H%b_rg´ liefert Treffer bei Hamburg, Hammelburg, Heidelberg, Humburg, Hbirg, nicht aber bei Hbrg oder Humbug b) ... Name LIKE ´M_ _er´ liefert Treffer bei Meier, Maier, Meyer, Mayer, aber auch bei Mauer etc. Datenbanksysteme 1 16.01.2012 285 • LIKE darf negiert werden NOT LIKE • LIKE kennt keine Wortgrenzen (Textsemantik: Wo hört ein Wort auf, wo ein Satz etc.) reines „pattern matching“, das den gesamten Character-Attributwert als eine (unstrukturierte) Zeichenkette auffasst und durchsucht; Anfragen 1. der Art „Finde alle Angestellten, wo im Attribut Stellenbeschreibung (Character) das Wort Datenbank auftritt“ nicht so einfach zu stellen LIKE erfordert häufig sequentielle Suche im Datenbestand seitens des DBVS (ein Tupel nach dem anderen ...), lediglich bei 2. Endmarkierung (à la ´Datenbank%´ oder ´Datenban_´ ...) kann BaumIndex benutzt werden, falls vorhanden • Phonetische Suche (ähnliche Aussprache) nicht abgedeckt, aber in 3. Produkten teils vorhanden Merken bspw.: DB2 Text Extender Datenbanksysteme 1 16.01.2012 286 5.4.3.2 Anfragen auf mehreren Relationen A14: Bilde das Kreuzprodukt der Relationen Angest und Projekt SELECT FROM Angest, Projekt Wohnort Beruf AbtNr PRONR PName PBeschr PLeiter 112 112 112 205 Müller Müller Müller Winter Erfurt Erfurt Erfurt Zwickau Ingenieur Ingenieur Ingenieur Programmierer 3 3 3 3 27 16 84 27 Pkw 2000 Wankel 99 Trabbixx Pkw 2000 xyz... yxz... zyx... xyz... 205 117 117 205 ... ... ... ... ... ... ... ... Name ... ANGNR es wird ein Anfrageergebnis erzeugt, das alle Spalten der beteiligten Relationen umfasst und in dem jedes Tupel der einen Relation mit jedem Tupel der anderen Relation zu jeweils einem Ergebnistupel verknüpft („konkateniert“) wird im Beispiel 4 Tupel in Angest, 3 in Projekt 12 Tupel im Anfrageergebnis dieses Kreuzprodukt wird in der Realität weniger gebraucht, sondern Join mit genauerer Angabe der Bedingung, unter der Tupel verknüpft werden sollen (vgl. Relationenalgebra, Relationenkalkül) Kreuzprodukt ist Spezialfall des allg. Joins Datenbanksysteme 1 16.01.2012 287 A15: Gib für jeden Mitarbeiter (Name) aus, in welchen Projekten ( PRONR) er mit welchem Prozentsatz mitarbeitet Join zwischen der Angest- und der Mitarbeit-Relation SELECT Name, PRONR, Prozent FROM Angest, Mitarbeit WHERE Angest.ANGNR = Mitarbeit.ANGNR oder auch: SELECT Angest.Name, Mitarbeit.PRONR, Mitarbeit.Prozent FROM Angest, Mitarbeit WHERE Angest.ANGNR = Mitarbeit.ANGNR oder auch: SELECT a.Name, m.PRONR, m.Prozent FROM Angest a, Mitarbeit m WHERE a.ANGNR = m.ANGNR häufig so benutzt mit Tupelvariablen a und m Datenbanksysteme 1 16.01.2012 288 Bemerkungen dazu: • Eine genauere Bezeichnung der Attributnamen – durch Voranstellen des Relationsnamens oder einer entsprechend vereinbarten Tupelvariablen (s.o.) – muss nur dann vorgenommen werden, wenn ansonsten keine Eindeutigkeit in der Bezeichnung (welches Attribut in welcher Relation ist gemeint?) gegeben ist • In einigen Fällen muss mit Tupelvariablen gearbeitet werden, z.B. wenn eine Relation mit sich selbst „gejoined“ wird (z.B. bei Modellierung von rekursiven 1:n-Beziehungen / Abfragen darauf) A16: Wie bei A15, aber die Ausgabe soll die Attribute Name, PName, Prozent umfassen SELECT a.Name, p.PName, m.Prozent FROM Angest a, Projekt p, Mitarbeit m WHERE a.ANGNR = m.ANGNR AND p.PRONR = m.PRONR Join über 3 Tabellen Datenbanksysteme 1 16.01.2012 289 Allgemeine syntaktische Struktur des Join (vereinfacht) SELECT [ALL | DISTINCT] Attributliste FROM Rel1, Rel2, ..., Reln (n 2) WHERE Reli.Attributname θ1 Relj.Attributname AND Relk.Attributname θ2 Rell.Attributname AND ... AND Rely.Attributname θx Relz.Attributname mit θx є {=, <>, >, >=, <, <=} Hinweis: Statt Reli...z können in WHERE-Klausel auch Tupelvariablen benutzt werden oder können ganz entfallen (vgl. vorherige Folien) Der bei weitem häufigste Vergleichsoperator ist das "=" (Equi-Join)!! A17: Wie bei A16, aber es sollen nur die in Erfurt wohnenden Mitarbeiter und nur die Projekte, in deren Beschreibung nicht Wartburg auftritt, berücksichtigt werden SELECT ... FROM ... WHERE ... AND a.Wohnort = ´Erfurt´ AND p.PBeschr NOT LIKE ´%Wartburg´ Datenbanksysteme 1 16.01.2012 290 Soweit betrachtet: Join, wie auch im Zshg. mit Relationenalgebra eingeführt sog. „inner join“ Nachteil/Effekt: Tupel in einer Relation, für die es kein „Gegenstück“ in einer anderen Relation gibt (m.a.W.: für die die Join-Bedingung nie erfüllt ist), tauchen im Join-Ergebnis nicht auf, „gehen also verloren“. Im Beispiel: Angestellte, die in keinem Projekt mitarbeiten bzw. Projekte ohne Mitarbeiter. Lösung (SQL92ff.!) Outer Join left outer Join full outer Join right outer Join Semantik (am Beispiel) a) left outer Join zwischen Angest und Mitarbeit linker Operand Datenbanksysteme 1 16.01.2012 rechter Operand 291 Mitarbeiter 205 sei aktuell in keinem Projekt tätig im Join-Ergebnis taucht er trotzdem auf, wobei die undefinierten Werte (PRONR, Prozent) mit NULL belegt sind Join-Ergebnis („left outer join“) ANGNR Name Wohnort Beruf AbtNr PRONR Prozent 27 NULL NULL 100 NULL NULL 198 198 Schumann Jena Jena Kaufmann Kaufmann 4 4 27 16 70 30 ... ... ... 3 3 5 ... Ingenieur Programmierer Hundezüchter ... Erfurt Zwickau Weimar ... Müller Winter Rüllich ... 112 205 117 diese beiden Tupel wären beim „inner join“ im Ergebnis nicht vorhanden Schreibweise in SQL92-Notationff.*: SELECT a.ANGNR, a.Name, a.Wohnort, a.Beruf, a.AbtNr, m.PRONR, m.Prozent expliziter Join-Operator FROM (Angest a LEFT OUTER JOIN LEFT OUTER Variante Mitarbeit m des Natural Join ON a.ANGNR = m.ANGNR) ! * wird so heute nicht von allen DBMS-Produkten syntaktisch verstanden Datenbanksysteme 1 16.01.2012 292 b) right outer Join zwischen Mitarbeit und Projekt linker Operand rechter Operand Projekt 84 sei aktuell ohne Mitarbeiter, da neu initiiert SELECT m.ANGNR, m.PRONR, p.PName FROM (Mitarbeit m LEFT OUTER JOIN Projekt p ON m.PRONR = p.PRONR) Join-Ergebnis („right outer join“) ANGNR PRONR PName 112 198 198 NULL 27 27 16 84 Pkw 2000 Pkw 2000 Wankel 99 Trabbixx RIGHT OUTER Variante des Natural Join Tupel wäre beim „inner join“ im Ergebnis nicht vorhanden c) full outer Join: lässt Tupel sowohl aus linkem als auch aus rechtem Operanden bei Join-Ausführung „überleben“ im Join-Ergebnis. [Im Fall unserer Bsp.-Tabellen (Folie .......?) nicht sinnvoll einsetzbar.] Datenbanksysteme 1 16.01.2012 293 Abschließende Bemerkungen zum Thema Join (in SQL92ff.) SQL92 hat – neben full/left/right outer join – noch weitere syntaktische und semantische Erweiterungen bzgl. Join-Möglichkeiten gebracht (hier nur kurz erwähnt): • CROSS JOIN: Explizite Notation für kartesisches Produkt SELECT . . . FROM Angest CROSS JOIN Projekt in beiden Fällen wird jedes Tupel SELECT FROM des linken Operanden mit jedem Tupel des rechten Operanden verknüpft (vgl. auch Folie 278) ... Angest, Projekt • UNION JOIN: SELECT FROM Angest UNION JOIN Projekt ANGNR Name Wohnort Beruf AbtNr PRONR PName PBeschr PLeiter 112 205 117 198 NULL NULL NULL Erfurt Zwickau Weimar Jena NULL NULL NULL Ingenieur Programmierer Hundezüchter Kaufmann NULL NULL NULL 3 3 5 4 NULL NULL NULL NULL NULL NULL NULL xyz... yxz... zyx... Müller Winter Rüllich Schumann NULL NULL NULL Datenbanksysteme 1 16.01.2012 NULL NULL NULL NULL 27 16 84 NULL NULL NULL NULL Pkw 2000 Wankel 99 Trabbixx NULL NULL NULL NULL 205 117 117 294 • NATURAL JOIN: Explizite Notation für natürlichen Verbund (Equi-Join über namensgleiche Attribute in linkem und rechtem Join-Operanden) SELECT Name, PRONR, Prozent FROM Angest NATURAL JOIN Mitarbeit SELECT FROM WHERE Name, PRONR, Prozent Angest, Mitarbeit Angest.ANGNR = Mitarbeit.ANGNR SELECT FROM Name, PRONR, Prozent (Angest JOIN Mitarbeit ON Angest.ANGNR = Mitarbeit.ANGNR ) SELECT FROM Name, PRONR, Prozent (Angest JOIN Mitarbeit USING ANGNR ) Explizite Join-Notation (d.h. mit ...JOIN-Operator) - erspart Schreibarbeit / erhöht Lesbarkeit - reduziert Fehlermöglichkeiten - ist näher an Relationenalgebraschreibweise - eröffnet neue semantische Möglichkeiten, etwa beim Outer Join Datenbanksysteme 1 16.01.2012 295 Formulierung von Subqueries/Subselects (vgl. auch Folie 274) und Existenzbedingungen in Zusammenhang mit SQL-Anfragen 3 verschiedene syntaktische/semantische Formen*: a) SELECT Attributliste FROM R1, R2, ..., Rn WHERE [NOT] EXISTS Subquery !! (SELECT-FROM-WHERE-Ausdruck) b) SELECT FROM WHERE Subquery c) Attributliste R1, R2, ..., Rn Ri.Attributname < <= = <> >= > ANY ALL !! (SELECT-FROM-WHERE-Ausdruck) SELECT Attributliste FROM R1, R2, ..., Rn WHERE Ri.Attributname IN Subquery !! (SELECT-FROM-WHERE-Ausdruck) • Wir sprechen von einer Subquery, wenn in der WHERE-Klausel eines SFW-Ausdrucks wieder ein SFW-Ausdruck auftritt (darf auch beliebig weiter geschachtelt werden!) • Wir unterscheiden unkorrelierte und korrelierte Subqueries ; bei korrelierten Subqueries „nimmt die innere Query (d.h. die Subquery) Bezug auf die äußere“ (siehe Bsp. unten) * etwas vereinfacht Datenbanksysteme 1 16.01.2012 296 Beispiel: Gib die Nummern (ANGNR) und Namen aller Angestellten aus, die in (irgend)einem Projekt zu 100% mitarbeiten 0. Möglichkeit (JOIN) SELECT a.ANGNR, a.Name FROM Angest a, Mitarbeit m WHERE a.ANGNR = m.ANGNR AND m.Prozent = 100 [Nebenbemerkung/Frage: Treten im Anfrageergebnis evtl. Duplikate auf?] 1. Möglichkeit (mit EXISTS) quadratische Komplexität SELECT a.ANGNR, a.Name FROM Angest a stellt Korrelation her zwischen innerer WHERE EXISTS Query (Subquery) und äußerer Query! (SELECT „Nested-Loop-Modell“ FROM Mitarbeit m WHERE a. ANGNR = m.ANGNR AND m.Prozent = 100) • Korrelierte Subquery wg. Bezug „nach außen“ • Es wird – durch EXISTS – lediglich getestet, ob Subquery – Ergebnis leer oder nicht leer • Pro Tupel „außen“ 1 Durchlauf durch komplette innere Relation“ (kann DBMS-intern aber durchaus ggf. effizienter realisiert sein) Datenbanksysteme 1 16.01.2012 297 2. Möglichkeit (mit ANY) SELECT a.ANGNR, a.Name FROM Angest a WHERE a.ANGNR = ANY (SELECT ANGNR FROM Mitarbeit WHERE Prozent = 100) lineare Komplexität ermittelt die Nummern all jener Angestellten, die in (irgend)einem Projekt zu 100% mitarbeiten • Unkorrelierte Subquery, da kein Bezug „nach außen“ • Innere Query (Subquery) muss nur einmal (!) ausgeführt werden Zwischenergebnis. Anschließend wird für jeden ANGNR-Wert der „äußeren Relation“ getestet, ob in diesem Zwischenergebnis enthalten [ob´s ein reales DBVS genau so tut, sei einmal offengelassen] • ANY prüft, ob irgendein Ergebniswert der Subquery (Zwischenergebnis) mit dem „außen“ gegebenen Wert – hier : a.ANGNR – übereinstimmt • Bei ALL müsste der „außen“ gegebene Wert mit allen durch die Subquery gelieferten Ergebniswerten übereinstimmen. • Ohne ALL/ANY: Subquery muss genau einen Wert (Tupel) zurückliefern Datenbanksysteme 1 16.01.2012 298 3. Möglichkeit (mit IN) SELECT a.ANGNR, a.Name FROM Angest a WHERE a.ANGNR IN (SELECT ANGNR FROM Mitarbeit WHERE Prozent = 100) lineare Komplexität • Äquivalent zu Formulierung mit ANY (obige 2. Möglichkeit) • Unkorrelierte Subquery • Innere Query muss nur einmal(!) ausgeführt werden Hinweis: Die obigen Beispiele (Möglichkeiten 0-3) könnten den Eindruck erwecken, jede Anfrage ließe sich stets auf diese 4 (äquivalenten) Arten in SQL formulieren. Dem ist in der Allgemeinheit aber nicht so!! • Wo es mehrere Möglichkeiten zur Formulierung gibt: Die wählen, die einem am „natürlichsten“ erscheint. Datenbanksysteme 1 16.01.2012 299 5.4.3.3 Sichten (Views) in SQL • Erzeugung „virtueller Relationen“ aufbauend auf Basisrelationen* sowie ggf. anderen, vorher bereits erzeugten virtuellen Relationen • Beliebig „schachtelbar“ (Sichten über Sichten ...) • Zweck: Sprachmittel zur Realisierung der Externen Ebene gemäß ANSI/SPARC-Architektur - „Entkopplung“ der Benutzer auf der Externen Ebene von den tiefer liegenden Ebenen ( Datenunabhängigkeit!!) - Benutzer brauchen gesamtes, oftmals sehr komplexes Datenbankschema (= konzeptuelle Ebene) nicht oder nicht im Detail zu kennen - Zugeschnittene Sichten auf individuelle Benutzergruppen und seine/deren Aufgaben - Änderungen der konzeptuellen Ebene „schlagen“ nicht * Basisrelationen sind Relationen, die mit create table erzeugt wurden Datenbanksysteme 1 16.01.2012 300 unbedingt mehr unmittelbar zum Benutzer hin durch (ggf. lediglich Anpassung der Sichtdefinition durch Datenbankadministrator/Anwendungsadministrator; Benutzer muss dies gar nicht unbedingt mitbekommen, arbeitet unbeeinflusst weiter) - Möglichkeit zur zielgerichteten Vergabe von Zugriffsrechten für den Benutzer durch den Administrator (Datensicherheitaspekt) [Bsp.: Ein Angestellter soll stets nur seinen eigenen Datensatz in der Angest-Relation sehen dürfen, nicht aber die Datensätze anderer Mitarbeiter] • Sichten – „virtuelle Relationen“ – werden durch SQL-Queries (SFWKonstrukt) „on top“ von Basisrelationen und/oder anderen Sichten definiert • Sichten unterscheiden sich – einmal definiert – für den Benutzer nicht (wesentlich) von Basisrelationen Anfragen gegen Sichten sind unbeschränkt/beliebig erlaubt, UPDATE/INSERT/DELETE allerdings eingeschränkt Datenbanksysteme 1 16.01.2012 301 Syntax zur Sichtdefinition in SQL* ** CREATE VIEW sicht AS ( attribut , ) subselect zur Umbenennung von Attributen (siehe unten)! Entsprechend zum Löschen von Sichten: DROP VIEW sicht Beispiele: • Definition einer Sicht auf Angest, die die Spalte Beruf ausgeblendet (Projektion) und zudem die Tupel mit AbtNr>7: CREATE VIEW MeineSichtderDinge AS definiert Rel.schema SELECT ANGNR, Name, Wohnort, AbtNr der VIEW FROM Angest WHERE AbtNr<=7 * entnommen aus: K. Neumann ... Datenbanksysteme 1 ** etwas vereinfacht 16.01.2012 302 gibt es Situationen, wo (Um)Benennung nötig ist? • Definition einer Sicht auf Angest, die (nur) die Nummern und Namen jener Angestellten umfasst, die in (irgend) einem Projekt zu 100% mitarbeiten (vgl. Folie 288): CREATE VIEW Hundertprozentige AS ´Im Prinzip´ Bsp. SELECT a.ANGNR, a.Name für updatable view FROM Angest a, Mitarbeit m WHERE a.ANGNR = m.ANGNR AND m.Prozent = 100 • Sichten dürfen auch Daten aus mehreren (Basis-)Relationen und/oder anderen Sichten umfassen: CREATE VIEW HundertprozentigePlus AS SELECT h.ANGNR, h.Name, m.PRONR FROM Hundertprozentige h, Mitarbeit m Beliebige Schachtelbarkeit WHERE h.ANGNR = m.ANGNR • ... und es dürfen Attribute umbenannt werden: CREATE VIEW HundertprozentigePlusPlus (A, N, P) AS SELECT h.ANGNR, h.Name, m.PRONR FROM ... WHERE . . . Datenbanksysteme 1 16.01.2012 303 • Realisierung virtueller Attribute zu Relationen mittels einer Sicht (virtuelle Attribute können beim E/R-Modell vereinbart werden und müssen bei der Umsetzung E/R relational berücksichtigt werden): Name als virtuelles Attribut zur Relation Mitarbeit: CREATE VIEW MitarbeitErweitert AS SELECT m.PRONR, m.ANGNR, m.Prozent, a.Name FROM Mitarbeit m, Angest a WHERE m.ANGNR = a.ANGNR Benutzer sieht MitarbeitErweitert als (virtuelle) Relation mit einer zusätzlichen Spalte gegenüber Mitarbeit Noch interessanter: Spaltenwert wird berechnet Abschließende Bemerkungen zu Sichten • Sehr mächtiges Konzept zur Beschreibung der Externen Ebene / Externer Schemata, viel mächtiger als entsprechende Möglichkeiten bei IMS/CODASYL! (keine Werteabhängigkeit bei Definition) • Probleme im Zusammenhang mit Änderungen auf Sichten (SQLINSERT, -UPDATE, -DELETE) Rückabbildung auf zugrundeliegende Basisrelationen nicht immer eindeutig möglich!! Datenbanksysteme 1 16.01.2012 304 (Extremes) Beispiel (vgl. Folie 272): CREATE VIEW Resturlaubsstatistik (Wohnort, DurchschnittlResturlaub AS SELECT Wohnort, AVG(Resturlaub) FROM Angest GROUP BY Wohnort INSERT INTO Resturlaubsstatistik VALUES (´Jena´, 24) SQL92ff. schränkt „updatability“ von Sichten stark ein (u.a. kein Vorkommen von DISTINCT in Sichtdefinition, keine arith. Ausdrücke / keine Aggregatfunktionen in Zielliste, kein GROUP BY / HAVING, kein Join als Grundlage der Sichtfunktion) reale Systeme weichen davon oft teils wiederum stark ab (lassen mehr/weniger/anderes zu). im Einzelfall in Systembeschreibung nachlesen / „ausprobieren“ Datenbanksysteme 1 16.01.2012 305 CHECK OPTION als Zusatz zur Sichtdefinition INSERT INTO MeineSichtderDinge VALUES (666, ´Müller´, ´Lüdenscheid´, 9) Will man dies erlauben? ist jedenfalls zunächst nicht verboten! Warum? Explizites Verbieten mittels CREATE VIEW MeinewasserdichteSichtderDinge AS SELECT . . . FROM ... WHERE . . . WITH CHECK OPTION Änderungen der Sicht, die den in ihr nicht sichtbaren Teil der Datenbank beeinflussen, werden erkannt und zurückgewiesen. Bildlich: DB INSERT Sicht UPDATE Datenbanksysteme 1 16.01.2012 306 5.4.3.4 Vergabe von Zugriffsrechten • Zugriff zu einer Relation / ihren Daten hat zunächst nur der Benutzer, der sie erzeugt hat besitzt alle Rechte • In realen Anwendungen: Datenbankadministrator ist „Eigentümer“ der DB und damit Inhaber aller Rechte selektive, zielgerichtete Weitergabe erforderlich! Syntax zur Vergabe von Zugriffsberechtigungen relation GRANT ALL ON PUBLIC TO sicht! SELECT benutzer , INSERT WITH GRANT OPTIOM DELETE UPDATE ( attribut REVOKE dient entsprechend zur Zurücknahme von Rechten ) / , Datenbanksysteme 1 16.01.2012 307 Beispiele/Bemerkungen: • Benutzer KK soll die Berechtigung zum Lesen der Angest-Relation erhalten und ihm soll auch gestattet werden, diese Berechtigung weiterzugeben: GRANT SELECT ON Angest TO KK WITH GRANT OPTION • Benutzer NOWI soll nur die Spalte Wohnort von MeineSichtderDinge ändern dürfen (wäre sonst ja auch noch schöner ...), Weitergabe dieser Berechtigung sei unzulässig: GRANT UPDATE (Wohnort) ON MeineSichtderDinge TO NOWI • Jedermann soll das Recht erhalten, die Projekt-Relation zu lesen: GRANT SELECT ON Projekt TO Public Datenbanksysteme 1 16.01.2012 308 6. Einführung zum Thema Transaktionsverwaltung / Fehlerbehandlung (/ Synchronisation in Datenbanksystemen) 6.1 Was ist eine Transaktion und wozu braucht man sie? Transaktion = Folge zusammengehöriger Operationen (bei relationalen Datenbanksystemen: SQL-Anweisungen) auf der Datenbank – wobei es sich um Lese- und Schreiboperationen handeln kann – für die bestimmte Eigenschaften gelten sollen (s.u.) M.a.W.: Eine Art „Klammerung“ von Operationen, wobei die „öffnende“ (Begin of Transaction) und „schließende“ (End of Transaction, Commit Transaction, Abort Transaction ) Klammer vom Benutzer bzw. der Anwendung – ROLLBACK bei eingebettetem SQL – gesetzt wird. OP1 OP2 OP3 OP4 OP5 OP6 BOT OP7 OP8 OP9 t EOT Die Operationen (SQL-Anweisungen) bilden eine Transaktion Datenbanksysteme 1 16.01.2012 309 Operationen auf Datenbanken finden ausschließlich im Rahmen von Transaktionen statt, d.h. es gibt keine Operationen „außerhalb“ von TAen! (Im Extremfall bildet jede Operation für sich eine Transaktion.) implizite Op-Klammerung als Transaktion, DBMS veranlasst OP1 OP2 OP3 OP4 OP5 OP6 OP7 t eine eigene Transaktion pro Operation (der nicht so interessante Fall ...) Transaktionseigenschaften (ACID-Eigenschaften (Härder/Reuter 1983)) • A = Atomarität (atomicity) Eine Transaktion wird entweder komplett oder gar nicht ausgeführt: all or nothing – Prinzip M.a.W.: Es darf nicht passieren, dass eine Transaktion im „halbfertigen“ Zustand verbleibt (durch Abbruch, „Absturz“ o.ä.), d.h. einige Änderungen auf der Datenbank ausgeführt wurden, andere hingegen nicht Datenbanksysteme 1 16.01.2012 310 • C = Konsistenz (consistency) Eine Transaktion überführt die Datenbank per Definition von einem logisch konsistenten Zustand (alle Integritätsregeln gelten) in einen logisch konsistenten Zustand (alle Integritätsregeln gelten), bildlich: OP1 OP2 OP3 OP4 OP5 BOT Datenbank logisch konsistent (integer) mindestens 2 OPi ändern (sonst langweilig) OP6 t EOT Datenbank hier möglicherweise inkonsistent (nicht alle Integritätsregeln erfüllt) Bsp.: Umbuchung von einem Konto auf ein anderes Datenbank logisch konsistent (integer) • I = Isolation Im Mehrbenutzerbetrieb Das, was innerhalb einer Transaktion geschieht (d.h. die durchgeführten Datenbankänderungen), wird erst bei EOT nach außen hin sichtbar (d.h. für andere, parallel ablaufende Transaktionen im Mehrbenutzerbetrieb) Datenbanksysteme 1 16.01.2012 311 Bsp.: a) Transaktion T1 macht Umbuchung von einem Konto auf ein anderes, T2 läuft parallel T1 OP1 OP2 ändert OP1 T2 liest ... t ohne Isolation würde T2 hier inkonsistente Datenbank sehen!! b) Gleiches Szenarium wie bei a), aber Transaktion T1 wird nach OP2 abgebrochen (Abort) T1 T2 OP1 OP2 Abort OP1 ... ändert liest t Isolation ermöglicht u.a. das isolierte Zurücksetzen einer Transaktion im Fehlerfall!! Datenbanksysteme 1 ohne Isolation würde T2 hier Datenbankzustand sehen, der von T1 anschließend (durch Abort) wieder „zurückgenommen“ wurde, also so nicht für die Außenwelt bestimmt war T2 wäre u.U. ebenfalls zum Abort (Transaktionsabbruch) gezwungen!! 16.01.2012 312 • D = Dauerhaftigkeit (durability) Wenn eine Transaktion erfolgreich zum Ende gekommen ist, d.h. mit commit transaction abgeschlossen hat, dann müssen die von ihr durchgeführten Änderungen auch im evtl. nachfolgenden Fehlerfall („Systemabsturz“, Platten-Crash) überleben* erfolgreiche Ende OP1 OP2 OP3 OP4 OP5 BOT t Commit *bzw. vom DBVS automatisch rekonstruierbar sein M.a.W.: Benutzer muss sich darauf verlassen können, dass seine durchgeführten und mit Commit „freigegebenen“/„festgeschriebenen“ Änderungen auch wirklich Bestand haben ACID-Eigenschaften von Transaktionen erstmals formuliert von Härder/Reuter 1983 (ACM Computing Surveys) Jim Gray = „Erfinder“ des Transaktionskonzept bzw. erste wissenschaftliche Veröffentlichungen dazu in den 1970ern Datenbanksysteme 1 16.01.2012 313 6.2 Fehlerszenarien zunehmende Disaster Transaktionsversagen a) Systemversagen b) Externspeicherversagen c) a) Transaktionsversagen (TA-Abbruch, Transaction Failure) Eine einzelne Transaktion erreicht nicht ihr normales Ende, sondern bricht ab (Abort Transaction durch Benutzer/Anwendung oder durch DBVS) häufig hoffentlich nicht so häufig Gründe: - Benutzer hat sich´s anders überlegt, hat Fehler bemerkt o.ä. - „Absturz“ eines Anwendungsprogramms (mit eingebettetem SQL) - Inkorrekte Eingabedaten Benutzer/Anwendung beschließt daraufhin Abbruch - Anwendungsprogramm „meldet sich nicht mehr“ - Deadlock (Verklemmung) o.ä. - ... Datenbanksysteme 1 16.01.2012 314 b) Systemversagen (Systemausfall, System Failure (Crash)) Das DBVS „stürzt ab“, d.h. die gesamte DB-Verarbeitung wird abrupt unterbrochen (alle lfd. Transaktionen (und „mehr“) betroffen, ggf. auch bereits abgeschlossene TA betroffen) Gründe: - DBVS-Fehler - BS-Fehler - Hardware-Versagen (Defekt, Stromausfall ...) Konsequenz: Hauptspeicherinhalt geht verloren (Systempuffer, Sperrtabellen ...), Platteninhalte bleiben jedoch erhalten + intakt (Annahme) c) Externspeicherversagen (Media Failure) Datenverlust auf Externspeicher; Datenbank ganz oder teilweise zerstört Gründe: - Head Crash, „magnetische Alterung“, alle möglichen Ursachen für Plattendefekt Frage nun: Wie lassen sich ACID-Eigenschaften trotzdem garantieren (vor allem „A“ und „D“) Fehlerbehandlungsmaßnahmen Datenbank-Recovery Datenbanksysteme 1 16.01.2012 315 6.3 Klassifikation von Fehlerbehandlungsmaßnahmen Datenbank-Recovery a) Fehlerbehandlung für Transaktionsversagen DBVS setzt betroffene TA auf ihren Anfangszustand zurück, d.h. alle Änderungen am DB-Zustand, die von der TA bereits vorgenommen wurden, werden rückgängig gemacht (Transaction Rollback) Warum?: Garantieren von A tomarität Wie?: DBVS protokolliert i.d.R. die Änderungen am Datenbankzustand (z.B. Tupelmodifikation) in Form von before images (Tupel vor der Modifikation) und after images (Tupel nach der Modifikation) sog. Protokoll(datei) (Log[File]) auf Platte before images aus Protokoll(datei) können zum Rücksetzen der Änderungen (Rollback) benutzt werden: automatisch durchs DBVS!!! Datenbankfehlerbehandlung erfordert Redundanz (natürlich!) Datenbanksysteme 1 16.01.2012 316 b) Fehlerbehandlung für Systemversagen Szenarium: (Bsp.) D T1 D! T2 T3 T4 „Nachgefahren“ CP CP-Int. Crash CP t DBVS führt (automatisch oder vom DBA veranlasst) Wiederanlauf (Restart, ´Warmstart´) durch verbunden mit Crash Recovery Was ist zu tun? - T3 und T4 müssen zurückgesetzt werden wg. A tomarität mit Hilfe der before images in der Protokolldatei - T1 und T2 müssen (u.U.) „nachgefahren“ (REDO) werden, d.h. die von ihnen vorgenommenen Änderungen am DB-Zustand müssen persistent gemacht, d.h. auf Platte geschrieben werden (sie können! nämlich – trotz Commit – ggf. noch im Systempuffer stehen und (noch) nicht auf Platte geschrieben worden sein) „Nachfahren“ (wg. D auerhaftigkeit) mit Hilfe der after images in der Protokolldatei Datenbanksysteme 1 16.01.2012 317 Problem hinsichtlich des „Nachfahrens“: Wie weit in der Vergangenheit muss begonnen werden? Ab Zeitpunkt des DBVS-Starts? sehr aufwendig! Lösung: Sog. Checkpoints (Sicherungspunkte) in regelmäßigen Zeitabständen (z.B. alle 10 Minuten ... (sog. Checkpoint-Intervall)) Pufferinhalt wird komplett in die Datenbank geschrieben („flush buffer“) „Nachfahren“ braucht nicht über den aktuellsten Checkpoint hinaus in die Vergangenheit gehen (z.B. alle Änderungen von T1 in obigem Bild bereits auf Platte) R2-Aufwandsbegrenzung. c) Fehlerbehandlung für Externspeicherversagen Ausgangspunkt für Fehlerbehandlung: - Gelegentliches Erstellen von Datenbankkopien (sog. „Archivkopien“) Backup-Durchführung - Protokollieren der Änderungen aller (zumindest aller abgeschlossenen) Transaktionen in Form von after images in Protokolldatei Datenbanksysteme 1 16.01.2012 318 T1 T2 „D“ T3 T4 müssen zur R4-Recovery (Behandlung von Externspeicherversagen) „nachgefahren“ werden. ... t Externspeicherversagen Zeitpunkt des Erstellens einer Archivkopie der Datenbank DBA lädt Archivkopie (i.d.R. Band Platte) und veranlasst das DBVSseitige Nachfahren aller abgeschlossenen Transaktionen ( R4-Recovery) wg. D auerhaftigkeit DB anschließend wieder in aktuellem konsistentem Zustand (es sind keine Änderungen abgeschlossener TAen verlorengegangen!) Hinweis: Die Fehlerbehandlungsmaßnahmen sind etwas vereinfacht dargestellt worden (z.B. R2- und R3-Recovery bei bestimmten DBVS-Implementierungen nicht erforderlich) SoSe 2006! Datenbanksysteme 1 16.01.2012 319