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

1 Teil I Datenmodelle Kapitel 4: Relationale Sprachen – SQL

Embed Size (px)

Citation preview

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

1

Teil ITeil IDatenmodelleDatenmodelle

Kapitel 4: Relationale Sprachen – SQL

Page 2: 1 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

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

3Der 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

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

4

Kapitel 4.1: SQL - Schemadefinition

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

5Vordefinierte 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 n1).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 32000 Zeichen.

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

6Vordefinierte Datentypen (2)

Ganzzahlen: smallint integer (oder äquivalent: int), wobei hier mindestens der

Zahlenbereich von smallint abgedeckt sein mussFestkommazahlen: 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

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

7Vordefinierte Datentypen (3)

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

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

8Benutzerdefinierte 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 1create domain MengenAngabe as integer default 1 constraint MengenAngabeConstraint check (value >= 1 and value <= 10000);

Gewichtsangaben mit reellen Werten größer als 0create 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.

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

9

Tabellendefinition (1)

Zunächst die einfachste

Syntaktische Form:

create table relations-name (

attribut-name domäne { , attribut-name domäne }*

);

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

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));

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

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.

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

12

Kapitel 4.2: SQL - Anfragen über der Datenbasis

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

13

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.

1. Zunächst wird das kartesische Produkt über den Ri gebildet.

Syntaktische Grundform

select A1, A2, …, An

from R1, R2, …, Rm

where bedingungw ;

3. Abschließende Projektion auf die Ai.

Symbol “” anstelle von Attributnamen bedeutet “alle Attribute”.

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

14

Abarbeitungsmodell I

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))

Anfrage liefert wieder eine gültige Relation. Diese ist allerdings temporär und wird später wieder

verworfen.

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

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!

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

16

Projektion (1)ArtikelArtANr AName Menge Lieferant GewichtA-001 Anlasser 1 Bosch 2.00A-002 Kolben 1 Mahle 0.05A-003 Kolbenringe 50 Mahle 0.10A-004 Kurbelwelle 1 Mahle 1.00A-005 Nockenwelle 1 Mahle 0.50A-006 Ölwanne 1 Erzberg 1.50A-007 Pleuel 1 Mahle 0.10A-008 Ventile 20 Mahle 0.40A-009 Ventile 20 Bosch 0.40A-010 Ventilfedern 50 Pohlmann 0.50A-011 Zündkerzen 20 Bosch 1.00A-012 Zündkerzen 20 Osram 1.00A-013 Zündkerzenkabel 10 Siemens 0.80A-014 Zündkerzenstecker 10 Siemens 0.80A-015 Zündspule 5 Siemens 2.50A-016 Zündverteiler 5 Bosch 0.50A-017 Zylinderdichtung 10 Erzberg 1.00A-018 Zylinderdichtung 10 Pohlmann 1.00A-019 Zylinderkopf 1 Mahle 3.00A-020 Zylinderkurbelgehäuse 1 Erzberg 6.00

select ANr, ANamefrom ArtikelArt;

Beispiel:„Nummern und Namen aller Artikelarten“: (ANr, AName)(ArtikelArt)

A in ArtikelArt; A.ANr, A.AName

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

17

Projektion (2)ArtikelArtANr AName Menge Lieferant GewichtA-001 Anlasser 1 Bosch 2.00A-002 Kolben 1 Mahle 0.05A-003 Kolbenringe 50 Mahle 0.10A-004 Kurbelwelle 1 Mahle 1.00A-005 Nockenwelle 1 Mahle 0.50A-006 Ölwanne 1 Erzberg 1.50A-007 Pleuel 1 Mahle 0.10A-008 Ventile 20 Mahle 0.40A-009 Ventile 20 Bosch 0.40A-010 Ventilfedern 50 Pohlmann 0.50A-011 Zündkerzen 20 Bosch 1.00A-012 Zündkerzen 20 Osram 1.00A-013 Zündkerzenkabel 10 Siemens 0.80A-014 Zündkerzenstecker 10 Siemens 0.80A-015 Zündspule 5 Siemens 2.50A-016 Zündverteiler 5 Bosch 0.50A-017 Zylinderdichtung 10 Erzberg 1.00A-018 Zylinderdichtung 10 Pohlmann 1.00A-019 Zylinderkopf 1 Mahle 3.00A-020 Zylinderkurbelgehäuse 1 Erzberg 6.00

select ANamefrom ArtikelArt;

Beispiel:„Namen aller Artikelarten“: (AName)(ArtikelArt)

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

18

Projektion (3)ArtikelArtANr AName Menge Lieferant GewichtA-001 Anlasser 1 Bosch 2.00A-002 Kolben 1 Mahle 0.05A-003 Kolbenringe 50 Mahle 0.10A-004 Kurbelwelle 1 Mahle 1.00A-005 Nockenwelle 1 Mahle 0.50A-006 Ölwanne 1 Erzberg 1.50A-007 Pleuel 1 Mahle 0.10A-008 Ventile 20 Mahle 0.40A-009 Ventile 20 Bosch 0.40A-010 Ventilfedern 50 Pohlmann 0.50A-011 Zündkerzen 20 Bosch 1.00A-012 Zündkerzen 20 Osram 1.00A-013 Zündkerzenkabel 10 Siemens 0.80A-014 Zündkerzenstecker 10 Siemens 0.80A-015 Zündspule 5 Siemens 2.50A-016 Zündverteiler 5 Bosch 0.50A-017 Zylinderdichtung 10 Erzberg 1.00A-018 Zylinderdichtung 10 Pohlmann 1.00A-019 Zylinderkopf 1 Mahle 3.00A-020 Zylinderkurbelgehäuse 1 Erzberg 6.00

select distinct ANamefrom ArtikelArt;

Beispiel:„Namen aller Artikelarten“: (AName)(ArtikelArt)

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

19Selektion (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)

LagerortArtLoaNr Länge Breite Höhe MaxGewicht

LOA-01 800 800 800 300.00LOA-02 1200 800 1200 500.00LOA-03 1200 1200 2000 1000.00

select from LagerortArtwhere Höhe > Breite;

LOA in LagerortArt;LOA.LoaNr, LOA.Breite, LOA.Länge, LOA.Höhe, LOA.MaxGewichtwhere LOA.Höhe > LOA.Breite

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

20Selektion (2)

„Die Nummern aller Lagerortarten, deren Höhe ihre Breite überschreitet und deren Tragfähigkeit geringer als 600.00 kg ist.“:

LoaNr(MaxGewicht < 600.00 (Höhe > Breite(LagerortArt)))

oderLoaNr((Höhe > Breite) (MaxGewicht < 600.00) (LagerortArt)))

LagerortArtLoaNr Länge Breite Höhe MaxGewicht

LOA-01 800 800 800 300.00LOA-02 1200 800 1200 500.00LOA-03 1200 1200 2000 1000.00

select LoaNr from LagerortArtwhere Höhe > Breiteand MaxGewicht<600.00;

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

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).

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

22

Mengenoperationen (1)

Vereinigung: union-Operator verbindet einzelne select-Anfragen von

attributgleichem und typkompatiblem ErgebnisBeispiel: Vereinigung der beiden Relationen ArtikelArt und

DurchlaufendeArtikelArt: select from ArtikelArt union select from DurchlaufendeArtikelArt;

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

23

Mengenoperationen (2)ArtikelArtANr AName Menge Lieferant GewichtA-001 Anlasser 1 Bosch 2.00A-002 Kolben 1 Mahle 0.05A-003 Kolbenringe 50 Mahle 0.10A-004 Kurbelwelle 1 Mahle 1.00A-005 Nockenwelle 1 Mahle 0.50A-006 Ölwanne 1 Erzberg 1.50A-007 Pleuel 1 Mahle 0.10A-008 Ventile 20 Mahle 0.40A-009 Ventile 20 Bosch 0.40A-010 Ventilfedern 50 Pohlmann 0.50A-011 Zündkerzen 20 Bosch 1.00A-012 Zündkerzen 20 Osram 1.00A-013 Zündkerzenkabel 10 Siemens 0.80A-014 Zündkerzenstecker 10 Siemens 0.80A-015 Zündspule 5 Siemens 2.50A-016 Zündverteiler 5 Bosch 0.50A-017 Zylinderdichtung 10 Erzberg 1.00A-018 Zylinderdichtung 10 Pohlmann 1.00A-019 Zylinderkopf 1 Mahle 3.00A-020 Zylinderkurbelgehäuse 1 Erzberg 6.00

DurchlaufendeArtikelArtANr AName Menge Lieferant GewichtA-003 Kolbenringe 50 Mahle 0.10A-008 Ventile 20 Mahle 0.40A-009 Ventile 20 Bosch 0.40A-010 Ventilfedern 50 Pohlmann 0.50A-011 Zündkerzen 20 Bosch 1.00A-012 Zündkerzen 20 Osram 1.00A-013 Zündkerzenkabel 10 Siemens 0.80A-014 Zündkerzenstecker 10 Siemens 0.80A-030 Ölfilter 100 Erzberg 6.00A-031 Schwungrad 1 Mahle 5.00

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

24

Mengenoperationen (3)ArtikelArtANr AName Menge Lieferant GewichtA-001 Anlasser 1 Bosch 2.00A-002 Kolben 1 Mahle 0.05A-003 Kolbenringe 50 Mahle 0.10A-004 Kurbelwelle 1 Mahle 1.00A-005 Nockenwelle 1 Mahle 0.50A-006 Ölwanne 1 Erzberg 1.50A-007 Pleuel 1 Mahle 0.10A-008 Ventile 20 Mahle 0.40A-009 Ventile 20 Bosch 0.40A-010 Ventilfedern 50 Pohlmann 0.50A-011 Zündkerzen 20 Bosch 1.00A-012 Zündkerzen 20 Osram 1.00A-013 Zündkerzenkabel 10 Siemens 0.80A-014 Zündkerzenstecker 10 Siemens 0.80A-015 Zündspule 5 Siemens 2.50A-016 Zündverteiler 5 Bosch 0.50A-017 Zylinderdichtung 10 Erzberg 1.00A-018 Zylinderdichtung 10 Pohlmann 1.00A-019 Zylinderkopf 1 Mahle 3.00A-020 Zylinderkurbelgehäuse 1 Erzberg 6.00A-030 Ölfilter 100 Erzberg 6.00A-031 Schwungrad 1 Mahle 5.00

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

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 select from DurchlaufendeArtikelArt;

Durchschnitts- und Differenzbildung: intersect-Operator except-Operator Gleiche Nutzungsbedingungen wie für union

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

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)

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

27Verbindungsoperationen (2)

LagerortLoNr LoaNr Gewicht

LO-001 LOA-01 5.50LO-002 LOA-01 0.00LO-003 LOA-01 0.00LO-004 LOA-02 6.00LO-005 LOA-02 33.00LO-006 LOA-02 7.50LO-007 LOA-02 520.50LO-008 LOA-02 0.00LO-009 LOA-03 41.00LO-010 LOA-03 0.00

LagerortArtLoaNr Länge Breite Höhe MaxGewicht

LOA-01 800 800 800 300.00LOA-02 1200 800 1200 500.00LOA-03 1200 1200 2000 1000.00

500.00520.50LO-007

MaxGewichtGewichtLoNr

select LoNr, Gewicht, MaxGewicht from Lagerort Lo, LagerortArt Loawhere Lo.LoaNr = Loa.LoaNrand Gewicht > MaxGewicht;

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

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.

select LoNr, Gewicht, MaxGewicht from Lagerort Lo, LagerortArt Loawhere Lo.LoaNr = Loa.LoaNrand Gewicht > MaxGewicht;

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

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.”

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

30

Verbindungsoperationen (5)

Flache Formulierungselect A.ANr, ANamefrom ArtikelArt A, Lagereinheit Le1, Lagereinheit Le2whereA.ANr = Le1.ANrand A.ANr = Le2.ANrand Le1.LeNr <> Le2.LeNr;

Geschachtelte Formulierungselect ANr, Anamefrom ArtikelArt Awhere exists (

select from Lagereinheit Le1whereA.ANr = ANrand exists (

select from Lagereinheit whereA.ANr = ANr and Le1.LeNr <> LeNr ) );

Aliasnamen hier zwingend wegen gleicher Relationsnamen!

Vorkommen expliziter und impliziter Qualifizierung.

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

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))

select ANr, Anamefrom ArtikelArt Awhere exists (

select from Lagereinheit Le1where A.ANr = ANrand exists (

select from Lagereinheit where A.ANr = ANr and Le1.LeNr <> LeNr ) );

ANr ANameA-001 KolbenA-006 KurbelwelleA-015 Zündspule

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

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, Anamefrom ArtikelArt Awhere exists (

select from Lagereinheit Le1where A.ANr = ANrand exists (

select from Lagereinheit where A.ANr = ANr and Le1.LeNr <> LeNr ) );

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

33Verbindungsoperationen (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 LoaNrfrom LagerortArt Loa1where not exists ( select from LagerortArt where Loa1.MaxGewicht > MaxGewicht);

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

34Verbindungsoperationen (7)

LagerortArtLoaNr Länge Breite Höhe MaxGewicht

LOA-01 800 800 800 300.00LOA-02 1200 800 1200 500.00LOA-03 1200 1200 2000 1000.00

LOA-01

LoaNr

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

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, MaxGewichtfrom LagereinheitArt Lea, Lagereinheit Lewhere Lea.LeaNr = Le.LeaNr;

Semijoin daran erkennbar, dass nur Ausgabe von LagereinheitArt-Attributen

Stattdessen auch: select Lea.

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

36Verbindungsoperationen (8)

LagereinheitArtLeaNr LeaName Länge Breite Höhe MaxGewicht

LEA-01 Stapelkasten 580 380 300 300.00LEA-02 Stapelkasten 760 580 425 300.00LEA-03 Drehstapelkasten 580 395 105 250.00LEA-04 Drehstapelkasten 580 395 356 250.00LEA-05 Stapelkorb 760 580 530 200.00LEA-06 Lagerkorb 795 495 460 200.00

LH-005105.0042A-015LEA-02LE-016

LH-0043.002A-006LEA-02LE-015

LH-0012.001A-001LEA-04LE-014

LH-00512.0012A-012LEA-01LE-013

LH-00312.004A-019LEA-02LE-012

LH-00516.0016A-011LEA-01LE-011

LH-0075.2013A-008LEA-04LE-010

LH-0036.001A-020LEA-02LE-009

LH-00315.0030A-010LEA-01LE-008

LH-006212.5085A-015LEA-05LE-007

LH-0070.306A-002LEA-03LE-006

LH-0044.503A-006LEA-02LE-005

LH-006175.00175A-017LEA-05LE-004

LH-00221.0042A-005LEA-01LE-003

LH-00220.0020A-004LEA-02LE-002

LH-0014.002A-001LEA-04LE-001

LhNrGewichtStückzahlANrLeaNr LeNr

Lagereinheit

LagereinheitArtLeaNr LeaName Länge Breite Höhe MaxGewicht

LEA-01 Stapelkasten 580 380 300 300.00LEA-02 Stapelkasten 760 580 425 300.00LEA-03 Drehstapelkasten 580 395 105 250.00LEA-04 Drehstapelkasten 580 395 356 250.00LEA-05 Stapelkorb 760 580 530 200.00

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

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 LagereinheitArtwhere LeaNr = any (

select LeaNrfrom Lagereinheit) ;

in ist Abkürzung für = any:select from LagereinheitArtwhereLeaNr in (

select LeaNrfrom Lagereinheit );

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

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”:select LoaNrfrom LagerortArtwhereMaxGewicht <= all (

select MaxGewicht from LagerortArt );

not in ist Abkürzung für <> all.Beispiel: “Lagereinheitarten, für die (derzeit) keine Lagereinheiten existieren”: select from LagereinheitArtwhereLeaNr not in (

select LeaNrfrom Lagereinheit );

select LoaNrfrom LagerortArt Loa1where not exists ( select from LagerortArt where Loa1.MaxGewicht > MaxGewicht);

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

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.

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

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 MaxGewichtNULL LEA-01 Stapelkasten 580 380 300 300.00NULL LEA-02 Stapelkasten 760 580 425 300.00NULL LEA-03 Drehstapelkasten 580 395 105 250.00NULL LEA-04 Drehstapelkasten 580 395 356 250.00NULL LEA-05 Stapelkorb 760 580 530 200.00NULL LEA-06 Lagerkorb 795 495 460 200.00

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

41

Konstanten und Ausdrücke (3)Rechenoperatoren in der select- und where-Klausel: “Alle Lagereinheitarten mit einer Mindeststellfläche von 400000

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 >= 400000;

LeaNr LeaName Länge Breite Höhe MaxGewichtLEA-01 Stapelkasten 580 380 300 300.00LEA-02 Stapelkasten 760 580 425 300.00LEA-03 Drehstapelkasten 580 395 105 250.00LEA-04 Drehstapelkasten 580 395 356 250.00LEA-05 Stapelkorb 760 580 530 200.00LEA-06 Lagerkorb 795 495 460 200.00

MaxGewichtInGramm

300000.00

200000.00

Stellfläche

440800

440800

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

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.

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

43

Konstanten und Ausdrücke (5)

Beispiel:

“Die Lagereinheitarten sind als gering, mittel oder hoch belastbar einzustufen”:select LeaNr, LeaName, case when MaxGewicht >= 300.00 then 'hoch'

when MaxGewicht >= 250.00 then 'mittel' else 'gering'

end as Belastbarkeitfrom LagereinheitArt;

LeaNr LeaName Länge Breite Höhe MaxGewichtLEA-01 Stapelkasten 580 380 300 300.00LEA-02 Stapelkasten 760 580 425 300.00LEA-03 Drehstapelkasten 580 395 105 250.00LEA-04 Drehstapelkasten 580 395 356 250.00LEA-05 Stapelkorb 760 580 530 200.00LEA-06 Lagerkorb 795 495 460 200.00

Belastbarkeithochhochmittelmittelgeringgering

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

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 Leawhere Le.LeaNr = Lea.LeaNrunionselect 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 Leawhere not exists ( select from Lagereinheit where Lea.LeaNr = LeaNr );

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

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

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

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;

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

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.

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

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, LeNrfrom ArtikelArt natural inner join Lagereinheit using (ANr);

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

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.LeNrfrom ArtikelArt A inner join Lagereinheit L on (A.ANr = L.ANr);

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

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)

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

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));

select ANrfrom Verträglichkeit V1where not exists (

select from Lagerort Lowhere not exists (

select from Verträglichkeit V2whereV2.ANr = V1.ANrand V2.LoNr = Lo.LoNr));

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

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.

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

53Aggregatfunktionen (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

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

54

Aggregatfunktionen (3)ArtikelArtANr AName Menge Lieferant GewichtA-001 Anlasser 1 Bosch 2.00A-002 Kolben 1 Mahle 0.05A-003 Kolbenringe 50 Mahle 0.10A-004 Kurbelwelle 1 Mahle 1.00A-005 Nockenwelle 1 Mahle 0.50A-006 Ölwanne 1 Erzberg 1.50A-007 Pleuel 1 Mahle 0.10A-008 Ventile 20 Mahle 0.40A-009 Ventile 20 Bosch 0.40A-010 Ventilfedern 50 Pohlmann 0.50A-011 Zündkerzen 20 Bosch 1.00A-012 Zündkerzen 20 Osram 1.00A-013 Zündkerzenkabel 10 Siemens 0.80A-014 Zündkerzenstecker 10 Siemens 0.80A-015 Zündspule 5 Siemens 2.50A-016 Zündverteiler 5 Bosch 0.50A-017 Zylinderdichtung 10 Erzberg 1.00A-018 Zylinderdichtung 10 Pohlmann 1.00A-019 Zylinderkopf 1 Mahle 3.00A-020 Zylinderkurbelgehäuse 1 Erzberg 6.00

Beispiel: “Zahl der Artikelarten”:    select count() as Artikelzahlfrom ArtikelArt;

Artikelzahl 20

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

55

Aggregatfunktionen (4)ArtikelArtANr AName Menge Lieferant GewichtA-001 Anlasser 1 Bosch 2.00A-002 Kolben 1 Mahle 0.05A-003 Kolbenringe 50 Mahle 0.10A-004 Kurbelwelle 1 Mahle 1.00A-005 Nockenwelle 1 Mahle 0.50A-006 Ölwanne 1 Erzberg 1.50A-007 Pleuel 1 Mahle 0.10A-008 Ventile 20 Mahle 0.40A-009 Ventile 20 Bosch 0.40A-010 Ventilfedern 50 Pohlmann 0.50A-011 Zündkerzen 20 Bosch 1.00A-012 Zündkerzen 20 Osram 1.00A-013 Zündkerzenkabel 10 Siemens 0.80A-014 Zündkerzenstecker 10 Siemens 0.80A-015 Zündspule 5 Siemens 2.50A-016 Zündverteiler 5 Bosch 0.50A-017 Zylinderdichtung 10 Erzberg 1.00A-018 Zylinderdichtung 10 Pohlmann 1.00A-019 Zylinderkopf 1 Mahle 3.00A-020 Zylinderkurbelgehäuse 1 Erzberg 6.00

select count(distinct AName) as Kategoriezahlfrom ArtikelArt;

Kategoriezahl17

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

56

Aggregatfunktionen (5)

LH-005105.0042A-015LEA-02LE-016

LH-0043.002A-006LEA-02LE-015

LH-0012.001A-001LEA-04LE-014

LH-00512.0012A-012LEA-01LE-013

LH-00312.004A-019LEA-02LE-012

LH-00516.0016A-011LEA-01LE-011

LH-0075.2013A-008LEA-04LE-010

LH-0036.001A-020LEA-02LE-009

LH-00315.0030A-010LEA-01LE-008

LH-006212.5085A-015LEA-05LE-007

LH-0070.306A-002LEA-03LE-006

LH-0044.503A-006LEA-02LE-005

LH-006175.00175A-017LEA-05LE-004

LH-00221.0042A-005LEA-01LE-003

LH-00220.0020A-004LEA-02LE-002

LH-0014.002A-001LEA-04LE-001

LhNrGewichtStückzahlANrLeaNr 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 Gesamtzahlfrom Lagereinheitwhere LhNr = 'LH-001';

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

57

LH-005105.0042A-015LEA-02LE-016

LH-0043.002A-006LEA-02LE-015

LH-0012.001A-001LEA-04LE-014

LH-00512.0012A-012LEA-01LE-013

LH-00312.004A-019LEA-02LE-012

LH-00516.0016A-011LEA-01LE-011

LH-0075.2013A-008LEA-04LE-010

LH-0036.001A-020LEA-02LE-009

LH-00315.0030A-010LEA-01LE-008

LH-006212.5085A-015LEA-05LE-007

LH-0070.306A-002LEA-03LE-006

LH-0044.503A-006LEA-02LE-005

LH-006175.00175A-017LEA-05LE-004

LH-00221.0042A-005LEA-01LE-003

LH-00220.0020A-004LEA-02LE-002

LH-0014.002A-001LEA-04LE-001

LhNrGewichtStückzahlANrLeaNr LeNr

Lagereinheit

Aggregatfunktionen (5)

Gesamtgewicht Gesamtzahl6.00 3

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

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.

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

59

Gruppierung (2)

Erweiterung des syntaktischen Rahmens:

select A1, A2, …, An

from R1, R2, …, Rm

where bedingungW

group by B1, B2, … ,Bp

having bedingungG ;

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

60

Gruppierung (3)Abarbeitungsmodell:

A1, A2, …, An(bedingungG(Bi(bedingungW (R1R2 … Rm)))) Bildung des kartesischen Produkts der Ri. Auswertung von bedingungw . Das Zwischenergebnis wird bezüglich gleicher Werte für die

Bi gruppiert ( 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 = AR1R2 … 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).

select A1, A2, …, An

from R1, R2, …, Rm

where bedingungW

group by B1, B2, … ,Bp

having bedingungG ;

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

61

Gruppierung (4)

LH-005105.0042A-015LEA-02LE-016

LH-0043.002A-006LEA-02LE-015

LH-0012.001A-001LEA-04LE-014

LH-00512.0012A-012LEA-01LE-013

LH-00312.004A-019LEA-02LE-012

LH-00516.0016A-011LEA-01LE-011

LH-0075.2013A-008LEA-04LE-010

LH-0036.001A-020LEA-02LE-009

LH-00315.0030A-010LEA-01LE-008

LH-006212.5085A-015LEA-05LE-007

LH-0070.306A-002LEA-03LE-006

LH-0044.503A-006LEA-02LE-005

LH-006175.00175A-017LEA-05LE-004

LH-00221.0042A-005LEA-01LE-003

LH-00220.0020A-004LEA-02LE-002

LH-0014.002A-001LEA-04LE-001

LhNrGewichtStückzahlANrLeaNr LeNr

Lagereinheit

LhNr Gesamtgewicht GesamtzahlLH-001 6.00 3LH-002 41.00 62LH-003 33.00 35LH-004 7.50 5LH-005 133.00 70LH-006 387.50 260LH-007 5.50 19

“Gesamtgewichte und Stückzahlen der Lagereinheiten bezogen auf die Lagerhilfsmittel”:select LhNr, sum(Gewicht) as Gesamtgewicht,

sum(Stückzahl) as Gesamtzahlfrom Lagereinheitgroup by LhNr;

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

62

Gruppierung (5)

LH-005105.0042A-015LEA-02LE-016

LH-0043.002A-006LEA-02LE-015

LH-0012.001A-001LEA-04LE-014

LH-00512.0012A-012LEA-01LE-013

LH-00312.004A-019LEA-02LE-012

LH-00516.0016A-011LEA-01LE-011

LH-0075.2013A-008LEA-04LE-010

LH-0036.001A-020LEA-02LE-009

LH-00315.0030A-010LEA-01LE-008

LH-006212.5085A-015LEA-05LE-007

LH-0070.306A-002LEA-03LE-006

LH-0044.503A-006LEA-02LE-005

LH-006175.00175A-017LEA-05LE-004

LH-00221.0042A-005LEA-01LE-003

LH-00220.0020A-004LEA-02LE-002

LH-0014.002A-001LEA-04LE-001

LhNrGewichtStückzahlANrLeaNr LeNr

Lagereinheit

LhNr Gesamtgewicht GesamtzahlLH-002 41.00 62LH-003 33.00 35LH-005 133.00 70LH-006 387.50 260

“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 Gesamtzahlfrom Lagereinheitgroup by LhNrhaving sum(Stückzahl) >= 35;

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

63

Gruppierung (6)Beispiel:“Der nach Stückzahl am häufigsten gelagerte Artikel des Lieferanten 'Bosch'”: select A.ANr, sum(Stückzahl) as Gesamtzahlfrom ArtikelArt A, Lagereinheit Lewhere A.ANr = Le.ANrand Lieferant = 'Bosch'group by A.ANrhaving sum(Stückzahl) >= all (

select sum(Stückzahl)from ArtikelArt A, Lagereinheit LewhereA.ANr = Le.ANrand Lieferant = 'Bosch'group by A.ANr );

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

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 Differenzfrom Lagereinheit Le, Lagerhilfsmittel Lhwhere 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.

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

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 Differenzfrom Lagereinheit Le, Lagerhilfsmittel Lhwhere Lh.LhNr = 'LH-001’and Le.LhNr = Lh.LhNr;

Differenz0.00

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

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.

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

67

Sortierung (2)

Beispiel: “Artikelarten, nach Lieferanten und bei gleichem Lieferanten nach Artikelnamen sortiert”:

select from ArtikelArtorder by Lieferant, AName;

1.50Erzberg1ÖlwanneA-006

1.00Pohlmann10ZylinderdichtungA-018

1.00Osram20ZündkerzenA-012

3.00Mahle1ZylinderkopfA-019

0.05Mahle1KolbenA-002

0.10Mahle50KolbenringeA-003

1.00Mahle1KurbelwelleA-004

0.50Mahle1NockenwelleA-005

0.10Mahle1PleuelA-007

0.40Mahle20VentileA-008

0.50Pohlmann50VentilfedernA-010

0.80Siemens10ZündkerzenkabelA-013

0.80Siemens10ZündkerzensteckerA-014

2.50Siemens5ZündspuleA-015

6.00Erzberg1ZylinderkurbelgehäuseA-020

1.00Erzberg10ZylinderdichtungA-017

0.50Bosch5ZündverteilerA-016

1.00Bosch20ZündkerzenA-011

0.40Bosch20VentileA-009

2.00Bosch1AnlasserA-001

GewichtLieferantMengeANameANr

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

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.

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

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.

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

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.

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

71

Kapitel 4.3: SQL - Änderungen der Datenbasis

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

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.

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

73Einfü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.

insert into ArtikelArtselect from DurchlaufendeArtikelArtwhere ANr = 'A-030';

Beispiel: Einfügen unter Zulassen von NULL-Werten:insert into ArtikelArt ( ANr, AName )

select ANr, Anamefrom DurchlaufendeArtikelArtwhere ANr = 'A-031';

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

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.

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

75

Ändern von Tupeln (2)

Beispiel: Vervollständigung der Information für das gerade eingefügte Tupel mit ANr = 'A-031':

update ArtikelArtset Menge = 1, Hersteller = 'Mahle', Gewicht = 5.00where ANr = 'A-031';

Beispiel: Die in einer Packung enthaltene Produktmenge für alle Artikel des Lieferanten 'Siemens' wird verdoppelt:

update ArtikelArtset Menge = Menge 2where Lieferant = 'Siemens';

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

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.

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

77

Löschen von Tupeln (2)

Beispiel: Löschen der Tupel mit den Artikelnummern 'A-030' und 'A-031':

delete from ArtikelArtwhere 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 Awhere not exists (

select from Lagereinheitwhere ANr = A.Anr );

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

78

Kapitel 4.4: SQL - Konsistenzbedingungen

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

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.

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

80Primä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)

);

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

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,

);

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

82Referenzielle 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),…

);

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

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

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

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.

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

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 cascadeon 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.

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

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,…

);

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

87

StandardbelegungVorgehensweise: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.

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

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),…

);

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

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 =select sum(Le.Gewicht)from Lagereinheit Lewhere LhNr = Le.LhNr),

…);

Geänderte Qualifizierungsregel!

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

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ängefrom Lagerort ) ),

Breite integer check (Breite <= any (

select Breitefrom Lagerort)),

…);

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 from Lagerort Lowhere Länge <= Lo.Längeand Breite <= Lo.Breite ) ),

…);

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

91

Relationenübergreifende BedingungenRelationenü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 );

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

92

Kapitel 4.5:Anbindung an Programmiersprachen

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

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.

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

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.

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

95

Eingebettetes SQL (3)Problem der Fehlanpassung (“impedance mismatch”):Verarbeitung mengenwertiger Daten in einer satz (record) -

orientierten SpracheLö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.

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

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 forselect count()from ArtikelArtfor read only;

exec sql declare ArtikelCursor cursor forselect ANr, Gewichtfrom ArtikelArtwhere AName = :anamefor 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

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

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 = :gewichtwhere 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

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

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.

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

99

Eingebettetes SQL (5)

FH Gremminger