Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "1 Teil I Datenmodelle Kapitel 4: Relationale Sprachen – SQL."—  Präsentation transkript:

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

2 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 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 4 Kapitel 4.1: SQL - Schemadefinition

5 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 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 7 Vordefinierte Datentypen (3) Bitketten: bit(n), bit varying(n) Large objects (unstrukturiert): blob : binary large object clob : character large object

8 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 9 Tabellendefinition (1) Zunächst die einfachste Syntaktische Form: create table relations-name ( attribut-name domäne {, attribut-name domäne }* );

10 10 Tabellendefinition (2) 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), ANr 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 ( LhaNr char(8), LhaName char(25), Länge integer, Breite integer, Höhe integer, MaxGewicht Gewichtsangabe ); Beispiel Lagerverwaltungswelt: create table Lagerort ( LoNr char(8), LoaNr char(8), Gewicht Gewichtsangabe ); create table LagerortArt ( LoaNr char(8), Länge integer, Breite integer, Höhe integer, MaxGewicht Gewichtsangabe ); create table Verträglichkeit ( ANr char(8), LoNr char(8) );

11 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 12 Kapitel 4.2: SQL - Anfragen über der Datenbasis

13 13 2. (optional): Einschränkung der Tupel des kartesischen Produkts im Sinne einer Selektion. bedingung w ist Boolesche Formel über Vergleichen von Attributen untereinander oder von Attributen mit Konstanten. 1. Zunächst wird das kartesische Produkt über den R i gebildet. Syntaktische Grundform selectA 1, A 2, …, A n fromR 1, R 2, …, R m wherebedingung w ; 3. Abschließende Projektion auf die A i. Symbol anstelle von Attributnamen bedeutet alle Attribute.

14 14 Abarbeitungsmodell I selectA 1, A 2, …, A n fromR 1, R 2, …, R m wherebedingung w ; Entspricht Ausdruck des Tupelkalküls U in R 1, V in R 2,..., W in R m U.A 1, V.A 2,..., W.A n where bedingung w Entsprechender relationenalgebraischer Ausdruck: A1, A2, …, An ( bedingungw (R 1 R 2 … R m )) Anfrage liefert wieder eine gültige Relation. Diese ist allerdings temporär und wird später wieder verworfen.

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

16 16 Projektion (1) selectANr, AName fromArtikelArt; Beispiel: Nummern und Namen aller Artikelarten: (ANr, AName) (ArtikelArt) A in ArtikelArt; A.ANr, A.AName

17 17 Projektion (2) selectAName fromArtikelArt; Beispiel: Namen aller Artikelarten: (AName) (ArtikelArt)

18 18 Projektion (3) selectdistinct AName fromArtikelArt; Beispiel: Namen aller Artikelarten: (AName) (ArtikelArt)

19 19 Selektion (1) Spezifikation von Selektionen erfolgt in der where-Klausel. Bezüglich Bedingung bedingung w 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 fromLagerortArt whereHöhe > Breite; LOA in LagerortArt; LOA.LoaNr, LOA.Breite, LOA.Länge, LOA.Höhe, LOA.MaxGewicht where LOA.Höhe > LOA.Breite

20 20 Selektion (2) Die Nummern aller Lagerortarten, deren Höhe ihre Breite überschreitet und deren Tragfähigkeit geringer als kg ist.: LoaNr ( MaxGewicht Breite (LagerortArt))) oder LoaNr ( (Höhe > Breite) (MaxGewicht < ) (LagerortArt))) selectLoaNr fromLagerortArt whereHöhe > Breite andMaxGewicht<600.00;

21 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 fromArtikelArt, 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 22 Mengenoperationen (1) Vereinigung: union-Operator verbindet einzelne select-Anfragen von attributgleichem und typkompatiblem Ergebnis Beispiel: Vereinigung der beiden Relationen ArtikelArt und DurchlaufendeArtikelArt: select fromArtikelArt union select fromDurchlaufendeArtikelArt;

23 23 Mengenoperationen (2)

24 24 Mengenoperationen (3)

25 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 fromArtikelArt unionall select fromDurchlaufendeArtikelArt; Durchschnitts- und Differenzbildung: intersect-Operator except-Operator Gleiche Nutzungsbedingungen wie für union

26 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) LagerortArt LoaNr2 LoaNr )

27 27 Verbindungsoperationen (2) LO-007 MaxGewichtGewichtLoNr selectLoNr, Gewicht, MaxGewicht fromLagerort Lo, LagerortArt Loa whereLo.LoaNr = Loa.LoaNr andGewicht > MaxGewicht;

28 28 Verbindungsoperationen (3) 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. selectLoNr, Gewicht, MaxGewicht fromLagerort Lo, LagerortArt Loa whereLo.LoaNr = Loa.LoaNr andGewicht > MaxGewicht;

29 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 30 Verbindungsoperationen (5) Flache Formulierung selectA.ANr, AName fromArtikelArt A, Lagereinheit Le1, Lagereinheit Le2 whereA.ANr = Le1.ANr andA.ANr = Le2.ANr andLe1.LeNr <> Le2.LeNr; Geschachtelte Formulierung selectANr, Aname fromArtikelArt A where exists ( select fromLagereinheit Le1 whereA.ANr = ANr and exists ( select fromLagereinheit whereA.ANr = ANr andLe1.LeNr <> LeNr ) ); Aliasnamen hier zwingend wegen gleicher Relationsnamen! Vorkommen expliziter und impliziter Qualifizierung.

31 31 Abarbeitungsmodell bei Schachtelung 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)) selectANr, Aname fromArtikelArt A where exists ( select fromLagereinheit Le1 whereA.ANr = ANr and exists ( select fromLagereinheit whereA.ANr = ANr andLe1.LeNr <> LeNr ) );

32 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. selectANr, Aname fromArtikelArt A where exists ( select fromLagereinheit Le1 whereA.ANr = ANr and exists ( select fromLagereinheit whereA.ANr = ANr andLe1.LeNr <> LeNr ) );

33 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 (LagerortArt MaxGewicht2 MaxGewicht )) LOA1 in LagerortArt, LOA2 in LagerortArt; LOA1.LoaNr where LOA2 (LOA1.MaxGewicht > LOA2.MaxGewicht) selectLoaNr fromLagerortArt Loa1 wherenot exists ( select fromLagerortArt whereLoa1.MaxGewicht > MaxGewicht);

34 34 Verbindungsoperationen (7) LOA-01 LoaNr

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

36 36 Verbindungsoperationen (8)

37 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 fromLagereinheitArt whereLeaNr = any ( selectLeaNr fromLagereinheit) ; in ist Abkürzung für = any: select fromLagereinheitArt whereLeaNr in ( selectLeaNr fromLagereinheit );

38 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 Beispiel: Nummer der Lagerortart mit der geringsten Tragfähigkeit: selectLoaNr fromLagerortArt whereMaxGewicht <= all ( selectMaxGewicht fromLagerortArt ); not in ist Abkürzung für <> all. Beispiel: Lagereinheitarten, für die (derzeit) keine Lagereinheiten existieren: select fromLagereinheitArt whereLeaNr not in ( selectLeaNr fromLagereinheit ); selectLoaNr fromLagerortArt Loa1 wherenot exists ( select fromLagerortArt whereLoa1.MaxGewicht > MaxGewicht);

39 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 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: selectNULL as Nullwert, Lea. fromLagereinheitArt 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 41 Konstanten und Ausdrücke (3) Rechenoperatoren in der select- und where-Klausel: Alle Lagereinheitarten mit einer Mindeststellfläche von cm 2. Im Ergebnis soll die jeweilige Stellfläche als eigene Spalte erscheinen und die maximale Belastbarkeit (MaxGewicht) in Gramm statt Kilogramm ausgegeben werden. selectLeaNr, LeaName, Länge, Breite, Höhe, MaxGewicht 1000 as MaxGewichtInGramm, Länge Breite as Stellfläche fromLagereinheitArt; whereLä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 MaxGewichtInGramm Stellfläche

42 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 43 Konstanten und Ausdrücke (5) Beispiel: Die Lagereinheitarten sind als gering, mittel oder hoch belastbar einzustufen: selectLeaNr, LeaName, case when MaxGewicht >= then 'hoch' when MaxGewicht >= then 'mittel' else 'gering' end as Belastbarkeit fromLagereinheitArt; 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 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 selectLeNr, ANr, Stückzahl, Gewicht, LhNr, Lea.LeaNr, LeaName, Länge, Breite, Höhe, MaxGewicht fromLagereinheit Le, LagereinheitArt Lea whereLe.LeaNr = Lea.LeaNr union selectNULL as LeNr, NULL as ANr, NULL as Stückzahl, NULL as Gewicht, NULL as LhNr, Lea.LeaNr, LeaName, Länge, Breite, Höhe, MaxGewicht fromLagereinheitArt Lea wherenot exists ( select fromLagereinheit whereLea.LeaNr = LeaNr );

45 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 R 1 op R 2 op … op R n op spezifiziert dabei einen relationenalgebraischen Verbindungsoperator aus folgenden Möglichkeiten: cross join | [ natural ] { left | right | full } [ outer ] join | [ natural ] { inner | union } join

46 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. Spezifikation einer inneren Verbindung (normaler Theta-Join). Optionales natural fordert wieder eine natürliche Verbindung. Lagereinheit 6 LagereinheitArt: select from Lagereinheit natural right outer join LagereinheitArt;

47 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 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. selectANr, AName, LeNr fromArtikelArt natural inner join Lagereinheit using (ANr);

49 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. selectA.ANr, A.AName, L.LeNr fromArtikelArt A inner join Lagereinheit L on (A.ANr = L.ANr);

50 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 51 Division (2) V1 in Verträglichkeit, V2 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)); selectANr fromVerträglichkeit V1 where not exists ( select fromLagerort Lo where not exists ( select fromVerträglichkeit V2 whereV2.ANr = V1.ANr andV2.LoNr = Lo.LoNr));

52 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 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 54 Aggregatfunktionen (3) Beispiel: Zahl der Artikelarten: selectcount( ) as Artikelzahl fromArtikelArt; Artikelzahl 20

55 55 Aggregatfunktionen (4) selectcount(distinct AName) as Kategoriezahl fromArtikelArt; Kategoriezahl 17

56 56 Aggregatfunktionen (5) Gesamtgewicht der Lagereinheiten und die Gesamtstückzahl der darin gelagerten Artikel auf dem Lagerhilfsmittel mit der Nummer 'LH-001': selectsum(Gewicht) as Gesamtgewicht, sum(Stückzahl) as Gesamtzahl fromLagereinheit whereLhNr = 'LH-001';

57 57 Aggregatfunktionen (5) Gesamtgewicht Gesamtzahl

58 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 59 Gruppierung (2) Erweiterung des syntaktischen Rahmens : selectA 1, A 2, …, A n fromR 1, R 2, …, R m wherebedingung W group byB 1, B 2, …,B p havingbedingung G ;

60 60 Gruppierung (3) Abarbeitungsmodell: A1, A2, …, An ( bedingungG ( Bi ( bedingungW (R 1 R 2 … R m )))) Bildung des kartesischen Produkts der R i. Auswertung von bedingung w. Das Zwischenergebnis wird bezüglich gleicher Werte für die B i gruppiert ( Gruppierungsoperator). Auf den Gruppen finden optional Selektionen mittels bedingung G statt. Die Bedingung muss sich auf die Gruppeneigenschaften, also auf die Attribute A\ B i, beziehen (mit A = A R1 R2 … Rm ). Abschließend Projektion. Für originäre Attribute A i muss gelten A i B i, d.h. sie müssen in der group by-Klausel auftreten. Für Ergebnisse von Aggregatfunktionen müssen sich diese auf die Attribute A\ B i, beziehen (Anwendung der Funktionen einzeln auf die Menge zu jeder Gruppe). selectA 1, A 2, …, A n fromR 1, R 2, …, R m wherebedingung W group byB 1, B 2, …,B p havingbedingung G ;

61 61 Gruppierung (4) LhNrGesamtgewichtGesamtzahl LH LH LH LH LH LH LH Gesamtgewichte und Stückzahlen der Lagereinheiten bezogen auf die Lagerhilfsmittel: selectLhNr, sum(Gewicht) as Gesamtgewicht, sum(Stückzahl) as Gesamtzahl fromLagereinheit group by LhNr;

62 62 Gruppierung (5) LhNrGesamtgewichtGesamtzahl LH LH LH LH Nummern der Lagereinheitarten, für die die Stückzahl der in den Lagereinheiten verpackten Artikel 35 oder mehr beträgt: selectLhNr, sum(Gewicht) as Gesamtgewicht, sum(Stückzahl) as Gesamtzahl fromLagereinheit group by LhNr havingsum(Stückzahl) >= 35;

63 63 Gruppierung (6) Beispiel: Der nach Stückzahl am häufigsten gelagerte Artikel des Lieferanten 'Bosch': selectA.ANr, sum(Stückzahl) as Gesamtzahl fromArtikelArt A, Lagereinheit Le whereA.ANr = Le.ANr andLieferant = 'Bosch' group by A.ANr havingsum(Stückzahl) >= all ( selectsum(Stückzahl) fromArtikelArt A, Lagereinheit Le whereA.ANr = Le.ANr andLieferant = 'Bosch' group by A.ANr );

64 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: selectsum(Le.Gewicht) - Lh.Gewicht as Differenz fromLagereinheit Le, Lagerhilfsmittel Lh whereLh.LhNr = 'LH-001' andLe.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 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. selectsum(Le.Gewicht) - max(Lh.Gewicht) as Differenz fromLagereinheit Le, Lagerhilfsmittel Lh whereLh.LhNr = 'LH-001 andLe.LhNr = Lh.LhNr; Differenz 0.00

66 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 67 Sortierung (2) Beispiel: Artikelarten, nach Lieferanten und bei gleichem Lieferanten nach Artikelnamen sortiert: select fromArtikelArt order by Lieferant, AName;

68 68 Zusammenfassung: select-Syntax (1) Allgemeine Form der select-Anweisung: select [distinct]item 1 [[as] A 1 ],..., item k [[as] A k ] fromtable-expr 1 [[as] R 1 ],..., table-expr l [[as] R l ] [wherecond-expr] [group bycol 1,..., col m ] [havingcond-expr] Dabei hat jedes item i eine der Formen u e i, wobei e i ein Attributname oder ein arithmetischer Ausdruck ist, u R i. (Auswahl aller Attribute von R i ), u f(e i ) mit f {count,sum,avg,min,max} und e i wie oben, u f(distinct e) mit f und e wie oben, u count( ). n statt item-Liste: Auswahl aller Spalten des durch from definierten Kart. Produkts.

69 69 Zusammenfassung: select-Syntax (2) Allgemeine Form der select-Anweisung: select [distinct]item 1 [[as] A 1 ],..., item k [[as] A k ] fromtable-expr 1 [[as] R 1 ],..., table-expr l [[as] R l ] [wherecond-expr] [group bycol 1,..., col m ] [havingcond-expr] table-expr i ist eine der früher besprochenen Verbindungsoperationen. n Verallgemeinerung: table-expr i ist allgemeiner select- Ausdruck.

70 70 Zusammenfassung: select-Syntax (3) Allgemeine Form der select-Anweisung: select [distinct]item 1 [[as] A 1 ],..., item k [[as] A k ] fromtable-expr 1 [[as] R 1 ],..., table-expr l [[as] R l ] [wherecond-expr] [group bycol 1,..., col m ] [havingcond-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 col 1,...,col m 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 71 Kapitel 4.3: SQL - Änderungen der Datenbasis

72 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 73 Einfügen von Tupeln (2) Beispiel: Einfügen einer neuen Artikelart in ArtikelArt: insertinto ArtikelArt values('A-030', ' Ölfilter', 100, 'Erzberg', 6.00); Beispiel: Die genannte Artikelart sei bereits in DurchlaufendeArtikelArt vorhanden. insertinto ArtikelArt select fromDurchlaufendeArtikelArt whereANr = 'A-030'; Beispiel: Einfügen unter Zulassen von NULL-Werten: insertinto ArtikelArt ( ANr, AName ) selectANr, Aname fromDurchlaufendeArtikelArt whereANr = 'A-031';

74 74 Ändern von Tupeln (1) Befehlsstruktur: updaterelations-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 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 whereANr = 'A-031'; Beispiel: Die in einer Packung enthaltene Produktmenge für alle Artikel des Lieferanten 'Siemens' wird verdoppelt: updateArtikelArt setMenge = Menge 2 whereLieferant = 'Siemens';

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

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

78 78 Kapitel 4.4: SQL - Konsistenzbedingungen

79 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 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 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 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: create table Lagereinheit ( foreign key ANr references ArtikelArt (ANr), … ANr char(8), … );

83 83 Referenzielle Konsistenz (2) Automatische Aktionen: Sei referenzielle Konsistenz von Y in T S bezüglich X in T R 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 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 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 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 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 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 89 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 = selectsum(Le.Gewicht) fromLagereinheit Le whereLhNr = Le.LhNr), … ); Geänderte Qualifizierungsregel!

90 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 ( selectLänge fromLagerort ) ), Breite integer check ( Breite <= any ( selectBreite fromLagerort)), … ); Formulierung stellt nicht sicher, dass unter den Lagerorten einer ist, der beide Bedingungen erfüllt. create table LagerhilfsmittelArt ( … Länge integer, Breite integer, … check ( exists ( select fromLagerort Lo whereLänge <= Lo.Länge andBreite <= Lo.Breite ) ), … );

91 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 ( (selectcount( ) from ArtikelArt + selectcount( ) from DurchlaufendeArtikelArt ) < 1000 );

92 92 Kapitel 4.5: Anbindung an Programmiersprachen

93 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 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 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 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 from ArtikelArt 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 97 Programmbeispiel (2) 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 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 99 Eingebettetes SQL (5)


Herunterladen ppt "1 Teil I Datenmodelle Kapitel 4: Relationale Sprachen – SQL."

Ähnliche Präsentationen


Google-Anzeigen