Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Kapitel 4: Relationale Sprachen – SQL

Ähnliche Präsentationen


Präsentation zum Thema: "Kapitel 4: Relationale Sprachen – SQL"—  Präsentation transkript:

1 Kapitel 4: Relationale Sprachen – SQL
Teil I Datenmodelle Kapitel 4: Relationale Sprachen – SQL

2 Eigenschaften von SQL Gleichermaßen Unterstützung von
Konstrukten zur Definition und Verwaltung von Datenbasisschemata (DDL) Konstrukten zur Abfrage oder Änderung von Datenbeständen (DML) Deskriptiver Sprachansatz (für Anfragen), der am Tupelkalkül orientiert ist Nutzung der Sprache als interaktive Anfragesprache vom Terminal aus in eingebetteter Form innerhalb von Programmiersprachen

3 Der Sprachstandard SQL
SQL-86 (1986): Erster Standardisierungsversuch mit großen Lücken SQL-89 (1989): Zweiter Standardisierungsversuch, immer noch mit Lücken SQL-92 (1992): Verbreiteter Standard Sehr umfangreiches Werk (Normungsdokument > 600 Seiten ohne Beispiele) SQL-99 (1999): Zunehmend in Produkten Erweiterungen vor allem in Richtung Objektorientierung („objektrelationales“ Modell) Wiederum: umfangreiches Werk (Normungsdokument > 1000 Seiten ohne Beispiele) Derzeit in Gremien: SQL-2003

4 Kapitel 4.1: SQL - Schemadefinition

5 Vordefinierte Datentypen (1)
Zeichenketten: Zeichenketten können beliebige alphanumerische Zeichen aufnehmen. Sie können mit fester und variabler Länge definiert werden: character (oder äquivalent: char) definiert ein einzelnes Zeichen. character(n) (oder äquivalent: char(n)) dient zur Definition von Zeichenketten fester Länge n (mit n1). Intern wird von vornherein Platz für diese n Zeichen vorgesehen. character varying (n) (oder äquivalent: char varying(n)) dient zur Definition von Zeichenketten mit Maximallänge n. Sie belegen intern nur den Platz, der für den aktuellen Wert erforderlich ist. SQL standardisiert das maximal mögliche n nicht. Üblich sind heute zumindest Zeichen.

6 Vordefinierte Datentypen (2)
Ganzzahlen: smallint integer (oder äquivalent: int), wobei hier mindestens der Zahlenbereich von smallint abgedeckt sein muss Festkommazahlen: numeric(m,n) decimal(m,n) (oder äquivalent: dec(m,n)) Fließkommazahlen: real, double precision, float(m) Datums- und Zeitangaben: date speichert Datumswerte time speichert Zeitangaben timestamp kombiniert diese Angaben

7 Vordefinierte Datentypen (3)
Bitketten: bit(n), bit varying(n) Large objects (unstrukturiert): blob : binary large object clob : character large object

8 Benutzerdefinierte Domänen
Motivation: In manchen Fällen sind die vordefinierten Typen (Domänen) noch nicht aussagekräftig genug. Lösungskonzept: Benutzerdefinierte Domänen mittels des domain-Konstrukts. Beispiele: Menge und Stückzahl mit nichtnegativen Ganzzahlen und Standardbelegung 1 create domain MengenAngabe as integer default 1 constraint MengenAngabeConstraint check (value >= 1 and value <= 10000); Gewichtsangaben mit reellen Werten größer als 0 create domain GewichtsAngabe as decimal(7,2) constraint GewichtsAngabeConstraint check (value > 0.0); Auch die erweiterte Definitionsmöglichkeit beschränkt Domänen als atomar, also ist stets erste Normalform gesichert.

9 Tabellendefinition (1)
Zunächst die einfachste Syntaktische Form: create table relations-name ( attribut-name domäne { , attribut-name domäne }* );

10 Tabellendefinition (2)
Beispiel Lagerverwaltungswelt: create table ArtikelArt ( ANr char(8), AName char(25), Menge MengenAngabe, Lieferant char(25), Gewicht GewichtsAngabe ); create table Lagereinheit ( LeNr char(8), LeaNr char(8), Stückzahl MengenAngabe, Gewicht GewichtsAngabe, LhNr char(8) create table LagereinheitArt ( LeaNr char(8), LeaName char(25), Länge integer, Breite integer, Höhe integer, MaxGewicht GewichtsAngabe ); create table Lagerhilfsmittel ( LhNr char(8), LhaNr char(8), Gewicht GewichtsAngabe, LoNr char(8) create table LagerhilfsmittelArt ( LhaName char(25), MaxGewicht Gewichtsangabe create table Lagerort ( LoNr char(8), LoaNr char(8), Gewicht Gewichtsangabe ); create table LagerortArt ( Länge integer, Breite integer, Höhe integer, MaxGewicht Gewichtsangabe create table Verträglichkeit ( ANr char(8), LoNr char(8)

11 Dauerhaftigkeit Regelung:
Jede mittels create table erstellte Tabelle ist automatisch dauerhaft, es sei denn sie wird ausdrücklich als transient gekennzeichnet. Vorteil: Anwender muss sich im Routinefall um nichts kümmern. Möglichkeit zur Verwaltung von Zwischenergebnissen ist aber trotzdem gegeben, muss aber kundgetan werden.

12 Kapitel 4.2: SQL - Anfragen über der Datenbasis

13 Syntaktische Grundform
3. Abschließende Projektion auf die Ai. Symbol “” anstelle von Attributnamen bedeutet “alle Attribute”. select A1, A2, …, An from R1, R2, …, Rm where bedingungw ; 1. Zunächst wird das kartesische Produkt über den Ri gebildet. 2. (optional): Einschränkung der Tupel des kartesischen Produkts im Sinne einer Selektion. bedingungw ist Boolesche Formel über Vergleichen von Attributen untereinander oder von Attributen mit Konstanten.

14 A1, A2, …, An (bedingungw (R1  R2  …  Rm))
Abarbeitungsmodell I Anfrage liefert wieder eine gültige Relation. Diese ist allerdings temporär und wird später wieder verworfen. select A1, A2, …, An from R1, R2, …, Rm where bedingungw ; Entspricht Ausdruck des Tupelkalküls U in R1 , V in R2 ,..., W in Rm U.A1, V.A2, ..., W.An where bedingungw Entsprechender relationenalgebraischer Ausdruck: A1, A2, …, An (bedingungw (R1  R2  …  Rm))

15 Besonderheit der Semantik
SQL fasst Relationen als Vielfachmengen und nicht als mathematisch strenge Mengen auf. Duplikate sind also sowohl in den Quellrelationen Ri als auch in der Ergebnisrelation zugelassen. Leider jedoch inkonsistente Handhabung in verschiedenen SQL-Befehlen!

16 Projektion (1) A in ArtikelArt; A.ANr, A.AName select ANr, AName
from ArtikelArt; Beispiel: „Nummern und Namen aller Artikelarten“: (ANr, AName)(ArtikelArt)

17 Projektion (2) select AName from ArtikelArt; Beispiel:
„Namen aller Artikelarten“: (AName)(ArtikelArt)

18 Projektion (3) select distinct AName from ArtikelArt; Beispiel:
„Namen aller Artikelarten“: (AName)(ArtikelArt)

19 Selektion (1) Spezifikation von Selektionen erfolgt in der where-Klausel. Bezüglich Bedingung bedingungw sind Vergleiche mit den üblichen Operatoren, die logischen Verknüpfungen mit and, or und not sowie beliebige Klammerungen gestattet. Beispiel: „Lagerortarten, deren Höhe ihre Breite überschreitet.“ Restriktion: Höhe > Breite(LagerortArt) select  from LagerortArt where Höhe > Breite; LOA in LagerortArt; LOA.LoaNr, LOA.Breite, LOA.Länge, LOA.Höhe, LOA.MaxGewicht where LOA.Höhe > LOA.Breite

20 Selektion (2) „Die Nummern aller Lagerortarten, deren Höhe ihre Breite überschreitet und deren Tragfähigkeit geringer als  kg ist.“: LoaNr(MaxGewicht < (Höhe > Breite(LagerortArt))) oder LoaNr((Höhe > Breite)  (MaxGewicht < ) (LagerortArt))) select LoaNr from LagerortArt where Höhe > Breite and MaxGewicht<600.00;

21 Kartesisches Produkt Charakteristika:
Berechnung des kartesischen Produkts erfolgt, falls in der from-Klausel mehrere Relationen spezifiziert werden und where-Klausel ohne Quervergleiche ist. Beispiel: Kartesisches Produkt über den Relationen ArtikelArt und Lagereinheit: select  from ArtikelArt, Lagereinheit; Anmerkungen: In SQL sind bezüglich der Ergebnisattribute keine Umbenennungen erforderlich: ANr und Gewicht tauchen je zweimal auf. Eine solche Umbenennung ist jedoch möglich und gelegentlich auch notwendig (siehe später).

22 Mengenoperationen (1) Vereinigung:
union-Operator verbindet einzelne select-Anfragen von attributgleichem und typkompatiblem Ergebnis Beispiel: Vereinigung der beiden Relationen ArtikelArt und DurchlaufendeArtikelArt: select  from ArtikelArt union from DurchlaufendeArtikelArt;

23 Mengenoperationen (2)

24 Mengenoperationen (3)

25 Mengenoperationen (4) Beobachtung:
Hier sind die Duplikate entfernt worden. union folgt im Gegensatz zu den meisten anderen SQL-Konstrukten nicht dem Vielfachmengenansatz. Will man eventuelle Duplikate nicht beseitigen, so ist union all zu verwenden. select  from ArtikelArt union all from DurchlaufendeArtikelArt; Durchschnitts- und Differenzbildung: intersect-Operator except-Operator Gleiche Nutzungsbedingungen wie für union

26 Verbindungsoperationen (1)
Theta-Join: Werden in der where-Klausel Attribute unterschiedlicher beteiligter Relationen miteinander verglichen, entspricht dies einer Join-Operation. Da beliebige Vergleichsoperatoren verwendet werden können, entspricht diese Konstruktion einem allgemeinen Theta-Join. Beispiel: „Alle Lagerorte, deren tatsächliches Gewicht das zulässige Gesamtgewicht überschreitet, die also falsch beladen sind.“: LoNr, Gewicht, MaxGewicht (Lagerort ⋈(LoaNr = LoaNr2)(Gewicht > MaxGewicht) LagerortArtLoaNr2 LoaNr)

27 Verbindungsoperationen (2)
select LoNr, Gewicht, MaxGewicht from Lagerort Lo, LagerortArt Loa where Lo.LoaNr = Loa.LoaNr and Gewicht > MaxGewicht; 500.00 520.50 LO-007 MaxGewicht Gewicht LoNr

28 Verbindungsoperationen (3)
select LoNr, Gewicht, MaxGewicht from Lagerort Lo, LagerortArt Loa where Lo.LoaNr = Loa.LoaNr and Gewicht > MaxGewicht; Anmerkungen: Das in beiden beteiligten Relationen vorkommende Attribut LoaNr wird durch Bindung an seine jeweilige Relation eindeutig qualifiziert. Die Qualifizierung kann durch den Relationsnamen selbst oder wie hier durch einen für den Relationsnamen vergebenen Aliasnamen erfolgen (hier Lo für Lagerort und Loa für LagerortArt). Die Aliasnamen können in etwa den Tupelvariablen des Tupelkalküls gleichgesetzt werden. Für eindeutig identifizierbare Attribute ist in SQL die Verwendung von Aliasnamen allerdings im Unterschied zum Tupelkalkül nicht zwingend.

29 Verbindungsoperationen (4)
Schachtelung von Anfragen: Soweit Relationen in der from-Klausel nicht in der select-Klausel zum Ergebnis beitragen, entspricht dies einer impliziten Existenzquantifizierung im Tupelkalkül. Die flache Anfrageformulierung entspricht dabei der Pränex-Normalform. Abweichung von dieser Normalform führt auf geschachtelte Anfragen. Die Existenzquantifizierungen müssen dann explizit mittels exists oder Negation not exists erfolgen. Beispiel: “Nummern und Arten der Artikelarten, die in mehr als einer Lagereinheit verpackt sind.”

30 Verbindungsoperationen (5)
Flache Formulierung select A.ANr, AName from ArtikelArt A, Lagereinheit Le1, Lagereinheit Le2 where A.ANr = Le1.ANr and A.ANr = Le2.ANr and Le1.LeNr <> Le2.LeNr; Geschachtelte Formulierung select ANr, Aname from ArtikelArt A where exists ( select  from Lagereinheit Le1 where A.ANr = ANr and exists ( from Lagereinheit and Le1.LeNr <> LeNr ) ); Aliasnamen hier zwingend wegen gleicher Relationsnamen! Vorkommen expliziter und impliziter Qualifizierung.

31 Abarbeitungsmodell bei Schachtelung
select ANr, Aname from ArtikelArt A where exists ( select  from Lagereinheit Le1 where A.ANr = ANr and exists ( from Lagereinheit and Le1.LeNr <> LeNr ) ); A in ArtikelArt, LE1 in Lagereinheit, LE2 in Lagereinheit;     A.ANr, A.AName where $ LE1 (A.ANr = LE1.ANr $ LE2 (A.ANr = LE2.ANr  LE1.LeNr ¹ LE2.LeNr))

32 Abarbeitungsmodell bei Schachtelung
Variante 1: Innere Schachtel wird genau einmal für die äußere Schachtel ausgewertet. Variante 2: Innere Schachtel wird für jedes Tupel der äußeren Schleife ausgewertet (Verschachtelte Schleifen). Erkennbar daran, dass innerhalb der Schachtel der Aliasname der äußeren Schleife in Vergleichen auftritt. select ANr, Aname from ArtikelArt A where exists ( select  from Lagereinheit Le1 where A.ANr = ANr and exists ( from Lagereinheit and Le1.LeNr <> LeNr ) );

33 Verbindungsoperationen (6)
„Die Nummer der Lagerortart mit der geringsten Tragfähigkeit, d.h. mit dem kleinsten zulässigen Maximalgewicht.“: LoaNr (LagerortArt) \ LoaNr (LagerortArt ⋈MaxGewicht > MaxGewicht2 MaxGewicht2 (LagerortArtMaxGewicht2  MaxGewicht)) LOA1 in LagerortArt, LOA2 in LagerortArt; LOA1.LoaNr where  $ LOA2 (LOA1.MaxGewicht > LOA2.MaxGewicht) select LoaNr from LagerortArt Loa1 where not exists ( select  from LagerortArt where Loa1.MaxGewicht > MaxGewicht);

34 Verbindungsoperationen (7)
LOA-01 LoaNr

35 Verbindungsoperationen (8)
Semi-Join: Mit flacher Formulierung bereits möglich. Beispiel: “Lagereinheitarten, für die (mindestens) eine Lagereinheit existiert“. LagereinheitArt 4Lagereinheit “Flache“ Formulierung: select Lea.LeaNr, LeaName, Länge, Breite, Höhe, MaxGewicht from LagereinheitArt Lea, Lagereinheit Le where Lea.LeaNr = Le.LeaNr; Semijoin daran erkennbar, dass nur Ausgabe von LagereinheitArt-Attributen Stattdessen auch: select Lea.

36 Verbindungsoperationen (8)
LH-005 105.00 42 A-015 LEA-02 LE-016 LH-004 3.00 2 A-006 LE-015 LH-001 2.00 1 A-001 LEA-04 LE-014 12.00 12 A-012 LEA-01 LE-013 LH-003 4 A-019 LE-012 16.00 16 A-011 LE-011 LH-007 5.20 13 A-008 LE-010 6.00 A-020 LE-009 15.00 30 A-010 LE-008 LH-006 212.50 85 LEA-05 LE-007 0.30 6 A-002 LEA-03 LE-006 4.50 3 LE-005 175.00 175 A-017 LE-004 LH-002 21.00 A-005 LE-003 20.00 20 A-004 LE-002 4.00 LE-001 LhNr Gewicht Stückzahl ANr LeaNr LeNr Lagereinheit

37 Verbindungsoperationen (9)
Schachtelung mittels any-Klausel: Formulierung:  any  ist Stellvertreter für jeden erlaubten Vergleich Qualifiziert jedes äußere Tupel, für das der Vergleich mit irgendeinem Tupel der in der Schachtel berechneten Relation positiv ausfällt Beispiel: “Lagereinheitarten, für die (mindestens) eine Lagereinheit existiert“. select  from LagereinheitArt where LeaNr = any ( select LeaNr from Lagereinheit) ; in ist Abkürzung für = any: select  from LagereinheitArt where LeaNr in ( select LeaNr from Lagereinheit );

38 Verbindungsoperationen (10)
all-Klausel: Formulierung: all Qualifiziert jedes äußere Tupel, für das der Vergleich mit allen Tupeln der in der Schachtel berechneten Relation positiv ausfällt not in ist Abkürzung für <> all. Beispiel: “Lagereinheitarten, für die (derzeit) keine Lagereinheiten existieren”: select  from LagereinheitArt where LeaNr not in ( select LeaNr from Lagereinheit ); Beispiel: “Nummer der Lagerortart mit der geringsten Tragfähigkeit”: select LoaNr from LagerortArt where MaxGewicht <= all ( select MaxGewicht from LagerortArt ); select LoaNr from LagerortArt Loa1 where not exists ( select  from LagerortArt where Loa1.MaxGewicht > MaxGewicht);

39 Konstanten und Ausdrücke (1)
Berechnungen über Tupelwerten: Ausdrücke bestehen aus Rechenoperatoren, vordefinierten Funktionen und Klammerungen und werden auf sämtliche betrachteten Tupel angewendet, für die sie jeweils einen eigenen Wert liefern. Es handelt sich um eine echte Erweiterung gegenüber der Relationenalgebra. Auftreten in einer where-Klausel: Wird wie jeder originäre Tupelwert oder eine Konstante in den Vergleich einbezogen. Auftreten in einer select-Klausel: Es bilden sich neue Spalten. Diese können mittels einer Benennungsklausel (Schlüsselwort as) benannt werden. Andernfalls erhalten sie systemdefinierte Namen.

40 Konstanten und Ausdrücke (2)
Konstanten in der select-Klausel: Erzeugen Spalten mit bestimmten Werten, um darauf weitere Berechnungen ausführen zu können. Beispiel: select NULL as Nullwert, Lea. from LagereinheitArt Lea; Nullwert LeaNr LeaName Länge Breite Höhe MaxGewicht NULL LEA-01 Stapelkasten NULL LEA-02 Stapelkasten NULL LEA-03 Drehstapelkasten NULL LEA-04 Drehstapelkasten NULL LEA-05 Stapelkorb NULL LEA-06 Lagerkorb

41 Konstanten und Ausdrücke (3)
Rechenoperatoren in der select- und where-Klausel: “Alle Lagereinheitarten mit einer Mindeststellfläche von cm2“. Im Ergebnis soll die jeweilige Stellfläche als eigene Spalte erscheinen und die maximale Belastbarkeit (MaxGewicht) in Gramm statt Kilogramm ausgegeben werden. select LeaNr, LeaName, Länge, Breite, Höhe, MaxGewicht  1000 as MaxGewichtInGramm, Länge  Breite as Stellfläche from LagereinheitArt; where Länge  Breite >= ; LeaNr LeaName Länge Breite Höhe MaxGewicht LEA-01 Stapelkasten LEA-02 Stapelkasten LEA-03 Drehstapelkasten LEA-04 Drehstapelkasten LEA-05 Stapelkorb LEA-06 Lagerkorb Stellfläche 440800 MaxGewichtInGramm

42 Konstanten und Ausdrücke (4)
case-Konstrukt: Gestattet eine bedingte Auswertung. Innerhalb einer solchen Konstruktion stehen Unterklauseln der Form when … then … Bei Ausführung werden diese Unterklauseln der Reihe nach untersucht und auf die hinter when stehenden Bedingungen geprüft. Für die zuerst zutreffende Bedingung wird die hinter then stehende Berechnung durchgeführt und als Ergebnis übernommen. Ein optionales else kommt zum Zuge, falls keine der when-Bedingungen zutrifft. Fehlt else, wird im “schlimmsten” Fall NULL als Ergebnis angenommen.

43 Konstanten und Ausdrücke (5)
Beispiel: “Die Lagereinheitarten sind als gering, mittel oder hoch belastbar einzustufen”: select LeaNr, LeaName, case when MaxGewicht >= then 'hoch' when MaxGewicht >= then 'mittel' else 'gering' end as Belastbarkeit from LagereinheitArt; LeaNr LeaName Länge Breite Höhe MaxGewicht LEA-01 Stapelkasten LEA-02 Stapelkasten LEA-03 Drehstapelkasten LEA-04 Drehstapelkasten LEA-05 Stapelkorb LEA-06 Lagerkorb Belastbarkeit hoch mittel gering

44 Differenzierte Verbindungsoperationen (1)
Beobachtung: Einfach zu formulierende Verbindungen wie ein Natural Join sind nicht als solche dokumentiert. Outer Joins sind nur sehr kompliziert formulierbar. Beispiel: Lagereinheit 6 LagereinheitArt select LeNr, ANr, Stückzahl, Gewicht, LhNr, Lea.LeaNr, LeaName, Länge, Breite, Höhe, MaxGewicht from Lagereinheit Le, LagereinheitArt Lea where Le.LeaNr = Lea.LeaNr union select NULL as LeNr, NULL as ANr, NULL as Stückzahl, NULL as Gewicht, NULL as LhNr, Lea.LeaNr, LeaName, Länge, Breite, Höhe, MaxGewicht from LagereinheitArt Lea where not exists ( select  from Lagereinheit where Lea.LeaNr = LeaNr );

45 Differenzierte Verbindungsoperationen (2)
Lösung: Statt wie bisher nur das implizite Kartesische Produkt lassen sich in der from-Klausel eine Reihe von Verknüpfungen zwischen den Relationen angeben: from R1 op R2 op … op Rn op spezifiziert dabei einen relationenalgebraischen Verbindungsoperator aus folgenden Möglichkeiten: cross join | [ natural ] { left | right | full } [ outer ] join | [ natural ] { inner | union } join

46 Differenzierte Verbindungsoperationen (3)
cross join [ natural ] { left | right | full } [ outer ] join [ natural ] { inner | union } join Berechnung des kartesischen Produkts. Entsprechen den drei Varianten für Outer Joins. Optionales outer dient der besseren Lesbarkeit. Optionales natural spezifiziert eine natürliche Verbindung mit den in beiden Relationen gleich benannten Attributen. Ohne natural müssen die Verbindungsattribute wie gewohnt in der where-Klausel spezifiziert werden. Lagereinheit 6 LagereinheitArt: select  from Lagereinheit natural right outer join LagereinheitArt; Spezifikation einer inneren Verbindung (normaler Theta-Join). Optionales natural fordert wieder eine natürliche Verbindung.

47 Differenzierte Verbindungsoperationen (4)
union join: Full Outer Join, bei dem von vornherein feststeht, dass es zu keinen „echten“ Verbindungen kommt. Die Ergebnisrelation enthält also zum einen die Tupel der “linken” Eingaberelation nach rechts aufgefüllt mit NULL-Werten, zum anderen die Tupel der “rechten” Eingaberelation nach links aufgefüllt mit NULL-Werten. Die Zahl der Ergebnistupel entspricht somit der Summe der Tupel in den beiden Eingaberelationen.

48 Differenzierte Verbindungsoperationen (5)
Abarbeitungsreihenfolge: Assoziativität gilt bei den neuen Operatoren nicht mehr ohne weiteres. Beim Hintereinanderschreiben mehrerer dieser Konstrukte wird generell von links nach rechts ausgewertet. Klammerungen sind möglich. Natürliche Verbindung: natural zieht normalerweise alle gleich benannten Attribute heran. Falls unerwünscht, Beschränkung mittels using-Klausel. Beispiel: “Alle Artikel zusammen mit den Lagereinheiten, in die sie verpackt sind”. select ANr, AName, LeNr from ArtikelArt natural inner join Lagereinheit using (ANr);

49 Differenzierte Verbindungsoperationen (5)
Abarbeitungsreihenfolge: Assoziativität gilt bei den neuen Operatoren nicht mehr ohne weiteres. Beim Hintereinanderschreiben mehrerer dieser Konstrukte wird generell von links nach rechts ausgewertet. Klammerungen sind möglich. Theta-Join: Falls natural unerwünscht, expliziter Theta-Join mittels on-Klausel. Beispiel: “Alle Artikel zusammen mit den Lagereinheiten, in die sie verpackt sind”. select A.ANr, A.AName, L.LeNr from ArtikelArt A inner join Lagereinheit L on (A.ANr = L.ANr);

50 Division (1) Vorgehensweise:
Zur Allquantifizierung gibt es kein eigenes SQL-Konstrukt. Daher: Ableitung einer Division in SQL durch einen Tupelkalkül-Ausdruck, in dem man alle Allquantoren durch Existenzquantoren und doppelte Negation ersetzt. Beispiel: “Suche nach den Nummern derjenigen Artikelarten, die mit allen Lagerorten verträglich sind”: Verträglichkeit ¸ LoNr(Lagerort)

51 Division (2) V1 in Verträglichkeit, V1 in Verträglichkeit,
LO in Lagerort;     V1.ANr where " LO ($ V2 (V2.ANr = V1.ANr  V2.LoNr = LO.LoNr)); V1 in Verträglichkeit, V2 in Verträglichkeit, LO in Lagerort;     V1.ANr where  LO ($ V2 (V2.ANr = V1.ANr  V2.LoNr = LO.LoNr)); select ANr from Verträglichkeit V1 where not exists ( select  from Lagerort Lo from Verträglichkeit V2 where V2.ANr = V1.ANr and V2.LoNr = Lo.LoNr));

52 Aggregatfunktionen (1)
Berechnungsmöglichkeiten über Tupelwerte beschränkten sich bislang auf einzelne Tupel. Ebenso interessieren Operatoren, die Berechnungen über Gruppen von Tupeln anstellen. Beispiele: Zählen von Tupeln, Summen-, Durchschnitts-, Minimum- oder Maximumbildung der Werte von bestimmten Relationsspalten. Hierfür: Aggregatfunktionen, die in der select-Klausel im Zusammenhang mit (einzelnen) Attributen verwendet werden dürfen.

53 Aggregatfunktionen (2)
min([ distinct ] A ) Berechnung des Minimalwerts aller Tupel unter dem Attribut A (optionales Schlüsselwort distinct hier bedeutungslos) max([ distinct ] A ) Berechnung des Maximalwerts aller Tupel unter dem Attribut A (optionales Schlüsselwort distinct hier bedeutungslos) avg([ distinct ] A ) Berechnung des Durchschnittswerts aller Tupel unter dem Attribut A (mit distinct gehen gleiche Werte nur einmal in die Berechnung ein) sum([ distinct ] A ) Berechnung der Summe aller Tupel unter dem Attribut A (mit distinct gehen gleiche Werte nur einmal in die Berechnung ein) count() Zählen der Tupel der betrachteten Relation count([ distinct ] A ) Zählen der Tupel der betrachteten Relation, bei distinct nach Duplikateliminierung bezüglich Attribut A

54 Aggregatfunktionen (3)
Beispiel: “Zahl der Artikelarten”:     select count() as Artikelzahl from ArtikelArt; Artikelzahl 20

55 Aggregatfunktionen (4)
select count(distinct AName) as Kategoriezahl from ArtikelArt; Kategoriezahl 17

56 Aggregatfunktionen (5)
LH-005 105.00 42 A-015 LEA-02 LE-016 LH-004 3.00 2 A-006 LE-015 LH-001 2.00 1 A-001 LEA-04 LE-014 12.00 12 A-012 LEA-01 LE-013 LH-003 4 A-019 LE-012 16.00 16 A-011 LE-011 LH-007 5.20 13 A-008 LE-010 6.00 A-020 LE-009 15.00 30 A-010 LE-008 LH-006 212.50 85 LEA-05 LE-007 0.30 6 A-002 LEA-03 LE-006 4.50 3 LE-005 175.00 175 A-017 LE-004 LH-002 21.00 A-005 LE-003 20.00 20 A-004 LE-002 4.00 LE-001 LhNr Gewicht Stückzahl ANr LeaNr LeNr Lagereinheit Gesamtgewicht der Lagereinheiten und die Gesamtstückzahl der darin gelagerten Artikel auf dem Lagerhilfsmittel mit der Nummer 'LH-001': select sum(Gewicht) as Gesamtgewicht, sum(Stückzahl) as Gesamtzahl from Lagereinheit where LhNr = 'LH-001';

57 Aggregatfunktionen (5)
LH-005 105.00 42 A-015 LEA-02 LE-016 LH-004 3.00 2 A-006 LE-015 LH-001 2.00 1 A-001 LEA-04 LE-014 12.00 12 A-012 LEA-01 LE-013 LH-003 4 A-019 LE-012 16.00 16 A-011 LE-011 LH-007 5.20 13 A-008 LE-010 6.00 A-020 LE-009 15.00 30 A-010 LE-008 LH-006 212.50 85 LEA-05 LE-007 0.30 6 A-002 LEA-03 LE-006 4.50 3 LE-005 175.00 175 A-017 LE-004 LH-002 21.00 A-005 LE-003 20.00 20 A-004 LE-002 4.00 LE-001 LhNr Gewicht Stückzahl ANr LeaNr LeNr Lagereinheit Gesamtgewicht Gesamtzahl

58 Gruppierung (1) Motivation:
Bisher existierte nur die gesamte Relation als eine einzige Gruppe. Interessanter ist es, Aggregierungen über Teilmengen einer Relation zu berechnen. Beispiel: Innerhalb einer Anfrage soll für jedes Lagerhilfsmittel das Gesamtgewicht der auf ihm stehenden Lagereinheiten ermittelt werden. Bisher müsste jedoch für jedes Hilfsmittel eine eigene Anfrage gestartet werden. Benötigt wird somit ein Konstrukt, das Teilmengen einer (möglicherweise berechneten) Relation zu Gruppen zusammenfasst und weitere Operationen auf diesen Gruppen ausführt.

59 Gruppierung (2) Erweiterung des syntaktischen Rahmens:
select A1, A2, …, An from R1, R2, …, Rm where bedingungW group by B1, B2, … ,Bp having bedingungG ;

60 A1, A2, …, An(bedingungG(GBi(bedingungW (R1R2 …  Rm))))
Gruppierung (3) select A1, A2, …, An from R1, R2, …, Rm where bedingungW group by B1, B2, … ,Bp having bedingungG ; Abarbeitungsmodell: A1, A2, …, An(bedingungG(GBi(bedingungW (R1R2 …  Rm)))) Bildung des kartesischen Produkts der Ri. Auswertung von bedingungw . Das Zwischenergebnis wird bezüglich gleicher Werte für die Bi gruppiert (G Gruppierungsoperator). Auf den Gruppen finden optional Selektionen mittels bedingungG statt. Die Bedingung muss sich auf die Gruppeneigenschaften, also auf die Attribute A\Bi, beziehen (mit A = AR1R2 …  Rm). Abschließend Projektion. Für originäre Attribute Ai muss gelten Ai  Bi, d.h. sie müssen in der group by-Klausel auftreten. Für Ergebnisse von Aggregatfunktionen müssen sich diese auf die Attribute A\Bi, beziehen (Anwendung der Funktionen einzeln auf die Menge zu jeder Gruppe).

61 Gruppierung (4) LH-005 105.00 42 A-015 LEA-02 LE-016 LH-004 3.00 2 A-006 LE-015 LH-001 2.00 1 A-001 LEA-04 LE-014 12.00 12 A-012 LEA-01 LE-013 LH-003 4 A-019 LE-012 16.00 16 A-011 LE-011 LH-007 5.20 13 A-008 LE-010 6.00 A-020 LE-009 15.00 30 A-010 LE-008 LH-006 212.50 85 LEA-05 LE-007 0.30 6 A-002 LEA-03 LE-006 4.50 3 LE-005 175.00 175 A-017 LE-004 LH-002 21.00 A-005 LE-003 20.00 20 A-004 LE-002 4.00 LE-001 LhNr Gewicht Stückzahl ANr LeaNr LeNr Lagereinheit “Gesamtgewichte und Stückzahlen der Lagereinheiten bezogen auf die Lagerhilfsmittel”: select LhNr, sum(Gewicht) as Gesamtgewicht, sum(Stückzahl) as Gesamtzahl from Lagereinheit group by LhNr; LhNr Gesamtgewicht Gesamtzahl LH LH LH LH LH LH LH

62 Gruppierung (5) LH-005 105.00 42 A-015 LEA-02 LE-016 LH-004 3.00 2 A-006 LE-015 LH-001 2.00 1 A-001 LEA-04 LE-014 12.00 12 A-012 LEA-01 LE-013 LH-003 4 A-019 LE-012 16.00 16 A-011 LE-011 LH-007 5.20 13 A-008 LE-010 6.00 A-020 LE-009 15.00 30 A-010 LE-008 LH-006 212.50 85 LEA-05 LE-007 0.30 6 A-002 LEA-03 LE-006 4.50 3 LE-005 175.00 175 A-017 LE-004 LH-002 21.00 A-005 LE-003 20.00 20 A-004 LE-002 4.00 LE-001 LhNr Gewicht Stückzahl ANr LeaNr LeNr Lagereinheit “Nummern der Lagereinheitarten, für die die Stückzahl der in den Lagereinheiten verpackten Artikel 35 oder mehr beträgt”: select LhNr, sum(Gewicht) as Gesamtgewicht, sum(Stückzahl) as Gesamtzahl from Lagereinheit group by LhNr having sum(Stückzahl) >= 35; LhNr Gesamtgewicht Gesamtzahl LH LH LH LH

63 Gruppierung (6) Beispiel:
“Der nach Stückzahl am häufigsten gelagerte Artikel des Lieferanten 'Bosch'”: select A.ANr, sum(Stückzahl) as Gesamtzahl from ArtikelArt A, Lagereinheit Le where A.ANr = Le.ANr and Lieferant = 'Bosch' group by A.ANr having sum(Stückzahl) >= all ( select sum(Stückzahl) and Lieferant = 'Bosch' group by A.ANr );

64 Gruppierung (7) Generell können in SQL Attributwerte, die aus einer Gruppierung entstammen, nicht in Ausdrücke mit nichtgruppierten Attributen eingehen. Die folgende sinnvolle Plausibilitätsprüfung auf Differenz 0 ist also nicht möglich: select sum(Le.Gewicht) - Lh.Gewicht as Differenz from Lagereinheit Le, Lagerhilfsmittel Lh where Lh.LhNr = 'LH-001' and Le.LhNr = Lh.LhNr; Erklärung: Unter Lh.Gewicht existiert ein Wert pro Tupel der Verbindungsrelation, sum(Le.Gewicht) ist jedoch nur für die Verbindungsrelation insgesamt definiert.

65 Gruppierung (8) Trickreiche Lösung:
Da immer auf gleiche Lagerhilfsmittel abgehoben wird - das mit der Nummer 'LH-001' - ist auch dessen Lh.Gewicht das selbe. select sum(Le.Gewicht) - max(Lh.Gewicht) as Differenz from Lagereinheit Le, Lagerhilfsmittel Lh where Lh.LhNr = 'LH-001’ and Le.LhNr = Lh.LhNr; Differenz 0.00

66 Sortierung Motivation:
Sortierung hätte keine Auswirkung auf die Funktionalität der verarbeitenden Operatoren. Sortierung ist jedoch ein für praktische Anwendungen nach außen unverzichtbares Leistungsmerkmal. Daher Sortierung für Ergebnisrelationen sehr sinnvoll. Erweiterung des syntaktischen Rahmens: Optionale order by-Klausel. Aufsteigendes und absteigendes Sortieren sind möglich (Schlüsselworte asc und desc). Ein oder mehrere Attribute können als Sortierattribute spezifiziert werden.

67 Sortierung (2) Beispiel: “Artikelarten, nach Lieferanten und bei
gleichem Lieferanten nach Artikelnamen sortiert”: select  from ArtikelArt order by Lieferant, AName; 1.50 Erzberg 1 Ölwanne A-006 1.00 Pohlmann 10 Zylinderdichtung A-018 Osram 20 Zündkerzen A-012 3.00 Mahle Zylinderkopf A-019 0.05 Kolben A-002 0.10 50 Kolbenringe A-003 Kurbelwelle A-004 0.50 Nockenwelle A-005 Pleuel A-007 0.40 Ventile A-008 Ventilfedern A-010 0.80 Siemens Zündkerzenkabel A-013 Zündkerzenstecker A-014 2.50 5 Zündspule A-015 6.00 Zylinderkurbelgehäuse A-020 A-017 Bosch Zündverteiler A-016 A-011 A-009 2.00 Anlasser A-001 Gewicht Lieferant Menge AName ANr

68 Zusammenfassung: select-Syntax (1)
Allgemeine Form der select-Anweisung: select [distinct] item1 [[as] A1], ..., itemk [[as] Ak] from table-expr1 [[as] R1], ..., table-exprl [[as] Rl] [where cond-expr] [group by col1, ..., colm] [having cond-expr] Dabei hat jedes itemi eine der Formen ei, wobei ei ein Attributname oder ein arithmetischer Ausdruck ist, Ri. (Auswahl aller Attribute von Ri), f(ei) mit f  {count,sum,avg,min,max} und ei wie oben, f(distinct e) mit f und e wie oben, count(). „“ statt item-Liste: Auswahl aller Spalten des durch from definierten Kart. Produkts.

69 Zusammenfassung: select-Syntax (2)
Allgemeine Form der select-Anweisung: select [distinct] item1 [[as] A1], ..., itemk [[as] Ak] from table-expr1 [[as] R1], ..., table-exprl [[as] Rl] [where cond-expr] [group by col1, ..., colm] [having cond-expr] table-expri ist eine der früher besprochenen Verbindungsoperationen. Verallgemeinerung: table-expri ist allgemeiner select-Ausdruck.

70 Zusammenfassung: select-Syntax (3)
Allgemeine Form der select-Anweisung: select [distinct] item1 [[as] A1], ..., itemk [[as] Ak] from table-expr1 [[as] R1], ..., table-exprl [[as] Rl] [where cond-expr] [group by col1, ..., colm] [having cond-expr] Einschränkungen und Default-Regeln: Weglassen der where-Klausel ist äquivalent zu „true“. Bei Angabe einer group by-Klausel dürfen in der select- und having-Klausel Attribute, die von col1,...,colm verschieden sind, nur als Argumente von Aggregatfunktionen auftreten. Bei Angabe von Aggregatfunktionen ohne group by-Klausel wird implizit eine group by-Klausel mit leerer Attributliste angenommen, d.h., die ganze Ergebnistabelle wird als eine Gruppe betrachtet.

71 Kapitel 4.3: SQL - Änderungen der Datenbasis

72 Einfügen von Tupeln (1) Befehlsstruktur:
insert into relations-name [ attribut-namen-liste ] { values ( werte-liste ) | select-anweisung }; Jede Einfügeanweisung bezieht sich stets auf eine einzige Relation relations-name. Falls nicht alle Tupelwerte belegt werden sollen, können die zu belegenden über die optionale Attributliste angegeben werden. Die restlichen Werte werden auf NULL gesetzt. Einfügevarianten Einfügen von Einzeltupeln: Hinter values wird eine Folge von Werten spezifiziert. Einfügen von Tupelmengen: Angabe einer SQL-Anfrage.

73 Einfügen von Tupeln (2) Beispiel: Einfügen einer neuen Artikelart in ArtikelArt: insert into ArtikelArt values ('A-030', ' Ölfilter', 100, 'Erzberg', 6.00); Beispiel: Die genannte Artikelart sei bereits in DurchlaufendeArtikelArt vorhanden. select  from DurchlaufendeArtikelArt where ANr = 'A-030'; Beispiel: Einfügen unter Zulassen von NULL-Werten: insert into ArtikelArt ( ANr, AName ) select ANr, Aname where ANr = 'A-031';

74 Ändern von Tupeln (1) Befehlsstruktur:
update relations-name set attribut-name = ausdruck { , attribut-name = ausdruck }* [ where bedingung ]; Bezieht sich im Grundsatz stets auf Mengen von Tupeln einer Relation. Bei Spezifikation von where samt Suchbedingung bezieht sich die Änderung nur auf die dabei qualifizierten Tupel.

75 Ändern von Tupeln (2) Beispiel: Vervollständigung der Information für das gerade eingefügte Tupel mit ANr = 'A-031': update ArtikelArt set Menge = 1, Hersteller = 'Mahle', Gewicht = 5.00 where ANr = 'A-031'; Beispiel: Die in einer Packung enthaltene Produktmenge für alle Artikel des Lieferanten 'Siemens' wird verdoppelt: update ArtikelArt set Menge = Menge  2 where Lieferant = 'Siemens';

76 Löschen von Tupeln (1) Befehlsstruktur:
delete from relations-name [ where bedingung ]; Wahlweise werden alle Tupel einer Relation oder, bei Angabe von bedingung, die durch die Suchbedingung selektierten Tupel gelöscht.

77 Löschen von Tupeln (2) Beispiel: Löschen der Tupel mit den Artikelnummern 'A-030' und 'A-031': delete from ArtikelArt where ANr = 'A-030' or ANr = 'A-031'; Beispiel: Löschen derjenigen Artikelarten, die derzeit nicht gelagert werden, d.h. für die keine Lagereinheiten existieren: delete from ArtikelArt A where not exists ( select  from Lagereinheit where ANr = A.Anr );

78 Kapitel 4.4: SQL - Konsistenzbedingungen

79 Syntaktische Grundform
Formulierung in SQL: Konsistenzbedingungen sollten in das Datenbasisschema aufgenommen werden. create table relations-name ( { constraints | attribut-name domäne [ constraints ] } { , constraints | attribut-name domäne [ constraints ] }* ); Charakteristika: constraints enthält jeweils eine oder mehrere Konsistenzbedingungen. Art und Funktion der Konsistenzbedingung werden durch unterschiedliche Schlüsselworte eingeleitet. Konsistenzbedingung betrifft entweder ein einzelnes Atribut oder die gesamte Relation.

80 Primärschlüssel Vorgehensweise:
Klausel primary key zeichnet eine Attributfolge einer Relation als Primärschlüssel aus. SQL verhindert dann, dass unterschiedliche Tupel mit gleichem Schlüssel in die Relation eingebracht werden. Ist der Schlüssel einattributig, so wird die Klausel an die Attributvereinbarung gebunden; andernfalls erfolgt die Angabe durch eine übergreifende Klausel. Beispiel: ANr als Primärschlüssel von ArtikelArt: create table ArtikelArt ( ANr char(8) primary key, ); Beispiel: Zusammengesetzter Primärschlüssel: create table Verträglichkeit ( primary key (ANr, LoNr), ANr char(8), LoNr char(8)

81 Schlüsselkandidaten Vorgehensweise:
Definition von über den Primärschlüssel hinausgehenden Schlüsselkandidaten mittels unique-Klausel. Unterschied: Unterschiedliche Behandlung von NULL-Werten (siehe später). Beispiel: create table ArtikelArt ( ANr char(8) unique, );

82 Referenzielle Konsistenz (1)
Vorgehensweise: Klausel references mit nachfolgender Spezikation eines Attributs einer anderen Tabelle identifiziert ein Attribut einer anderen Relation. Zwischen dem gerade deklarierten und dem referenzierten Attribut sichert das Datenbanksystem dann referenzielle Konsistenz zu. Beispiel: Für die Artikelnummern von Lagereinheiten gilt: create table Lagereinheit ( ANr char(8) references ArtikelArt (ANr), ); oder, da ANr in ArtikelArt Schlüssel: foreign key ANr references ArtikelArt (ANr), ANr char(8),

83 Referenzielle Konsistenz (2)
Automatische Aktionen: Sei referenzielle Konsistenz von Y in TS bezüglich X in TR gegeben. Dann gibt es bei update- und delete-Befehlen auf R möglicherweise Handlungsbedarf. Spezifikation referenzieller Aktionen auf S bei der Deklaration von Y ist möglich: set null cascade delete no action

84 Referenzielle Konsistenz (3)
set null cascade delete no action Werde ein Tupel aus R entfernt oder in seinem X-Wert geändert, das von einem Tupel aus S unter Y referenziert wird. Dann wird der Y-Wert des referenzierenden Tupels auf NULL gesetzt. Werde ein Tupel aus R in seinem X-Wert geändert, das von Tupeln aus S unter Y referenziert wird. Dann wird der Y-Wert der referenzierenden Tupel auf den neuen X-Wert abgeändert. Werde ein Tupel aus R entfernt oder in seinem X-Wert geändert, das von Tupeln aus S unter Y referenziert wird. Dann werden diese S-Tupel gelöscht. Es wird gar nicht erst zugelassen, dass ein Tupel aus R entfernt oder in seinem X-Wert geändert wird, wenn es von mindestens einem Tupel aus S unter Y referenziert wird.

85 Referenzielle Konsistenz (4)
Beispiel: Erweiterung die referenzielle Konsistenz für die Artikelnummern in den Lagereinheiten um zwei referenzielle Aktionen: create table Lagereinheit ( ANr char(8) references ArtikelArt (ANr) on update cascade on delete set null, ); Erläuterung: Ändert sich die Nummerierung der Artikelarten, sollen die Lagereinheit-Tupel entsprechend angepasst werden. Wird eine bestimmte Artikelart nicht weiter geführt, so kann man die mit Artikeln dieser Art gefüllten Lagereinheiten nicht einfach löschen. Stattdessen soll der NULL-Wert in Lagereinheit ausdrücken, dass die Artikelnummer für die in der Einheit verpackten Artikel unbekannt ist.

86 Nullwerte Vorgehensweise:
Nullwerte als mögliche Belegung eines Attributs können durch die Angabe von not null ausgeschlossen werden. Die Angabe von primary key impliziert für die entsprechenden Attribute die Bedingung not null. Bei einem unique-Attribut wird die NULL-Belegung maximal eines Tupels hingegen toleriert. Dies wäre also durch not null auszuschließen. Beispiel: Artikelnamen sollen immer angegeben werden. Es ergibt sich: create table ArtikelArt ( AName char(25) not null, );

87 Standardbelegung Vorgehensweise:
Mittels der default-Klausel kann für ein Attribut eine initiale Wertebelegung festgelegt werden. Beispiel: Artikelnamen sollen bei fehlenden Benutzerangaben mit ‘-unbekannt-' belegt werden: create table ArtikelArt ( AName char(25) not null default ’-unbekannt-', ); Anmerkung: Klausel not null erübrigt sich keineswegs, denn sonst könnte man mittels update doch Nullwerte für AName einbringen.

88 Wertebeschränkung (1) Vorgehensweise:
check-Klausel erlaubt Einschränkungen der Werte von Attributen über recht allgemein formulierbare Vergleiche. Beispiel: Längen-, Breiten- und Höhenangaben in den Lagerverwaltungsrelationen sollen immer größer als 0 spezifiziert sein. Außerdem dürfen Breitenangaben maximal so groß wie Längenangaben sein. create table LagereinheitArt ( Länge integer check (Länge > 0), Breite integer check (Breite > 0 and Breite <= Länge), Höhe integer check (Höhe > 0), );

89 Geänderte Qualifizierungsregel!
Wertebeschränkung (2) Weitere Möglichkeiten: Die Einbettung von SQL-Suchanweisungen ist erlaubt. Damit sind etwa Vergleiche von Spaltenwerten mit Maximum-, Minimum-, Summen- oder Durchschnittsberechnungen möglich. Beziehungen von Tupeln unterschiedlicher Relationen können ausgenutzt werden. Beispiel: “Das Gewicht eines Lagerhilfsmittels muss dem Gesamtgewicht der auf ihm stehenden Lagereinheiten entsprechen”: create table Lagerhilfsmittel ( LhNr char(8) primary key, Gewicht GewichtsAngabe check ( Gewicht = select sum(Le.Gewicht) from Lagereinheit Le where LhNr = Le.LhNr), ); Geänderte Qualifizierungsregel!

90 Wertebeschränkung (3) Beispiel: Lagerhilfsmittel müssen in ihren Abmessungen stets so gestaltet sein, dass mindestens ein Lagerort sie aufnehmen kann. create table LagerhilfsmittelArt ( Länge integer check ( Länge <= any ( select Länge from Lagerort ) ), Breite integer check ( Breite <= any ( select Breite from Lagerort)), ); create table LagerhilfsmittelArt ( Länge integer, Breite integer, check ( exists ( select  from Lagerort Lo where Länge <= Lo.Länge and Breite <= Lo.Breite ) ), ); Formulierung stellt nicht sicher, dass unter den Lagerorten einer ist, der beide Bedingungen erfüllt.

91 Relationenübergreifende Bedingungen
Relationenübergreifende Konsistenzbedingungen werden durch create assertion eingeleitet. Beispiel: Die Nummerierung der Artikelarten sieht drei Zahlenstellen vor. Daher dürfen nur weniger als 1000 Artikelarten definiert sein. Zwei Relationen, ArtikelArt und DurchlaufendeArtikelArt, müssen in der Summe beachtet werden. create assertion ZahlDerArtikelArten check ( (select count() from ArtikelArt + select count() from DurchlaufendeArtikelArt ) < 1000 );

92 Anbindung an Programmiersprachen
Kapitel 4.5: Anbindung an Programmiersprachen

93 Eingebettetes SQL (1) Motivation: SQL ist alleinstehende DDL und DML.
Anwendungsprogramme können sie nicht nutzen; dies ist jedoch für Nutzung in der Praxis unabdingbar. Lösung: Einbettung von SQL-Anweisungen in ein Anwendungsprogramm. Jede (imperative) Programmiersprache kann für SQL als Wirtssprache dienen. Standardisierungen: ODBC (Microsoft), JDBC (Java), SQLJ.

94 Eingebettetes SQL (2) Präprozessoransatz für Anwendungsprogramm in C:
SQL-Anweisungen sind im Programm durch spezielle Schlüsselworte gekennzeichnet (in C: exec sql) Programmzeilen, in denen Wirtsprogramm und SQL-Anweisung gemischt auftreten, sind untersagt. Unter diesen Umständen kann ein Präprozessor die SQL-Anweisungen umsetzen, ohne dass er C vollständig kennen müsste. Präprozessor ersetzt die SQL-Anweisungen durch C-Deklarationen und C-Prozeduraufrufe einer speziellen Datenbank-Laufzeitbibliothek. Das nach den Ersetzungen nur noch C-Code umfassende Programm kann anschließend in herkömmliche Weise vom C-Übersetzer verarbeitet werden. Vorteil: kein neuer C-Übersetzer notwendig, Nachteil: eher lose Kopplung der Sprachen, keine strenge Typisierung.

95 Eingebettetes SQL (3) Problem der Fehlanpassung (“impedance mismatch”): Verarbeitung mengenwertiger Daten in einer satz (record) -orientierten Sprache Lösung: Definition von Iteratoren (häufig als Cursor bezeichnet) für die interessierenden Relationen. Jeder Cursor zeigt zu jedem Zeitpunkt auf ein Tupel seiner Relation. Die Werte des so referenzierten aktuellen Tupels können ausgelesen bzw. verändert werden. Ein Cursor kann weiterhin um ein Tupel vor- bzw. zurückgesetzt werden. Indem ein Cursor innerhalb einer Programmschleife benutzt wird, kann jedes Tupel einer Ergebnisrelation erreicht werden.

96 Programmbeispiel (1) void main() { exec sql begin declare section; int artikelZahl; char[9] anr; char[26] aname; float gewicht; exec sql end declare section; exec sql declare ZählCursor cursor for select count() from ArtikelArt for read only; exec sql declare ArtikelCursor cursor for select ANr, Gewicht where AName = :aname for update of Gewicht; Deklaration von Programmvariablen in Zusammenhang mit SQL: artikelZahl und anr sind Ausgabevariablen für SQL-Spaltenwerte aname ist Eingabevariable gewicht ist Eingabe- und Ausgabevariable Variablen gehören der Wirtssprache an Daher sind geeignete, zu SQL kompatible Typen zu wählen Eindeutige Cursorbenennung Spezifikation einer SQL-Anfrage, eventuell mit Parametern aus dem declare section-Block Benutzungsmodus: lesend oder (lesend und) schreibend

97 Programmbeispiel (2) Öffnen: Befehl open.
exec sql open ZählCursor; exec sql fetch ZählCursor into :artikelZahl; exec sql close ZählCursor; printf(“ArtikelArt enthält %d Tupel.\n”, artikelZahl); printf(“Suche nach Artikeln mit Name = “); scanf(“%s”, aname); exec sql open ArtikelCursor; exec sql whenever not found goto CursorSchließen; while (1) { exec sql fetch next from ArtikelCursor into :anr, :gewicht; printf(“Artikelnr: %s\n”, anr); printf(“Gewicht: %f\n”, gewicht); printf(“Neues Gewicht =“); scanf(“%f”, &gewicht); exec sql update ArtikelArt set Gewicht = :gewicht where current of ArtikelCursor; } CursorSchließen: exec sql close ArtikelCursor; return; Öffnen: Befehl open. Zu diesem Zeitpunkt wird die gebundene Anfrage ausgewertet. Schließen: Befehl close Holen eines Tupels und Weiterbewegen: Befehl fetch next Aktualisieren: update in Verbindung mit Nennung eines Cursors Fehlerbehandlung: Befehl whenever

98 Eingebettetes SQL (4) Weitere Möglichkeiten:
Positioniertes Update (siehe Beispiel) kann auch zum Löschen von Tupeln eingesetzt werden. Update und Löschen ist außerdem wie im interaktiven Fall spezifizierbar. Cursor können, sofern entsprechend spezifiziert, explizit vorwärts- und rückwärtsgesetzt werden, auch um mehrere Tupel, auch auf Anfang und Ende der Relation. Definition von SQL-Anfragen zur Laufzeit des Programms möglich: dynamisches SQL.

99 Eingebettetes SQL (5)


Herunterladen ppt "Kapitel 4: Relationale Sprachen – SQL"

Ähnliche Präsentationen


Google-Anzeigen