TDO - Skript RELATIONALE DATENBANKEN RELATIONAL DATABASE = Datenbank in Tabellenform / besteht aus Tabellen Schüler Spalte: Eigenschaften (Attribut/attribute) SNr 3 18 12 . . Vn Max Peter Herbert Zn A . . 16 17 16 . . Müller Berger Maier . . Zeile: Datensatz SQL stuctured query language (strukturierte Abfrage Sprache) select from where Bsp: bestimmt, welche Felder anzuzeigen sind. wählt aus der Datenbank eine Tabelle aus gibt die Bedingung an, die die Datensätze erfüllen müssen Alle Zunamen aus der Tabelle Schüler, die älter als 16 sind. select Zn from schüler where A>16 Bsp: Alle Zunamen aus der Tabelle Schüler, die älter als 16 sind und 'Josef' heißen. select Zn from schüler where A>16 and Vn='Josef' by K. Zimmermann Seite: 1 1994/95 TDO - Skript Bsp: Vn pilot Zn Fst . . . . . . I) Alle Zunamen aus der Tabelle Piloten, deren Flugstunden mehr als 1000 beträgt. select Zn from pilot where Fst>1000 II) Alle Zunamen aus der Tabelle Piloten, die weniger als 500 Flugstunden haben und 'Franz' heißen. select Zn from pilot where Fst<500 and Vn='Franz' III) Alle Zunamen aus der Tabelle Piloten, bei denen Vor- und Zuname gleich sind oder mehr als 2000 Flugstunden haben. select Zn from pilot where Vn=Zn or Fst>2000 S V Zn Verein Verein Präsident Herzog Stanzl Bremen Austria Bremen Austria Pfanner Haym bilden eines KARTESISCHEN PRODUKTS from S, V S.Zn S.Verein V.Verein V.Präsident Herzog Herzog Stanzl Stanzl Bremen Bremen Austria Austria Bremen Austria Bremen Austria Pfanner Haym Pfanner Haym Datensatz 2, 3 unnötig, deshalb: where S.Verein=V.Verein by K. Zimmermann JOIN Seite: 2 1994/95 TDO - Skript Bsp: SF PF Stew A Flugzeug Roth Blau Grün 31 29 38 36 19 36 Pilot A Flugzeug Maier Müller 35 37 71 36 (from SF, PF) SF.Stew Roth Roth Blau Blau Grün Grün I) SF.A SF.Flugzeug PF.Pilot PF.A PF.Flugzeug 31 31 29 29 36 36 36 36 19 19 36 36 Maier Müller Maier Müller Maier Müller 35 37 35 37 35 37 71 36 71 36 71 36 Alle Stew. und Piloten mit gleicher Flugzeugnummer und mit älterer Stew. (als Pilot). select SF.Stew, PF.Pilot from SF, PF where (SF.Flugzeug=PF.Flugzeug) and (SF.A>PF.A) Bsp: A Autotyp I) S Stadt Stadt Land EW Autotypen (und Land) die aus England kommen. select A.Autotyp, S.Land from A, S where A.Stadt=S.Stadt and S.Land='England' II) Alle Autotypen die aus einer französischen Kleinstadt (EW<20000) kommen. select A.Autotyp from A, S where A.Stadt=S.Stadt and S.Land='Frankreich' and S.EW<20000 Bsp: Schüler Kc I) Schüler Klassen Klasse Kc Abt Lehrer Kv Lehrer Fach Alle Schüler aus der 3HBb. select Schüler from Schüler where Klasse='3HBb' by K. Zimmermann Seite: 3 1994/95 TDO - Skript II) Alle Schüler die als Klassenvorstand den Schellner haben. select Schüler from Schüler, Klassen where Schüler.Kc=Klassen.Kc and Klassen.Kv='Schellner' III) Alle Schüler die einen Chemielehrer als Klassenvorstand haben. select Schüler from Schüler, Klassen, Lehrer where Schüler.Kc=Klassen.Kc and Klassen.Kv=Lehrer.Lehrer and Fach='Chemie' IV) Alle Schüler aus der tech. Abteilung mit einem Physiklehrer als Klassenvorstand. select Schüler from Schüler, Klassen, Lehrer where Abt='tech.' and Schüler.Kc=Klassen.Kc and Klassen.Kv=Lehrer.Lehrer and Fach='Physik' Bsp: A Marke Stadt I) S Stadt Land L EWS Land Kontinent EWL Alle Automarken aus amerikanischen Großstädten. select Marke from A, S, L where A.Stadt=S.Stadt and EWS>20000 and S.Land=L.Land and Kontinent='Amerika' II) Alle Automarken, die aus Städte kommen, in denen mehr als 1/10 der jeweiligen Landesbevölkerung wohnt. select Marke from A, S, L where A.Stadt=S.Stadt and S.Land=L.Land and EWS>(0.1*EWL) SYNONYM select L, S from Landesschulinspektor L, Schu... S where L.xxxx S.xxxx by K. Zimmermann Seite: 4 1994/95 TDO - Skript Bsp: Alle Mitarbeiter samt Stellvertreter. Mitarbeiter MNr Zun 37 19 Maier Müller A Stv 50 52 19 25 M.MNr M.Zun M.A M.Stv 37 37 19 19 Maier Maier Müller Müller 50 50 52 52 19 19 25 25 S.MNr S.Zun 37 19 37 19 select M.Zun, S.Zun from Mitarbeiter M, Mitarbeiter S where M.Stv=S.MNr Maier Müller Maier Müller EQUIJOIN S.A S.Stv 50 52 50 52 19 25 19 25 (Verknüpfung innerhalb einer Tabelle) Bsp: Mensch Kind Vater 5 4 3 3 2 2 I) M1.Kind M1.Vater M2.Kind M2.Vater 5 5 5 4 4 4 3 3 3 3 3 3 2 2 2 2 2 2 5 4 3 5 4 3 5 4 3 3 2 2 3 2 2 3 2 2 Kind mit Großvater. select M1.Kind, M2.Vater from Mensch M1, Mensch M2 where M1.Vater=M2.Kind II) Geschwister. select M1.Kind, M2.Kind from Mensch M1, Mensch M2 where M1.Vater=M2.Vater and M1.Kind not M2.Kind by K. Zimmermann Seite: 5 1994/95 TDO - Skript Gruppenfunktionen (nur in select): 15, 5, 25 sum max min avg count 45 25 5 15 3 Summe Maximalwert Minimalwert Durchschnitt (=sum/count) Anzahl Bsp: Schüler S# Vn I) Alter des ältersten Schülers der 3HBc. Zn A Kl Schnitt select max(A) from Schüler where Kl='3HBc' II) Zunamen aller 17-jährigen der 3HBc. select Zn from Schüler where Kl='3HBc' and A=17 III) Durchschnittsalter der Schüler aus der 3HBc. select avg(A) from Schüler where Kl='3HBc' IV) größte Schülernummer der 3HBc. select max(S#) from Schüler where Kl='3HBc' V) Zunamen der ältesten Schüler der 3HBc. select Zn from Schüler where A= (select max(A) from Schüler where Kl='3HBc') by K. Zimmermann SUBSELECT Seite: 6 1994/95 TDO - Skript Bsp: Konzern MNr Unternehmen MName Einkommen I) Ort Unternehmen Land Maximaleinkommen. select max(Einkommen) from Konzern II) Mitarbeiter mit dem maximalsten Einkommen. select MName from Konzern where Einkommen= (select max(Einkommen) from Konzern) III) Mitarbeiter mit Land. select MName, Land from Konzern, Ort where Konzern.Unternehmen=Ort.Unternehmen GRUPPENFUNKTION macht aus Gruppe von Werten EINEN Wert. MAIER MÜLLER MAIER ROTH ROTH DISTINCT → select distinct MAIER MÜLLER ROTH ZUNAME KEINE KLAMMERN Bsp: Welche Klassen gibt es an der Schule? select distinct Kl from Schule I) Alter der Ältesten der Schule. select max(A) from Schule where Geschlecht='weiblich' II) Wie heißen die 19-jährigen an der Schule? select Zun from Schule where A=19 by K. Zimmermann Seite: 7 1994/95 TDO - Skript III) Wie heißen die ältesten Schüler der Schule? select Zun from Schüler where A= (select max(A) from Schüler) IV) Welche Schüler sind älter als der Schuldurchschnitt? select Zun from Schüler where A> (select avg(A) from Schüler) V) Welche Schüler der 3HBb sind jünger als der Jüngste der 4HBb? select Zun from Schüler where Kl='3HBb' and A< (select min(A) from Schüler where Kl='4HBb') Bsp: select Zun from Schüler where Kl='4HBa' and A< (select avg(A) from Schüler where Kl='4HBa') a) Was ergibt dieses select-Statement? Alle Schüler der 4HBa, die jünger sind als ihr Klassendurchschnitt. b) Was ergibt es, wenn der rote Teil weggelassen wird? Alle Schüler der 4HBa, die jünger sind als der Schuldurchschnitt. c) Was ergibt es, wenn nur der blaue Teil fehlt? Alle Schüler der Schule, die jünger sind als der Durchschnitt der 4HBa. Bsp: Schüler (Name, Alter, Größe, Klasse) Ort (Klasse, Stock) I) Wie groß ist der größte Schüler der Schule? select max(Größe) from Schüler II) Wie heißt er? select Name from Schüler where Größe= (select max(Größe) from Schüler) by K. Zimmermann Seite: 8 1994/95 TDO - Skript III) Was passiert, wenn mehrere Schüler mit 2,03m am größten sind? Abfrage1 Abfrage2 ergibt 2,03 ergibt die Namen dieser Schüler Es werden also alle 2,03m große Schüler (und nicht bloss einer davon) ausgegeben. IV) In welcher Klasse sitzt der größte Schüler der Schule? select Klasse from Schüler where Größe=(select max(Größe) from Schüler) KÖNNEN NATÜRLICH AUCH MEHRERE SEIN! V) In welchem Stock/welchen Stöcken sitzen 1,77m größe Schüler? select distinct Stock from Schüler, Ort where Ort.Klasse=Schüler.Klasse and Größe='1,77' VI) In welchem Stock/welchen Stöcken sitzen die größten der Schule? select distinct Stock from Schüler, Ort where Ort.Klasse=Schüler.Klasse and Größe= (select max(Größe) from Schüler) VII) Angenommen, alle Schüler sind verschieden groß. Wie groß ist der Zweitgrößte? select max(Größe) from Schüler where Größe<(select max(Größe) from Schüler) VIII) Name des zweitgrößten Schülers. select Zun from Schüler where Größe=(select max(Größe) from Schüler where Größe<(select max(Größe) from Schüler) ) by K. Zimmermann Seite: 9 1994/95 TDO - Skript SUBSELECTS UND LISTEN SUBSELECT LIEFERT sicher nur 1 Wert select max(Alter) from Schüler vielleicht mehrere select Alter from Schüler NUR 1 WERT WEGEN GRUPPENFUNKTION SELECT HOLT SPALTE AUS TABELLE → MEHRERE WERTE LISTENFUNKTIONEN VERGLEICHEN EINEN WERT MIT LISTE VON WERTEN Bsp: 'MAIER' 'MAIER' 'MAIER' 12 12 12 17 17 17 Bsp: IN IN NOT IN IN > MAX < MAX < MIN < MAX > MIN EXISTS EXISTS ('MÜLLER', 'MAIER', 'BLAU') ('FISCHER', 'BERGER') ('FISCHER', 'BERGER') (8, 12, 13, 20) (8, 12, 13, 20) (8, 12, 13, 20) (9, 15, 100) (9, 30, 32, 80) (9, 13) (9, 13) () Alle Schüler, die so heißen wie jemand aus der 3HBc. select Zun, Klasse from Schüler where Klasse not '3HBc' and Zun in Bsp: true/ false t f t t f t f t t t f (select Zun from Schüler where Klasse='3HBc') Alle Schüler die älter sind als der jüngste der 3HBa. select Zun from Schüler where Alter>min (select Alter from Schüler where Klasse='3HBa') min (select Alter) == select min (Alter) Schüler 1) 2) 3) 4) Name Alter Größe Klasse Maier Müller Gruber Berger 17 17 18 18 1,86 1,82 1,90 1,70 4HBa 3HBa 4HBa 3HBa by K. Zimmermann Seite: 10 1994/95 TDO - Skript GROUP BY GROUP BY KLASSE 1) Maier Gruber 17 18 1,86 1,90 4HBa 2) Müller Berger 17 18 1,82 1,70 3HBa Blaue Kästchen können am Bildschirm nicht ausgegeben werden, sondern nur Gruppenfunktionen davon. min 17 18 count 17 18 avg =17 avg =2 count Maier =2 Gruber =1,88 Maier Gruber Zahlengruppen: Textgruppen: Bsp: 1,86 1,90 alle Funktionen (min, max, count, avg, sum) nur count Älteste, Durchschnittsgröße, Klasse. 18 18 1,88 1,76 4HBa 3HBa select max(Alter), avg(Größe), Klasse from Schüler group by Klasse Bsp: Liste aller Klassen mit Durchschnittsalter und Größe des größten Schülers. select Klasse, avg(Alter), max(Größe) from Schüler group by Klasse Bsp: Liste aller Altersgruppen mit Durchschnittsgröße. select Alter, avg(Größe) from Schüler group by Alter Bsp: Liste aller Klassen mit Zahl der Schüler über 18 Jahre. select Klasse, count(Name) from Schüler where Alter>18 group by Klasse by K. Zimmermann Seite: 11 1994/95 TDO - Skript Bsp: Liste aller Altersgruppen in den fünften Klassen mit Durchschnittsgröße. select Alter, avg(Größe) from Schüler where Klasse like ('5*') group by Alter Bsp: oder Klasse in ('5HBa', '5HBb', '5HBc') Liste aller Stockwerke mit Durchschnittsalter, Schülerzahl und Größe des größten Schülers. select Stock, avg(Alter), count(Name), max(Größe) from Schüler, Ort where Schüler.Klasse=Ort.Klasse group by Stock Bsp: Liste aller Klassen und deren Durchschnittsalter, die über 20 Schüler haben. select Klasse, avg(Alter) from Schüler group by Klasse having count(*)>20 WHERE: HAVING: Bsp: having == where KEINE GRUPPENFUNKTIONEN! SCHON! Altersklassen (nur die, in denen die Schüler im Durchschnitt größer 1,80 sind) mit Schülerzahl. select Alter, count(*) from Schüler group by Alter having avg(Größe)>1,80 Bsp: Alter sortiert ausgeben. select Name from Schüler order by Alter (desc) Alter aufsteigend sortiert Bsp: Pilot PNr I) Name KF CNr Fstd PNr Typ Name aller Piloten, mit maximaler Flugstundenanzahl. select Name from Pilot where Fstd= (select max(Fstd) from Pilot) II) Name des Piloten mit Copilot. select P1.Name, P2.Name from Pilot P1, Pilot P2 where P1.CNr=P2.PNr by K. Zimmermann Seite: 12 1994/95 TDO - Skript III) Alle Flugzeugtypen, dessen Piloten Berger heißen. select Typ from Pilot, KF where Pilot.PNr=KF.PNr and Name='Berger' IV) Namen der Piloten, die eine B747 fliegen können. select Name from Pilot, KF where Pilot.PNr=KF.PNr and Typ='B747' V) Flugzeugtyp mit erfahrensten Pilot. select Typ, Name from Pilot, KF where Pilot.PNr=KF.PNr group by Typ having max(FStd) VI) Zu jedem Flugzeugtyp die maximalste Flugstundenanzahl. select max(Fstd), Typ from Pilot, KF where Pilot.PNr=KF.PNr group by Typ HAVING ist die WHERE-BEDINGUNG für Gruppen. Bsp: Alle Klassen, in denen das Durchschnittsalter>16 Jahre ist. select Klasse from Schüler group by Klasse having avg(Alter)>16 ↑ HAVING kann nur Gruppenfunktionen enthalten, WHERE darf keine enthalten. Bsp: Alle Altersgruppen, in denen es mind. einen über 2 Meter großen Schüler gibt und Größe (des größten) dieses Schülers. select max(Größe), Alter from Schüler group by Alter having max(Größe)>2.00 by K. Zimmermann Seite: 13 1994/95 TDO - Skript ORDER BY Bsp: Gib die Schüler der 3HBc nach dem Alter geordnet aus. select Name from Schüler where Klasse='3HBc' order by Alter Im ORDER-BY Teil können die Attribute oder Gruppenfunktionen von Attributen stehen,die auch im SELECT-Teil stehen oder stehen können. select Name from Schüler order by avg(Alter) Bsp: avg(Alter) könnte auch nicht im SELECT stehen, weil nicht gruppiert wird. FALSCH !! Gib alle Klassen nach dem Durchschnittsalter geordnet aus. select Klasse from Schüler group by Klasse order by avg(Alter) Man kann im ORDER-BY Teil auch mehrere Attribute angeben. select Name from Schüler order by Klasse, Alter → 14 15 14 15 Liste aller Schüler nach Klassen geordnet, innerhalb einer Klasse sind sie nach ihrem Alter geordnet. select Name from Schüler order by Alter, Klasse → 1HBa 1HBa 1HBb 1HBb 1HBa 1HBb 1HBa 1HBb 14 14 15 15 Liste aller Schüler nach dem Alter geordnet. Gleichalte werden nach der Klasse geordnet. by K. Zimmermann Seite: 14 1994/95 TDO - Skript NULL-VALUES NULL bedeutet "GIBT ES NICHT" Mitarb# 3 5 2 0 Name Chef# Maier Müller Huber Berger 5 NULL 0 3 Müller hat keinen Chef. Huber hat einen Chef. Er hat Nummer 0. NULL ist nicht dasselbe wie 0! Bsp: Alle Mitarbeiter ohne Chef. select Name from Mitarbeiter where Chef# is null Bsp: es gibt auch: ... is not null Alle Untergebenen von Berger. select Name from Mitarbeiter where Chef#=0 select count(*) from Mitarbeiter ↓ 4 select count(Chef#) from Mitarbeiter ↓ 3 Datensätze mit NULL gezählt NULL nicht gezählt by K. Zimmermann Seite: 15 1994/95 TDO - Skript SQL-REIHENFOLGE 1.) BILDE KARTESISCHES PRODUKT ALLER TABELLEN AUS DEM FROM. 2.) ENTFERNE ALLE ZEILEN, DIE DAS WHERE NICHT ERFÜLLEN. 3.) FASSE ALLE DATENSÄTZE, FÜR DIE DAS GROUP BY ATTRIBUT DENSELBEN WERT HAT IN JE EINEN ZUSAMMEN. 4.) ENTFERNE ALLE DIESER GRUPPENDATENSÄTZE, DIE DIE HAVING BEDINGUNG NICHT ERFÜLLEN. 5.) SORTIERE DAS ERGEBNIS NACH ORDER BY. 6.) GIB NUR DIE ATTRIBUTE / GRUPPENFUNKTIONEN VON ATTRIBUTEN AUS, DIE IM SELECT VORKOMMEN. by K. Zimmermann Seite: 16 1994/95 TDO - Skript SUBSELECTS, DIE PAARE ERGEBEN Bsp: Größe + Alter aller Schüler der 3HBb. select Größe, Alter from Schüler where Klasse='3HBb' Bsp: 1,87 1,72 1,78 16 16 15 1 Schüler 1 Schüler 1 Schüler Welche Schüler sind genauso groß und alt wie jemand aus der 3HBb? select Name from Schüler where (Größe, Alter) in ( select ... Bsp: IAAF Sportler Name Nr I) Alter Meetings Disziplin Bestleistung Ort Datum 38 W. Teilnehmer Nr Ort Die Namen der Sportler mit der Disziplin Weitsprung sollen geordnet ausgegeben werden. select Name from Sportler where Disziplin='Weitsprung' order by Name II) Namen aller 100m-Läufer mit Bestleistung unter 10 sek. nach Bestleistung geordnet. select Name from Sportler where Disziplin='100m Lauf' and Bestleistung <10 order by Bestleistung III) Nach Disziplin geordnet, die Ausgabe der besten & schlechtesten Leistung der über 40-jährigen. select Disziplin, max(Bestleistung), min(Bestleistung) from Sportler where Alter>40 group by Disziplin IV) Namen aller Sportler die in Oslo dabei waren. select Name from Sportler, Teilnahme where Sportler.Nr=Teilnahme.Nr and Ort='Oslo' by K. Zimmermann Seite: 17 1994/95 TDO - Skript V) Alle Orte gruppiert ausgeben, dessen Teilnehmerdurchschnittsalter größer als 30 ist und dessen Meeting in der 52-sten Woche stattgefunden hat. select Ort from Sportler, Meetings, Teilnahme where Sportler.Nr=Teilnahme.Nr and Teilnahme.Ort=Meetings.Ort and Datum=52 group by Ort having avg(Alter)>30 VI) Namen aller Weitspringer, dessen Leistung von der Bestleistung maximal 1m abweicht. select Name from Sportler where Disziplin='Weitsprung' and Bestleistung+1 >(select from where max(Bestleistung) Sportler Disziplin='Weitsprung') Bsp: nicht Katnr., sondern eindeutig Schüler (S#, Zuname, Vorname, Alter, Geschlecht, Klassencode) M/W Klasse (Klassencode, Stock, Sprecher#) eine S# I) Liste aller Klassensprecher (Namen !) aus dem 2. Stock, geordnet nach dem Alter. select Name from Schüler, Klasse where Schüler.S#=Sprecher.S# and Stock=2 group by Alter -) Im Subselect. select Name from Schüler where Schüler.S# in II) (select Sprecher.S# from Klasse where Stock=2 order by Alter) Wieviele Klassensprecherinnen gibt es? select count(*) from Schüler, Klasse where Geschecht='W' and Schüler.S#=Klasse.Sprecher# III) Wer ist um 1 Jahr älter als der Klassensprecher? select S.Zuname from Schüler S, Schüler Spr, Klasse K where Spr.S#=K.Sprecher# and S.Klassencode=K.Klassencode and S.Alter=Spr.Alter+1 by K. Zimmermann Seite: 18 1994/95 TDO - Skript IV) Klassen mit mehr als 3 Volljährige. select Klassencode from Schüler where Alter>18 group by Klaseencode having count(*)>3 V) Klasse mit 5 gleiche Vornamen. select distinct S1.Klassencode from Schüler S1, Schüler S2, Schüler S3, Schüler S4, Schüler S5 where S1.Vorname=S2.Vorname and S2.Vorname=S3.Vorname and S3.Vorname=S4.Vorname and S4.Vorname=S5.Vorname VI) In welchen Klassen sitzen mehr als 3 Minderjährige? select Klassencode from Schüler where Alter <= 18 group by Klassencode having count (*)>3 VII) Liste aller Klassenschülerzahlen. select count(*) ♣ from Schüler group by Klasse VIII) Welche Klasse ist am größten? select Klassencode from Schüler group by Klassencode having count (*) = max( ♣ ) IX) Welche Nummer hat der Sprecher der größten Klasse? select Sprecher# from Klasse where Klassencode = ( ♥ ) X) ♥ ♠ Wie heißt der Sprecher der größten Klasse? select Zuname, Vorname from Schüler where S# = ( ♠ ) by K. Zimmermann Seite: 19 1994/95 TDO - Skript VERGLEICHE IN SQL = (nicht == wie in C) > < >= <> (nicht != wie in C) AND OR NOT BETWEEN: where Alter between 16 and 17 IN: where Klasse in ('5a', '5b', '5c') LIKE: % _ beliebig viele Zeichen 1 beliebiges Zeichen <= (DOS: *) (DOS: ?) where Name like '%MANN' → BAUMANN, AMANN, MANN where Name like '_MANN' → AMANN FUNKTIONEN IN SQL +, -, /, * || hängt Zeichenfolgen zusammen NVL (a, b) = a, falls a nicht NULL b, sonst ↓ ≠0 !!! LENGTH ('ROSE') = 4 ABS (-7) = 7 SIGN (-7) = -1 SUBSTR ('VOLLMOND', 5, 4) = 'MOND' ↓ 5. by K. Zimmermann 4 Seite: 20 1994/95 TDO - Skript SQL DETAILS - select count(*) from Schüler Anzahl aller Schüler - select count (Religion) from Schüler Anzahl aller religiösen Schüler (NULL-Values werden nicht gezählt) - select count (distinct Religion) from Schüler Anzahl aller Religionen an der Schule (NULL-Values werden nicht, alle anderen nur 1x gezählt) - SName Religion Maier Müller Berger Ranzo kath prot kath NULL select avg (sum (Alter)), sum (avg (Alter)) from Schüler group by Klasse avg (sum (Alter)): 1.) pro Klasse Gesamtalter 2.) davon Durchschnitt über alle Klassen sum (avg (Alter)): 1.) pro Klasse Durchschnittsalter 2.) davon Summe über alle Klassen by K. Zimmermann Seite: 21 1994/95 TDO - Skript OUTER JOIN S V Spieler Verein Verein Präsident Herzog Matthäus Schachner Bremen München NULL Bremen München Lemke Beckenb. select * from S, V where S.Verein=V.Verein S.Spieler S.Verein V.Verein V.Präsident Herzog Matthäus Bremen München Bremen München Lemke Beckenb. 3. Datensatz aus S hat keinen Partner aus V → wird ignoriert select * from S, V where S.Verein=V.Verein (+) Herzog Matthäus Schachner Bremen München NULL Bremen München NULL Lemke Beckenb. NULL (+) auch Datensätze ohne Partner werden ausgegeben by K. Zimmermann Seite: 22 1994/95 TDO - Skript DATENBANKENTWURFSREGEL #1 KEINE VERSTECKTEN JOINS !!! Mitarbeiter Mitarb.# Mitarbname Abt.# 7 12 14 . . . Müller Maier Fischer . . . 3 2 3 . . . Abtname Verkaufsabt. Produktionsabt. Verkaufsabt. . . . statt dieser Tabelle könnte man auch Employee Abteilung Mitarb.# Mitarbname Abt# 7 12 14 . .. Müller Maier Fischer . .. 3 2 3 . .. Abt# Abtname 3 2 . .. Verkaufsabt Produktionsabt . .. entwerfen. SCHLÜSSEL (engl.: KEY) Steht die Postleitzahl fest, so ergibt sich daraus eindeutig der Bezirk Bezirk ist von PLZ funktional abhängig. PLZ → BEZIRK Sozialversicherungs# → Geburtsdatum Katalognr. → Name, aber Schuljahr, Schule, Klasse, Kat# → Name Schuljahr, Schule, Klasse, Woche → Klassenordner Schuljahr, Schule, Klasse, Fach → Lehrer Bestellnr., Produkt → Menge Datum, Ort → Niederschlagsmenge Beistrich bedeutet: UND Ein Attribut oder eine UND-Verknüpfung von Attributen, von dem/der alle anderen Attribute der Tabelle abhängen, heißt: Schlüsselkandidat (candidate key) Mitarb# Name by K. Zimmermann Adresse Abteilung Seite: 23 1994/95 TDO - Skript Der Schlüsselkandidat, der gewählt wird, heißt: Primärschlüssel (primary key) Tabelle "Mitarbeiter" ist Join von "Employee" und "Abteilung" Mitarbeiter = select Mitarb#, Mitarbname, ... from Employee, Abteilung where Employee.Abt# = Abteilung.Abt# Eine informationsverlustfreie Zerlegung (lossless decomposition / nonloss decomposition) von "Mitarbeiter" in "Employee" und "Abteilung" ist daher möglich. → Nachteile von zerlegbaren Tabellen I) Bürohilfe vertippt sich und schreibt bei Fischer "Einkaufsabt" statt "Verkaufsabt" → laut Datenbank ist Abt. 3 mal die Einkaufs-, mal die Verkaufsabt. → Widerspruch (inconsistency). Vertippt sie sich in Tabelle "Abteilung", so ist die Datenbank falsch, aber nicht widersprüchlich II) Zu hoher Speicherverbrauch (redundancy) III) Werden alle Mitarbeiter der Produktion gelöscht, so weiss man nicht mehr, welche Abteilungs# sie hat. (deletion anomaly) → läßt sich Tabelle x verlustfrei in die Tabellen y und z zerlegen, so wirft man x weg und nimmt y und z in die Datenbank auf. Angenommen, es kommt noch Berger - Cessna - Hong Kong zu Flug1 dazu, wie kann Flug1 dann zerlegt werden? GAR NICHT ! Wie sollen wir beim Entwurf entscheiden, ob die Datenbank Flug1 oder die 3 anderen Tabellen enthalten soll? Wir fragen Kunden: wenn und und Pilot x Flugzeug y fliegen darf Pilot x Flughafen z kennt Flugzeug y auf Flughafen z landen darf Darf dann x mit y automatisch auf z landen? JA → 3 Tabellen NEIN → 1 Tabelle Schüler 4 Name Maier Müller Maier Berger Müller Sport Schüler 5 Fremdspr. Fußball Englisch Schach Italienisch Tennis Englisch Golf Spanisch Schach Französisch Name Sport Maier Müller Maier Berger Müller Fußball Schach Tennis Golf Schach Schüler 6 Sport Fremdspr. Fußball Englisch Schach Italienisch Tennis Englisch Golf Spanisch Schach Französisch Sport und Fremdsprachen haben nichts miteinander zu tun → man kann die Tabelle ohne Informationsverlust aufspalten. by K. Zimmermann Seite: 24 1994/95 TDO - Skript DATENBANKENTWURF (engl.: DATA BASE DESIGN) ENTITY: Alle Menschen, Sachen, Orte, ... über die wir Informationen speichern wollen. Bsp: Schüler Maier, 3hbc, TDO, Schüler Müller, 2. Stock, 5hba, 1.Stock, PR ENTITY TYPE: Zusammenfassung gleichartiger Entities Bsp: Schüler, Klasse, Fach, Stock RELATIONSHIP: Beziehung zwischen Entities Bsp: 3hbc hat_Klassenzimmer_in 2. Stock Hasitschka unterrichtet 4hba in TDO 4hba hat_Klassenzimmer_in 2. Stock RELATIONSHIP TYPE: Beziehung zwischen Entitiytypes Bsp: Klasse hat_Klassenzimmer_in Stock Lehrer unterrichtet Klasse in Fach ATTRIBUTE: Eigenschaft einer Entity Bsp: Maier: 17 Jahre, katholisch, Eishockey ATTRIBUTE TYPE: Zusammenfassung der Attributes Bsp: ENTITY TYPE ENTITY ATTRIBUTE TYPE ATTRIBUTE by K. Zimmermann Schüler: Alter, Religion, Sport → → → → TABELLE DATENSATZ = TABELLENZEILE SPALTE TABELLENZELLE Seite: 25 1994/95 TDO - Skript Bsp: Schraubenhersteller I) Suche alle Entity Types, über die Information gespeichert werden soll. Schraubentyp, Mitarbeiter, Kunde, Fabrik II) Suche zu jedem die zu speichernden Attribute. Schraubentyp (Typbezeichnung, Länge, Ganghöhe) Mitarbeiter (Name, Einstellungsdatum) Kunde (Name, Adresse) Fabrik (Adresse, Kapazität) III) Wähle oder erfinde Schlüssel. Schraubentyp (Typbez., Länge, Ganghöhe) Mitarbeiter (M#, Name, Einstellungsdatum) Kunde (K#, Name, Adresse) Fabrik (Adresse, Kapazität) IV) Mache aus jeder Entity Type eine Tabelle. SQL: create table Schraubentyp ... V) Suche alle Relationship Types, über die Information gespeichert werden soll. Mitarbeiter arbeitet_in Fabrik Schraubentyp wird_hergestellt_in Fabrik Kunde bestellt Schraubentyp bei Mitarbeiter VI) Suche speicherungswürdige Attribute der Beziehungen: arbeitet_in: wird_hergestellt_in: bestellt_bei: VII) Dienstbeginn, Funktion max. Tagesproduktion Bestellmenge, Datum Welche der Beziehungen sind 1:n ? Jeder Mitarbeiter arbeitet_in (<=) einer Fabrik In jeder Fabrik arbeiten (<=) mehrere Mitarbeiter Einer : Mehrere = 1 : n Beziehung Welche Beziehungen sind m : n ? Jeder Schraubentyp wird_hergestellt_in (<=) mehreren Fabriken In jeder Fabrik werden_hergestellt (<=) mehrere Schraubentypen Mehrere : Mehrere = m : n by K. Zimmermann Beziehung Seite: 26 1994/95 TDO - Skript Welche sind Mehrfachbeziehungen ? Kunde bestellt Schraubentyp bei Mitarbeiter 3 Entity Types an Beziehung beteiligt 3: TRITÄR VII) 4: QUATERNÄR Trage 1 : n Beziehungen in die Datenbank ein. Wie halte ich in der Datenbank fest, wer in welcher Fabrik arbeitet ? a) Spalte "Mitarbeiter" in Tabelle Fabrik. schlecht: können beliebig viele sein → wieviel Byte sollen für dieses Attribut pro Zeile reserviert werden ? b) Spalte "Fabrik" in Tabelle Mitarbeiter. gut: kann immer nur eine sein Aber was wird dort eingetragen ? Kapazität, Adresse, beides ? Etwas, was eindeutig klarmacht, in welcher Fabrik der Mitarbeiter arbeitet → Mitarbeiter bekommt neue Spalte mit dem Schlüssel von Fabrik. IX) Wie halte ich m : n Beziehungen fest ? (z.B.: welcher Schraubentyp wird in welcher Fabrik gefertigt ?) a) Ich speichere bei Fabrik die Schraubentypen. schlecht: siehe VIII) umgekehrt. → neue Tabelle Fertigung. b) schlecht: siehe VIII) Fertigung STyp Fabrik Schlüssel → H8/1 Wien 23 ← Schlüssel aus aus H8/1 Linz Fabrikstabelle Schr.Typ M15/2.5 Wien 23 by K. Zimmermann Seite: 27 1994/95 TDO - Skript X) Mehrfachbeziehungen → eigene Tabelle Bestellung Kunde Mitarbeiter Produkt 27 15 ↑ 12 10 ↑ H8/1 M15/2.5 ↑ Schlüssel Schlüssel Schlüssel aus aus aus Kunde Mitarbeiter Schraubentyp XI) Füge Beziehungsattribute zur Datenbank. Bestellmenge, Datum neue Spalten der Tabelle "Bestellung" max. Tagesproduktion Spalte von "Fertigung" Dienstbeginn, Funktion neue Spalten unter "Mitarbeiter" XII) Entferne - ableitbare Beziehungen DERIVABLE RELATIONSHIP (Spitalsbeispiel) - ableitbare Attribute DERIVABLE ATTRIBUTE (Geburtsdatum, Alter) → Geburtsdatum - zerlegbare Tabellen XIII) TABELLEN BAUEN: CREATE TABLE KUNDE (KNR NUMBER(4) NOT NULL, NAME CHAR(30)) DATENSÄTZE EINFÜGEN: INSERT INTO KUNDE VALUES (3276, "MAIER") DATENSÄTZE ÄNDERN: UPDATE KUNDE SET KNR = 5000 WHERE NAME = 'BERGER' DATENSÄTZE LÖSCHEN: DELETE FROM KUNDE WHERE NAME = 'MÜLLER' TABELLEN LÖSCHEN: DROP TABLE KUNDE by K. Zimmermann Seite: 28 1994/95 TDO - Skript ENTITY - RELATIONSHIP DIAGRAMME (ERD) Helfen / Stören beim Datenbankdesign. Zeigen keine Entities & Relationships, sondern Entity Types und Relationship Types. KARDINALITÄTEN: 1 : n, m : n Höchstkardinalitäten entscheiden Jeder Lehrer unterrichtet mind. 0, höchstens mehrere Schüler. Jeder Schüler wird von mind. 1, höchstens mehreren Lehrern unterrichtet. ERD - SCHRAUBENHERSTELLER (ohne Attribute) 1 2 3 kann_bedienen steht_in arbeitet_in Wichtigste ERD - Regel: keine ableitbaren Beziehungen ! by K. Zimmermann Seite: 29 1994/95 TDO - Skript 1 2 3 liegt_in steht_in belegt 1 ist überflüssig: 2, 3 rechen, um herauszufinden, in welchem Spital Patient x liegt → 1 könnte gestrichen werden. Könnte man auch 1 lassen und 2 streichen ? 1 3 JA NEIN VORÜBUNGEN DATENBANKENTWURF Man gebe einen Schlüssel an für - eine Tabelle der Schüler der 4 Hbc Kat# - eine Tabelle aller derzeitigen Wiener Schüler Kat#, Schulcode, Klassencode - eine Tabelle aller Schüler, die jemals die Ungargasse besucht haben Eintrittsjahr, Klassencode i. d. 1. Kl., Kat# in der 1. Klasse Man gebe Kardinalitäten, Beziehungstyp an - Mieter bewohnen Haus m : n - Patient bekommt vom Arzt eine Medizin verschieben - Mutter hat Kinder 1 : n - Programmierer schreibt Programm in Sprache Programmierer Programm Sprache Das sind 2 m : n Beziehungen → neue Tabellen - Mensch übt Beruf aus by K. Zimmermann m : n Seite: 30 1994/95 TDO - Skript Bsp: Firma beliefert Baustelle mit Bauteile. Baustelle und Lieferfirma sind in einer bestimmten Stadt. Die Bauteile können auch aus mehrere Bauteiltypen bestehen. Baustelle (Baustellen#, Kbez, Name, Land, Bauteiltyp (Typ#, Stadt (Name, Land) Lieferant (Lieferanten#, Name, Land, LF (Lieferanten#, Typ#, Bedarf (Baustellen#, Typ#, Menge, Teil (Typ#1, Typ#2, Menge, Bsp: Kinokette (siehe Kopie) KINO : SAAL : REIHE : SITZ : FILM : MITWIRK : Kname, Adresse Kname, S#, Größe Kname, S#, R#, Szfußfr Kname, S#, R#, Sz# F#, K#, Titel F#, K# by K. Zimmermann Seite: 31 1994/95 TDO - Skript ZUSAMMENGESETZTER SCHLÜSSEL (engl.: COMPOSITE KEY) 1) Wieviele Pizze 23.2. ausgeliefert? 2) Was ist auf einer Margarita drauf? 3) Wieviele Pizze hat Hr. Pfannh. bestellt? 4) Wieviele kg Paradeiser wurden am 14.5. verbraucht? 5) Wer ist der fleißigste Mitarbeiter? Mitarb. (M#, Mname, Lieferung (L#, . . . Bsp: Bankomat Konto Ko# Inh BKM-KARTE Stand Ka# Code Konto Ko# Inh Stand Karte Ka# K# Inh by K. Zimmermann Code Ko# Stand Code Seite: 32 1994/95 TDO - Skript SCHUL - ERD (XESAS) Um etwas vertrauter mit ERDs zu werden hier noch ein kleines Beispiel der HTL Ungargasse. Folgende Tabellen werden erstellt: Schüler (Name, Vname, Aufnahme#, Gebdatum, Staatsbürgerschaft, Muttersprache, Quartier, Adresse, Plz, Ort, Land, Erziehungsberechtigter, Privatnummer, Firmennummer, Status, Behinderung, Vorschule, KKZ, Abtcode, PKZ) Laufbahn (Name, Vname, Gebdatum, Sjahr, KKZ, Abtcode, PKZ) Klasse (KKZ, Abtcode, PKZ, KV, Raum) Fach (Fbezl, Fbezk, Fbezaltern) Stundentafel (KKZ, Abtcode, Fbezk, Std) Lehrer (Lehrer#, Name, Vname, Akgrad, Staatsbürgerschaft, Muttersprache, Adresse, Plz, Land, Privnummer, Firmennummer) Stundenplan (KKZ, Abtcode, PKZ, Fbezk, Raum, Ausweichraum, Tag, Stunde, L#, Unterrichts#) Zeugnis (Aufnahme#, KV, Snote, Enote) usw. usw. usw. by K. Zimmermann Seite: 33 1994/95 TDO - Skript TRANSAKTIONEN ZENTRALE Filiale 1 B 20/10 L 40/50 read B B = B-10 write B read L L = L+10 write L Filiale 2 B 20/10 L 40/50 10 B read B B = B+5 write B ATOMAR (atomic) Atomizität Die zeitliche Reihenfolge in der die Transaktionen ablaufen, heißt SCHEDULE . SERIELLE SCHEDULE Transaktion 1 Transaktion 2 Transaktion 1 read B . . . write L read B . . . write B read B . . . write B read B . . . write L B → B-5 L → L+10 by K. Zimmermann Transaktion 2 B → B-5 L → L+10 Seite: 34 1994/95 TDO - Skript NICHT SERIELLE SCHEDULE Transaktion 1 Transaktion 2 read B B = B-10 T1: read B T2: T1: write B read L B = B+5 write B B = 20 B = 10 B = 20 B = 10 L = 40 T2: L = L+10 write L T1: B = 25 B = 25 L = 50 L = 50 B → B+5 L → L+10 Eine Schedule ist dann serialisierbar, wenn sie die Wirkung einer seriellen Schedule hat. nicht serielle Schedule → serialisieren Transaktion 1 Transaktion 2 read B B = B-10 write B read L read B B = B+5 write B L = L+10 write L B → B-10+5 L → L+10 serialisierbar nicht seriell seriell by K. Zimmermann Seite: 35 1994/95 TDO - Skript LOCKING (SPERREN) (LOCK = SPERRE) Flug Platz S304 ist schon vergeben, wenn 1 sonst 0 Server S300 S301 S302 S303 S304 S305 Workstation Workstation read S304 if (S304==1) sorry else Buchungsplan Beleg drucken S304=1 while S304 read S304 if (S304==1) sorry else Buchungsplan Beleg drucken S304=1 while S304 Langt Transaktion 1 vor Transaktion 2 ein, bekommt Edlauer das Ticket. Langt Transaktion 2 vor Transaktion 1 ein, bekommt Haselberger das Ticket. Transaktion 1 Transaktion 2 Transaktion 1 read S304 if (S304==1) sorry else { Buchung vornehmen Beleg drucken S304=1 write S304 } read S304 if ( ..... . . . read A A = A+1 write A Transaktion 2 read A A = A*2 write A read A A = A+1 write A A → 2A+3 komplet hintereinander: by K. Zimmermann Seite: 36 T1, T2 A → 2A+4 T2, T1 A → 2A+2 1994/95 TDO - Skript Um zu verhindern, daß zwei Prozesse auf ein und denselben Datensatz zugreifen können, muß man locken. Unter locking versteht man das Sperren der Daten um anderen Transaktionen den Zugriff auf den gesperrten Datensatz zu verwehren. Ein Beispiel wären die 80x86 Prozessoren. Will man verhindern, daß Interrupts während einer bestimmten Transaktion zugelassen werden, so wird das Interrupt enable - Flag gelöscht (cli). Um Interrupts wieder zuzulassen, wird das Kommando (der Befehl) sti benutzt. lock B read B B = B-10 write B unlock B A gelockt Filiale 1 Filiale 2 cli A anschauen A setzen sti lock L read L L = L+10 write L unlock L cli A anschauen A setzen sti Es ist möglich, daß Transaktionen nicht nach Reihenfolge des Eintrettens, sondern nach Prioritäten abgearbeitet werden. Dies ist manchmal erforderlich, wie beispielsweise bei einem Space Shuttle die Sauerstoffversorgung, die die höchste Priorität zugewiesen bekommt, da sie immer aufrecht erhalten werden muß. Bei dieser Lösung besteht jedoch die Gefahr, daß eine Transaktion mit geringer Priorität immer nach hinten gereiht wird, da wichtigere Transaktionen auszuführen sind. Ist dies der Fall, so spricht man von einem LIVELOCK (STARVATION) Wartet eine Transaktion T1 auf den Datensatz B und eine andere Transaktion T2 auf den Datensatz A, wobei die beiden Datensätze von der jeweilig anderen Transaktion gelockt wurden, so nennt man diese Situation einen DEADLOCK lock A lock B lock B lock A Eine andere Möglichkeit um Live/Deadlocks zu verhindern, ist es einen Graphen (Dead Lock Graph) zu zeichnen. Transaktion 1 Transaktion 1 Transaktion 2 Transaktion 2 by K. Zimmermann Seite: 37 Transaktion 3 1994/95 TDO - Skript Ein Deadlock ist dann vorhanden, wenn man einen geschlossenen Kreis zeichnen kann. Ist das der Fall, so muß ein Knoten gelöscht werden, um den Deadlock aufzulösen. Regeln: I) LOCKEN II) REIHENFOLGE BEIM LOCKEN III) 2 - PHASEN LOCKEN !!! 2 - Phasen Locken verhindert keinen Deadlock → Transaktion 1 Transaktion 2 lock A lock B Transaktion 1 lock B Transaktion 2 lock A unlock A unlock B circle unlock A unlock B cycle ROLLBACK Läuft eine Transaktion nicht bis zum Ende, aus welchem Grund auch immer, so sollen die bis dahin eingegebenen Daten nicht geändert bleiben, sondern müssen zurückgesetzt werden. Dieses Zurücksetzen wird im allgemeinen Rollback bezeichnet. Ein Rollback kann aus vielen verschiedenen Gründen notwendig werden. Zum Beispiel wenn der User am Ende der Dateneingabe auf „Cancel“ drückt, so sollen die Änderungen nicht gesichert werden oder wenn das System abstürzt oder andere Komplikationen auftreten. Transaktion 1 lock E lock H read E read H H = H+1Mio. write H unlock H if (E>=1Mio.) E = E-1Mio. else write E unlock E CASCADING ROLLBACK Rollback es entsteht eine Rollback - Lawine COMMIT POINT = an keinem Deadlock beteiligt, wenn die OK - Taste betätigt, keine Division durch 0, keine falschen Berechnungen, ... 2 - Phasen Commit: by K. Zimmermann Seite: 38 1994/95 TDO - Skript I) COMMIT POINT II) WRITES III) UNLOCKS PROTOKOLLE (PROTOCOLS) Unter einem Protokoll versteht man allgemein gültige Regeln an die sich alle zu halten haben. Transaktion 1 lock A, B, C read A, B, C A = A+12 B = B*2 C = C*C write A write B write C unlock A unlock B unlock C Z HD Absturz macht nichts Ich bin T1 ich plane: write A = 19 write B = 30 write C = 4 Ende Commit Point Absturz fatal Absturz macht nichts Ich bin T3 ich plane: write X = 4 LOG ... ... wenn kein Ende, dann ist nichts passiert Um auch das Risiko noch weiter zu verringern werden sogenannte LOGs angelegt. In diesen LOGs steht welche Transaktion, welche Veränderungen plant. Tritt nun eine unvorhergesehene Unterbrechung auf, so kann man anhand des LOGs rekonstruieren was geplant, bzw. mit Vergleich der aktuellen Daten, was verändert wurde. Jedes LOG wird sicherheitshalber 2x auf lokale Speichermedien gesichert, die womöglich noch räumlich getrennt sein sollten. GRANULARITÄT (GRANULARITY) Dieses Kapitel beschäftigt sich damit was gesperrt werden soll (Tabelle, Datensatz, Zelle), d.h. mit der richtigen Größe der zu sperrenden Objekte (= Feinkörnigkeit). Access Optionen zu diesem Thema sind z.B. exlusiv öffnen, Tabelle locken. Access Basic Befehle zu diesem Thema sind z.B. Move First, Move Last (Bewegt Bleistift), Lock Edits, Begin Trans, Commit Trans, Rollback. ... 19 19 by K. Zimmermann Seite: 39 1994/95 TDO - Skript SUCHEN (SEARCHING) SEQUENTIELLE SUCHE BINÄRE SUCHE (SEQUENTIAL SEARCH) (BINARY SEARCH) a[0] a[1] a[2] Zelle für Zelle durchgehen halbieren und Element zuordnen wieder halbieren a[0] a[1] a[2] 7 19 112 a[127] a[127] Elemente 2 4 8 16 32 1Mio. sequentiell 1 3 7 15 31 ca. 1Mio. binär 1 2 3 4 5 20 (220) INDEXDATEI 1: 2: 3: 4: 7 19 244 12 MÜLLER MAIER ABRAHAM BERGER ABRAHAM BERGER MAIER MÜLLER KURZ PREM 3 4 2 1 7000001 7000002 1000 5000 2500 10000 select * from Kunde K, Bestellung B where K.K# = B.K# KUNDE - BESTELLUNG 7 12 8 MAIER MÜLLER ABRAHAM B# 303 528 119 404 7 8 by K. Zimmermann K# 8 7 8 23 SCHRAUBEN MUTTERN SCHEIBEN NÄGEL MAIER ABRAHAM 528 303 Seite: 40 7 8 MUTTERN SCHRAUBEN 5000 1000 INNER 1994/95 TDO - Skript LEFT OUTER JOIN RIGHT - by K. Zimmermann 8 ABRAHAM 119 8 SCHEIBEN 2500 12 MÜLLER NULL NULL NULL NULL NULL NULL 404 23 NÄGEL 10000 JOIN + + Seite: 41 1994/95