Entwurf eines Datenbanksystems für eine Schule Datenbanksysteme Wintersemester 2004/05 Patrice Calvin Taffou Happi ([email protected]) Ruben Rothaupt ([email protected]) Inhalt 1. Einleitung 2. Anwendungsbeschreibung 3. Entity- Relationship- Modell 3.1. Entity- Relationship- Diagramm 3.2. Grundkonzepte des Entity- Relationship- Modells 3.2.1. Entities 3.2.2. Relationships 3.2.3. Attribute 3.3. Weitere Konzepte des Entity- Relationship- Modells 3.3.1. Funktionale Beziehungen 3.3.2. Schlüssel 3.3.3. Ist- Beziehungen 3.3.4. Kardinalitäten 3.4. Textuelle Notation 3.4.1. Entity- Typen 3.4.2. Relationship- Typen 4. Relationenmodell 4.1. Relationenschemata 4.1.1. Repräsentation der Entity- Typen 4.1.2. Repräsentation der Relationship- Typen 4.2. Integritätsbedingungen 5. SQL (Standard Query Language) 5.1. Relationenschemata 5.2. Änderungsoperationen 5.3. Anfragen 6. Literatur 2 1. Einleitung Diese Hausarbeit beschäftigt sich mit dem Entwurf eines Datenbanksystems für eine Schule. Beim Entwurf von Datenbanken kann man drei Abstraktionsebenen unterscheiden. Dies sind die externe, die konzeptuelle und die interne Ebene. Die externe Ebene dient zur Darstellung der Daten aus Sicht einer konkreten Anwendung, wobei es mehrere verschiedene externe Sichten auf eine Datenbank geben kann. Die konzeptuelle Ebene erzeugt nun eine logische und einheitliche Gesamtsicht auf den Datenbestand und definiert, wie die zu speichernden Daten konzeptuell angeordnet werden sollen. Die interne Ebene beschäftigt sich schließlich damit, wie die Speicherung der Daten tatsächlich intern realisiert wird. Auf die interne Ebene wird in dieser Hausarbeit allerdings nicht weiter eingegangen. Im zweiten Abschnitt wird aus Sicht eines Anwenders beschrieben, welche Anforderungen die Datenbank erfüllen soll bzw. welche Informationen in der Datenbank enthalten sein sollen. Anhand der Anwendungsbeschreibung wird im dritten Abschnitt ein EntityRelationship- Modell (ER- Modell) erstellt. Dies ist ein abstraktes Datenbankmodell, welches beim Entwurf von Datenbanken sehr häufig eingesetzt wird. Das ER- Modell wird im vierten Abschnitt ins Relationenmodell übersetzt. Dazu werden Relationenschemata erstellt sowie bestimmte Integritätsbedingungen formuliert, die eingehalten werden müssen. Schließlich folgen im fünften Abschnitt noch die Umsetzung der zuvor erstellten Relationenschemata in der relationalen Datenbanksprache SQL und einige SQL- Anfragen. 3 2. Anwendungsbeschreibung In der zu entwickelnden Datenbank sollen die im Folgenden angegebenen Informationen enthalten sein. Es sollen Stundenplaninformationen gespeichert werden. Dabei wird zwischen dem allgemeinen Stundenplan und dem täglichen Stundenplan, in dem Unterrichtsausfall und Vertretung berücksichtigt werden, unterschieden. Die Stundenplaninformationen umfassen Angaben darüber, an welchem Tag in welcher Stunde welcher Lehrer welche Klasse in welchem Fach in welchem Raum unterrichtet. Für jede Klasse sollen Informationen darüber verfügbar sein, wie die Bezeichnung der Klasse lautet, wer der Klassenlehrer ist, welches der Klassenraum ist und wie viele Schüler der Klasse angehören. Zudem soll enthalten sein, in welchem Fach eine bestimmte Klasse in welchem Halbjahr wie viele Stunden Unterricht bekommt bzw. bekommen hat. Für Räume sollen Raumnummer und Kapazität des Raumes gespeichert werden. Über Personen sollen ebenfalls unterschiedliche Informationen in der Datenbank enthalten sein. Für jede Person werden zunächst allgemeine Informationen wie Name, Anschrift, Geburtsdatum und Telefonnummer gespeichert. Die Personen können entweder Schüler oder Mitarbeiter sein. Dabei können Mitarbeiter wiederum unterschiedliche Funktionen an der Schule haben; sie können z.B. Lehrer, Schulleiter oder anderes Personal (Hausmeister, Sekretärin,...) sein. Für jeden Schüler werden der Name der Mutter, der Name des Vaters und die Anschrift des Erziehungsberechtigten benötigt. Außerdem gehört jeder Schüler zu einer bestimmten Klasse und wird demzufolge in bestimmten Fächern unterrichtet. Für jedes dieser Fächer bekommt der Schüler eine Note für das jeweilige Halbjahr. Schließlich können über Schüler noch zusätzliche Informationen unterschiedlicher Art gespeichert werden, wie beispielsweise Förderungsmaßnahmen oder Fehlzeiten. Über alle Mitarbeiter sollen noch weitere Informationen wie Gehaltsinformationen, Einstellungsdatum oder Stundenanzahl enthalten sein. Zudem können noch Zusatzinformationen gespeichert werden. Dies könnten beispielsweise Informationen über Weiterbildungen, Zusatzqualifikationen oder Fehlzeiten sein. Jeder Lehrer darf außerdem nur für bestimmte Fächer in bestimmten Schulstufen eingesetzt werden. Schließlich werden noch Informationen über getätigte Investitionen gespeichert. Dies beinhaltet, wie viel Geld wofür ausgegeben wurde. 4 3. Entity- Relationship- Modell 3.1. Entity- Relationship- Diagramm 5 3.2. Grundkonzepte des Entity- Relationship- Modells 3.2.1. Entities Entities sind die Informationseinheiten, die in der Datenbank dargestellt werden sollen. Ein Entity ist also ein Objekt, über das bestimmte Informationen gespeichert werden sollen. Entities werden in unterschiedliche Entity- Typen eingeteilt. Für einen Entity- Typen E lässt sich die Semantik folgendermaßen definieren: (1) (E) Menge der möglichen Entities vom Typ E (2) (E) Menge der aktuellen Entities vom Typ E Dabei muss gelten: (E) ⊆ (E). Im ER- Modell werden Entity- Typen graphisch als Rechtecke dargestellt. Ein Beispiel dafür ist der Entity- Typ KLASSE im zuvor angegebenen ER- Diagramm: KLASSE 3.2.2. Relationships Relationships dienen dazu, die Beziehungen zwischen Entities darzustellen. Relationships werden in Relationship- Typen eingeteilt. An einem Relationship- Typ können n 2 Entity- Typen beteiligt sein, die zueinander in Beziehung stehen. Für einen Realtionship- Typen R lassen sich die möglichen bzw. die aktuellen Relationships folgendermaßen definieren: (1) (R) Menge der möglichen Relationships vom Typ R Es gilt: (R) = (2) (E1) x … x (En). (R) Menge der aktuellen Relationships vom Typ R Es gilt: (R) = (E1) x … x (En). Es muss gelten: (R) ⊆ (R). Im ER- Modell werden Relationship- Typen graphisch als Raute dargestellt. Ein RelationshipTyp ist beispielsweise „bekommt_Note“, an dem die Entity- Typen SCHÜLER und FACH beteiligt sind. Dies sieht in der graphischen Notation so aus: 6 3.2.3. Attribute Attribute sind die Eigenschaften von Entities oder von Relationships. Alle Entities desselben Typs bzw. alle Relationships desselben Typs besitzen dieselben Attribute. Die Deklaration von Attributen erfolgt also für Entity- Typen bzw. für Relationship- Typen. Die Semantik einer Attributdeklaration sieht nun folgendermaßen aus: Im Zustand wird jedem aktuellen Entity bzw. Relationship für ein Attribut A ein Wert eines Datentyps D zugeordnet (A): (E) (D) bzw. (A): (R) (D) Die graphische Darstellung sieht z.B. für den Entity- Typ PERSON mit den Attributen Name, Geburtsdatum, Anschrift und Telefon folgendermaßen aus: 7 3.3. Weitere Konzepte des Entity- Relationship- Modells 3.3.1. Funktionale Beziehungen Funktionale Beziehungen sind spezielle Relationship- Typen, die eine eindeutige Zuordnung eines Entity- Typs zu einem anderen Entity- Typ darstellen. Jeder Instanz eines Entity- Typen E1 ist maximal eine Instanz eines Entity- Typen E2 zugeordnet Man unterscheidet partiell funktionale und total funktionale Beziehungen. Bei partiell funktionalen Beziehungen ist jeder Instanz eines Entity- Typen E1 eine oder keine Instanz eines Entity- Typen E2 zugeordnet ist. Bei einer total funktionalen Beziehung ist jeder Instanz eines Entity- Typen E1 genau eine Instanz eines Entity- Typen E2 zugeordnet. In der graphischen Darstellung werden funktionale Beziehungen durch einen Pfeil dargestellt. Für den Entity- Typ SCHÜLER, der zu dem Entity- Typ KLASSE durch den RelationshipTyp „gehört_zu“ in einer funktionalen Beziehung steht, sieht dies nun so aus: 3.3.2. Schlüssel Als Schlüssel bezeichnet man eine Attributmenge, die eine eindeutige Identifizierung eines Entities eines bestimmten Entity- Typs darstellt. Es dürfen also keine zwei Entities existieren, die sich in allen Werten ihrer Schlüsselattribute gleichen. Für einen Entity- Typ gibt es teilweise mehrere Schlüssel. In diesem Fall kann einer der Schlüssel ausgewählt werden, der als Primärschlüssel bezeichnet wird. Schlüsselattribute werden dadurch gekennzeichnet, dass sie unterstrichen werden. Der EntityTyp PERSON soll z.B. als Primärschlüssel die Attribute Name und Anschrift haben: 8 3.3.3. IST- Beziehungen Die IST- Beziehung ist eine spezielle funktionale Beziehung. Von IST- Beziehung spricht man, wenn ein Entity- Typ Teilmenge eines anderen Entity- Typs ist. Beispielsweise ist in dem zuvor angegebenen ER- Diagramm jeder Mitarbeiter eine Person. Jeder MITARBEITER- Instanz ist genau eine PERSON- Instanz zugeordnet. Allerdings ist nicht jede Person ein Mitarbeiter. Wenn ein Entity- Typ A zu einem anderen Entity- Typ B in einer IST- Beziehung steht, erbt A zudem alle Attribute von B. In diesem Fall bezeichnet man A als Spezialisierung von B, während B eine Generalisierung von A ist. Deshalb spricht man auch von Spezialisierungs-/ Generalisierungsbeziehung. In der graphischen Notation werden IST- Beziehungen durch einen Pfeil dargestellt: PERSON ist MITARBEITER 3.3.4. Kardinalitäten Kardinalitäten geben an, wie oft eine Instanz eines Entity- Typen an einer Relationship teilnehmen kann. Dazu werden ein minimaler sowie ein maximaler Wert angegeben. Ein Lehrer soll z.B. minimal ein Fach und maximal beliebig viele Fächer unterrichten dürfen und ein Fach soll von null (wenn keine Lehrer für dieses Fach verfügbar ist) bis beliebig vielen Lehrern unterrichtet werden dürfen. Dies sieht in der textuellen Notation dann folgendermaßen aus: darf_unterrichten (LEHRER[1, *], FACH[0, *]) 9 3.4. Textuelle Notation 3.4.1. Entity- Typen 3.4.1.1. PERSON (Name, Anschrift, Geburtsdatum, Telefonnummer) Für jede Person werden der Name, die Anschrift, das Geburtsdatum und die Telefonnummer gespeichert. Dabei sind Name und Anschrift die Schlüsselattribute, durch die sich ein Entity vom Entity- Typ PERSON eindeutig identifizieren lassen muss. 3.4.1.2. SCHÜLER (Name, Anschrift, Geburtsdatum, Telefonnummer, Schülernummer, Name_Mutter, Name_Vater, Anschrift_Sorgeberechtigter) Der Entity- Typ SCHÜLER erbt die Attribute Name, Anschrift, Geburtsdatum und Telefonnummer von PERSON, da jeder Schüler auch eine Person ist. Zudem werden für jeden Schüler noch eine Schülernummer, der Name der Mutter, der Name des Vaters und die Anschrift des Sorgeberechtigten gespeichert. SCHÜLER erbt den durch die Schlüsselattribute Name und Anschrift definierten Primarschlüssel von PERSON. 3.4.1.3. MITARBEITER (Name, Anschrift, Geburtsdatum, Telefonnummer, Personalnummer, Funktion, Einstellungsdatum, Gehaltsinformation, Stundenanzahl) Der Entity- Typ MITARBEITER erbt ebenfalls die Attribute Name, Anschrift, Geburtsdatum und Telefonnummer von PERSON, da auch jeder Mitarbeiter eine Person ist. Zudem werden für jeden Mitarbeiter eine Personalnummer, seine Funktion an der Schule (z.B. Lehrer, Hausmeister, Sekretärin,…), das Datum der Einstellung, Informationen über das Gehalt und die Anzahl der Arbeitsstunden gespeichert. MITARBEITER erbt analog zu SCHÜLER den Primärschlüssel in Form der Schlüsselattribute Name und Anschrift von PERSON. 3.4.1.4. LEHRER (Name, Anschrift, Geburtsdatum, Telefonnummer, Personalnummer, Funktion, Einstellungsdatum, Gehaltsinformation, Stundenanzahl) Der Entity- Typ LEHRER erbt alle seine Attribute von MITARBEITER, da jeder Lehrer gleichzeitig ein Mitarbeiter ist. Zusätzliche Attribute gibt es für LEHRER nicht. 3.4.1.5. FACH (Fachname) Für jedes Fach, das an der Schüle unterrichtet wird, soll der Fachname gespeichert werden. Dies ist gleichzeitig das Schlüsselattribut. 10 3.4.1.6. RAUM (Raumnummer, Kapazität) Für jeden Raum sollen die Raumnummer und die mögliche Kapazität des Raumes gespeichert werden. Das Schlüsselattribut soll dabei die Raumnummer sein. 3.4.1.7. KLASSE (Klassenbezeichnung, Schüleranzahl) Für jede Klasse sollen eine Bezeichnung und die Anzahl der Schüler der Klasse gespeichert werden. Das Schlüsselattribut soll die Klassenbezeichnung sein. 3.4.1.8. INVESTITION (Eintragsnummer, Betrag, Zweck, Bereich) Für an der Schule getätigte Investitionen sollen eine Eintragsnummer, der Betrag, der Zweck der Investition und der Bereich, unter den die Investition fällt, gespeichert werden. Als Schlüsselattribut soll die Eintragsnummer ausgewählt werden. 3.4.1.9. INFORMATIONEN (Eintrag) Einträge können beispielsweise Fehleinträge, Weiterbildungen oder zusätzliche Qualifikationen für Lehrer oder Förderungsmaßnahmen für Schüler sein. 3.4.1.10. HALBJAHR (Halbjahrname) Alle Halbjahre, für die z.B. Unterrichts- oder Noteninformationen gespeichert werden, werden durch einen Namen identifiziert. 3.4.1.11. SCHULSTUFE (Schulstufenname) Alle benötigten Schulstufen werden durch einen Namen identifiziert. 3.4.1.12. ZEIT (Zeitangabe) Die betrachteten Zeiten werden durch eine Zeitangabe identifiziert. 3.4.2. Relationship- Typen 3.4.2.1. bekommt_Note (SCHÜLER[0, *], FACH[0,*], HALBJAHR[0,*], Note) Schüler bekommen in einem jeweiligen Fach für ein bestimmtes Halbjahr eine Note. 11 3.4.2.2. gehört_zu (SCHÜLER[1,1], KLASSE[0,*]) Jeder Schüler gehört zu genau einer bestimmten Klasse; „gehört_zu“ ist also eine total funktionale Beziehung. 3.4.2.3. darf_unterrichten (LEHRER[1,*], FACH[0,*], SCHULSTUFE[0,*]) Ein Lehrer darf bestimmte Fächer in bestimmten Schulstufen unterrichten. Jeder Lehrer soll dabei allerdings mindestens ein Fach unterrichten dürfen. 3.4.2.4. unterrichtet (LEHRER[0,*], KLASSE[0,*], FACH[0,*], RAUM[0,*], ZEIT[0,*]) Lehrer unterrichten Klassen in Fächern in Räumen zu bestimmten Zeiten. Bei diesem Relationship- Typ werden Unterrichtsausfall und Vertretung berücksichtigt. Es werden also für jeden Tag die Informationen über den erteilten Unterricht gespeichert. 3.4.2.5. unterrichtet_planmäßig (LEHRER[0,*], KLASSE[0,*], FACH[0,*], RAUM[0,*], ZEIT[0,*]) Lehrer unterrichten Klassen in Fächern in Räumen zu bestimmten Zeiten. Dieser Relationship- Typ dient zur Darstellung des offiziellen Stundenplans. Es muss also bei der Zeitangabe statt Datum und Stunde nur Wochentag und Stunde gespeichert werden. 3.4.2.6. hat_Unterricht (KLASSE[0,*], FACH[0,*], HALBJAHR[0,*], Stundenanzahl) Eine bestimmte Klasse hat in einem bestimmten Fach in einem bestimmten Halbjahr eine bestimmte Anzahl an Stunden. 3.4.2.7. hat_Klassenlehrer (KLASSE[1,1], LEHRER[0,1]) Eine Klasse hat genau einen Klassenlehrer und jeder Lehrer ist entweder in einer oder in keiner Klasse als Klassenlehrer eingesetzt. 3.4.2.8. hat_Klassenraum (KLASSE[1,1], RAUM[0,1]) Eine Klasse hat genau einen Klassenraum und jeder Raum ist entweder Klassenraum einer einzigen Klasse oder kein Klassenraum. 3.4.2.9. wird_autorisiert (INVESTITION[1,1], MITARBEITER[0,*]) Eine Investition wird von einem Mitarbeiter (z.B. dem Schulleiter) autorisiert. 12 3.4.2.10. info (PERSON[0,*], INFORMATIONEN[0,*]) Über Personen werden bestimmte Informationen gespeichert. 3.4.2.11. ist (MITARBEITER[1,1], PERSON[0,1]) Jeder Mitarbeiter ist gleichzeitig eine Person. MITARBEITER ist also eine Spezialisierung von PERSON. 3.4.2.12. ist (SCHÜLER[1,1], PERSON[0,1]) Jeder Schüler ist gleichzeitig eine Person. SCHÜLER ist also auch eine Spezialisierung von PERSON. 3.4.2.13. ist (LEHRER[1,1], MITARBEITER[0,1]) Jeder Lehrer ist gleichzeitig ein Mitarbeiter. LEHRER ist also eine Spezialisierung von MITARBEITER. 13 4. Relationenmodell Im Relationenmodell werden die Daten als Tabellen dargestellt. Dazu werden verschiedene Relationenschemata erstellt. Jedes Relationenschema besteht aus einer Menge von Attributen. Diese Attribute sind die Spaltenüberschriften der jeweiligen Tabelle und jedem Attribut wird ein Wertebereich zugeordnet. Die Menge der Zeilen der Tabelle bezeichnet man als Relation und eine Tabellenzeile als Tupel. Für ein Tupel wird jedem Attribut ein Attributwert zugeordnet. Das Datenbankschema besteht nun aus einer Menge von Relationenschemata und die Datenbank aus einer Menge von Relationen. Im Folgenden werden nun die Relationenschemata mit den dazugehörigen Attributen erstellt. 4.1. Relationenschemata 4.1.1. Repräsentation der Entity-Typen 4.1.1.1. SCHÜLER (Name, Anschrift, Geburtsdatum, Telefonnummer, Schülernummer, Name_Mutter, Name_Vater, Anschrift_Sorgeberechtigter, Klassenbezeichnung) Die Attribute des Entity- Typs SCHÜLER werden für dieses Relationenschema übernommen. Da jedem Schüler durch die total funktionale Beziehung „gehört_zu“ genau eine Klasse zugeordnet ist, wird zudem das Attribut Klassenbezeichnung hinzugefügt. Als Primärschlüssel für SCHÜLER soll das Attribut Schülernummer ausgewählt werden, da die Attributmenge für diesen Schlüssel nur ein Attribut enthält und somit kleiner ist als die Attributmenge des durch die Attribute Name und Anschrift definierten Schlüssels. 4.1.1.2. MITARBEITER (Name, Anschrift, Geburtsdatum, Telefonnummer, Personalnummer, Funktion, Einstellungsdatum, Gehaltsinformation, Stundenanzahl) Für dieses Relationenschema werden alle Attribute des Entity- Typs MITARBEITER übernommen. Analog zu SCHÜLER wird als Primärschlüssel die Personalnummer anstelle von Name und Anschrift ausgewählt. 14 4.1.1.3. KLASSE (Klassenbezeichnung, Klassenraum, Personalnummer, Schüleranzahl) Die Attribute Klassenbezeichnung und Schüleranzahl werden vom Entity- Typ KLASSE übernommen. Zudem werden die Attribute Klassenraum und Personalnummer eingeführt. Personalnummer identifiziert einen Entity vom Typ LEHRER, der mit dem Entity- Typ KLASSE durch den Relationship- Typ „hat_Klassenlehrer“ in Beziehung steht. Klassenraum repräsentiert das Schlüsselattribut Raumnummer des Entity- Typs RAUM, der mit dem Entity- Typ KLASSE durch den Relationship- Typ „hat_Klassenraum“ in Beziehung steht. Dadurch, dass diese beiden Attribute in dem Relationenschema auftauchen, werden für „hat_Klassenlehrer“ sowie „hat_Klassenraum“ keine eigenen Relationenschemata mehr benötigt. 4.1.1.4. RAUM (Raumnummer, Kapazität) Die Attribute Raumnummer und Kapazität werden vom Entity- Typ RAUM übernommen. 4.1.1.5. INVESTITION (Eintragsnummer, Betrag, Zweck, Bereich, Personalnummer) Die Attribute Eintragsnummer, Betrag, Zweck und Bereich werden vom Entity- Typ INVESTITION übernommen. Jeder Investition wird durch den Relationship- Typ „wird_autorisiert“ genau ein Mitarbeiter zugeordnet. Dieser Mitarbeiter wird durch das Attribut Personalnummer identifiziert. 4.1.1.6. Folgende Entity- Typen wurden nicht ins Relationenmodell übernommen: - PERSON wird nicht aufgenommen, da alle Personen, über die Informationen gespeichert werden, entweder Schüler oder Mitarbeiter sind. - LEHRER wird dadurch repräsentiert, dass ein Entity vom Typ MITARBEITER für das Attribut Funktion den Wert Lehrer hat. - FACH - INFORMATIONEN - HALBJAHR - SCHULSTUFE - ZEIT Diese Entity- Typen werden nur zur Darstellung von Relationships benötigt. Sie besitzen jeweils nur ein Attribut. Dieses Attribut taucht in Relationenschemata auf, welche Relationship- Typen repräsentieren. 15 4.1.2. Repräsentation der Relationships 4.1.2.1. BEKOMMT_NOTE (Schülernummer, Fachname, Halbjahrname, Note) BEKOMMT_NOTE enthält zum einen das Attribut Note und zum anderen die Attribute Schülernummer, Fachname und Halbjahrname, die Entities der drei am Relationship- Typ „bekommt_Note“ beteiligten Entity- Typen SCHÜLER, FACH und HALBJAHR jeweils eindeutig identifizieren. Ein Tupel von BEKOMMT_NOTE lässt sich durch die Schülernummer, den Fachnamen und den Halbjahrnamen eindeutig bestimmen. 4.1.2.2. DARF_UNTERRICHTEN (Personalnummer, Fachname, Schulstufenname) DARF_UNTERRICHTEN enthält die Attribute Personalnummer, Fachname und Schulstufenname, durch die Entities der am Relationship- Typ „darf_unterrichten“ beteiligten Entity- Typen LEHRER, FACH und SCHULSTUFE jeweils eindeutig identifiziert werden können. Ein Tupel der Relation lässt sich durch die Personalnummer, den Fachnamen und den Schulstufennamen eindeutig bestimmen. 4.1.2.3. UNTERRICHTET (Personalnummer, Klassenbezeichnung, Fachname, Raumnummer, Zeitangabe) UNTERRICHTET enthält die Schlüsselattribute der am Relationship- Typ „unterrichtet“ beteiligten Entity- Typen KLASSE (Klassenbezeichnung), FACH (Fachname), RAUM (Raumnummer) und ZEIT (Zeitangabe) sowie das Attribut Personalnummer, durch das sich ein Lehrer eindeutig bestimmen lässt. Ein Tupel der Relation wird durch die Raumnummer und die Zeitangabe eindeutig identifiziert. 4.1.2.4. UNTERRICHTET_PLANMÄSSIG (Personalnummer, Klassenbezeichnung, Fachname, Raumnummer, Zeitangabe) UNTERRICHTET_PLANMÄSSIG enthält die Schlüsselattribute der am Relationship- Typ „unterrichtet_planmäßig“ beteiligten Entity- Typen KLASSE (Klassenbezeichnung), FACH (Fachname), RAUM (Raumnummer) und ZEIT (Zeitangabe) sowie das Attribut Personalnummer, durch das sich ein Lehrer eindeutig bestimmen lässt. Ein Tupel der Relation wird durch die Raumnummer und die Zeitangabe eindeutig identifiziert. 16 4.1.2.5. HAT_UNTERRICHT(Klassenbezeichnung, Fachname, Halbjahrname, Stundenanzahl) HAT_UNTERRICHT enthält die Schlüsselattribute der am Relationship- Typ „hat_Unterricht“ beteiligten Entity- Typen KLASSE, FACH und HALBJAHR sowie das Attribut Stundenanzahl. Ein Tupel der Relation wird durch die Klassenbezeichnung, den Fachnamen und den Halbjahrnamen eindeutig identifiziert. 4.1.2.6. SCHÜLERINFO (Schülernummer, Eintrag) Schülerinfo enthält die Attribute Schülernummer und Eintrag. Schülernummer repräsentiert den betreffenden Schüler, während Eintrag die Information repräsentiert. 4.1.2.7. MITARBEITERINFO (Personalnummer, Eintrag) Mitarbeiterinfo enthält die Attribute Mitarbeiternummer und Eintrag. Mitarbeiternummer repräsentiert den betreffenden Mitarbeiter, während Eintrag die Information repräsentiert. 4.1.2.8. Folgende Relationship- Typen wurden nicht ins Relationenmodell übernommen: - gehört_zu (SCHÜLER, KLASSE) wird dadurch repräsentiert, dass in SCHÜLER das Attribut Klassenbezeichnung enthalten ist. - hat_Klassenlehrer (KLASSE, LEHRER) wird dadurch repräsentiert, dass in KLASSE das Attribut Personalnummer enthalten ist, durch welches der Klassenlehrer identifiziert wird. - hat_Klassenraum (KLASSE, RAUM) wird dadurch repräsentiert, dass in KLASSE das Attribut Klassenraum enthalten ist. - wird_autorisiert (INVESTITION, MITARBEITER) wird dadurch repräsentiert, dass in INVESTITION das Attribut Personalnummer enthalten ist, durch welches der Mitarbeiter identifiziert wird, der die Investition autorisiert hat. Ebenfalls nicht zu übernehmen braucht man die drei IST- Beziehungen: - ist (MITARBEITER, PERSON) - ist (SCHÜLER, PERSON) und - ist (LEHRER, MITARBEITER) 17 4.2. Integritätsbedingungen Es existieren bestimmte zusätzliche Anforderungen an Datenbanken, die gewährleistet werden müssen. Diese bezeichnet man als Integritätsbedingungen. Folgende Integrationsbedingungen sollen in dem erstellten Relationenmodell gelten: 4.2.1. SCHÜLER a) Keine zwei Schüler dürfen dieselbe Schülernummer haben. ∀ S1, S2 ∈ SCHÜLER (S1.Schülernummer = S2.Schülernummer S1 = S2) b) Keine zwei Schüler dürfen denselben Namen und dieselbe Anschrift haben. ∀ S1, S2 ∈ SCHÜLER (S1.Name = S2.Name ∧ S1.Anschrift = S2.Anschrift S1 = S2) c) Jede Klassenbezeichnung, die in SCHÜLER vorkommt, muss auch in KLASSE vorkommen. ∀ S ∈ SCHÜLER ∃ K ∈ KLASSE (S.Klassenbezeichnung = K.Klassenbezeichnung) 4.2.2. MITARBEITER a) Keine zwei Mitarbeiter dürfen dieselbe Personalnummer haben. ∀ M1, M2 ∈ MITARBEITER (M1.Personalnummer = M2.Personalnummer M1 = M2) b) Keine zwei Mitarbeiter dürfen denselben Namen und dieselbe Anschrift haben. ∀ M1, M2 ∈ MITARBEITER (M1.Name = M2.Name ∧ M1.Anschrift = M2.Anschrift M1 = M2) c) Jeder Lehrer ist maximal Klassenlehrer einer Klasse. ∀ M ∈ MITARBEITER ∀ K1, K2 ∈ KLASSE (M.Personalnummer = K1.Personalnummer ∧ M.Personalnummer = K2.Personalnummer K1 = K2) d) Jeder Lehrer darf mindestens ein Fach unterrichten. ∀ M ∈ MITARBEITER mit M.Funktion = Lehrer ∃ DU ∈ DARF_UNTERRICHTEN (M.Personalnummer = DU.Personalnummer) e) Die Stundenanzahl eines Mitarbeiters muss größer als 0 sein. ∀ M ∈ MITARBEITER (M.Stundenanzahl > 0) 4.2.3. KLASSE a) Keine zwei Klassen dürfen dieselbe Klassenbezeichnung haben. ∀ K1, K2 ∈ KLASSE (K1.Klassenbezeichnung = K2.Klassenbezeichnung K1 = K2) b) Es dürfen nur Mitarbeiter Klassenlehrer sein, deren Funktion die eines Lehrers ist. ∀ K ∈ KLASSE ∀ M ∈ MITARBEITER (K.Personalnummer = M.Personalnummer M.Funktion = Lehrer) c) Jede Personalnummer, die in KLASSE vorkommt, muss auch in MITARBEITER vorkommen. ∀ K ∈ KLASSE ∃ M ∈ MITARBEITER (K.Personalnnummer = M.Personalnummer) d) Jeder Klassenraum, der in KLASSE vorkommt, muss auch in RAUM als Raumnummer existieren. ∀ K ∈ KLASSE ∃ R ∈ RAUM (K.Klassenraum = R.Raumnummer) e) Die Kapazität des Klassenraums muss mindestens so groß wie die Schüleranzahl der Klasse sein. ∀ K ∈ KLASSE ∀ R ∈ RAUM (K.Klassenraum = R.Raumnummer R.Kapazität K.Schüleranzahl) 18 f) Die Schüleranzahl einer Klasse muss größer als 0 sein. ∀ K ∈ KLASSE (K.Schüleranzahl > 0) 4.2.4. RAUM a) Keine zwei Räume dürfen dieselbe Raumnummer haben. ∀ R1, R2 ∈ RAUM (R1.Raumnummer = R2.Raumnummer R1 = R2) b) Jeder Raum ist maximal Klassenraum einer Klasse. ∀ R ∈ RAUM ∀ K1, K2 ∈ KLASSE (R.Raumnummer = K1.Klassenraum ∧ R.Raumnummer = K2.Klassenraum K1 = K2) c) Die Raumkapazität muss größer als 0 sein. ∀ R ∈ RAUM (R.Kapazität > 0) 4.2.5. INVESTITIONEN a) Keine zwei Investitionen dürfen dieselbe Eintragsnummer haben. ∀ I1, I2 ∈ INVESTITION (I1.Eintragsnummer = I2.Eintragsnummer I1 = I2) b) Jede Personalnummer, die in INVESTITION vorkommt, muss auch in MITARBEITER als Personalnummer vorkommen. ∀ I ∈ INVESTITION ∃ M ∈ MITARBEITER (I.Personalnnummer = M.Personalnummer) 4.2.6. BEKOMMT_NOTE a) Keine zwei Einträge in BEKOMMT_NOTE dürfen sich in Schülernummer, Fachname und Halbjahr gleichen. ∀ BN1, BN2 ∈ BEKOMMT_NOTE (BN1.Schülernummer = BN2.Schülernummer ∧ BN1.Fachname = BN2.Fachname ∧ BN1.Halbjahr = BN2.Halbjahr BN1 = BN2) b) Jede Schülernummer, die in BEKOMMT_NOTE vorkommt, muss auch in SCHÜLER vorkommen. ∀ BN ∈ BEKOMMT_NOTE ∃ S ∈ SCHÜLER (BN.Schülernummer = S.Schülernummer) c) Jeder Schüler, der in einem Fach eine Note bekommt, muss in dem Fach auch unterrichtet werden. ∀ BN ∈ BEKOMMT_NOTE ∃ S ∈ SCHÜLER ∃ HU ∈ HAT_UNTERRICHT (BN.Schülernummer = S.Schülernummer ∧ S.Klassenbezeichnung = HU.Klassenbezeichnung ∧ BN.Fachname = HU.Fachname) d) Die Note muss zwischen 1 und 6 liegen. ∀ BN ∈ BEKOMMT_NOTE (1 BN.Note 6) 4.2.7. DARF_UNTERRICHTEN a) Keine zwei Einträge in DARF_UNTERRICHTEN dürfen sich in Personalnummer, Fachname und Schulstufe gleichen. ∀ DU1, DU2 ∈ DARF_UNTERRICHTEN (DU1.Personalnummer = DU2.Personalnummer ∧ DU1.Fachname = DU2.Fachname ∧ DU1.Halbjahr = DU2.Halbjahr DU1 = DU2) b) Es dürfen nur Mitarbeiter unterrichten, deren Funktion die eines Lehrers ist. ∀ DU ∈ DARF_UNTERRICHTEN ∀ M ∈ MITARBEITER (DU.Personalnummer = M.Personalnummer M.Funktion = Lehrer) c) Jede Personalnummer in DARF_UNTERRICHTEN muss auch in MITARBEITER vorkommen. 19 ∀ DU ∈ DARF_UNTERRICHTEN ∃ M ∈ MITARBEITER (DU.Personalnummer = M.Personalnummer) 4.2.8. UNTERRICHTET a) Keine zwei Einträge in UNTERRICHTET dürfen sich in Raumnummer und Zeitangabe gleichen. ∀ U1, U2 ∈ UNTERRICHTET (U1.Raumnummer = U2.Raumnummer ∧ U1.Zeitangabe = U2.Zeitangabe U1 = U2) b) Keine zwei Einträge in UNTERRICHTET dürfen sich in Personalnummer und Zeitangabe gleichen. ∀ U1, U2 ∈ UNTERRICHTET (U1.Personalnummer = U2.Personalnummer ∧ U1.Zeitangabe = U2.Zeitangabe U1 = U2) c) Jede Personalnummer, die in UNTERRICHTET vorkommt, muss auch in MITARBEITER vorkommen. ∀ U ∈ UNTERRICHTET ∃ M ∈ MITARBEITER (U.Personalnummer = M.Personalnummer) d) Es dürfen nur Mitarbeiter unterrichten, deren Funktion die eines Lehrers ist. ∀ U ∈ UNTERRICHTET ∀ M ∈ MITARBEITER (U.Personalnummer = M.Personalnummer M.Funktion = Lehrer) e) Jede Klassenbezeichnung, die in UNTERRICHTET vorkommt, muss auch in KLASSE vorkommen. ∀ U ∈ UNTERRICHTET ∃ K ∈ KLASSE (U.Klassenbezeichnung = K.Klassenbezeichnung) f) Jede Raumnummer, die in UNTERRICHTET vorkommt, muss auch in RAUM existieren. ∀ U ∈ UNTERRICHTET ∃ R ∈ RAUM (U.Raumnummer = R.Raumnummer) g) Jeder Raum muss eine jeweils ausreichende Kapazität haben. ∀ U ∈ UNTERRICHTET ∀ R ∈ RAUM ∀ K ∈ KLASSE (U.Raumnummer = R.Raumnummer ∧ U.Klassenbezeichnung = K.Klassenbezeichnung R.Kapazität > K.Schüleranzahl) 4.2.9. UNTERRICHTET_PLANMMÄSSIG Die Bedingungen für UNTERRICHTET_PLANMÄSSIG gleichen denen für UNTERRICHTET. Zusätzlich gilt noch folgende Bedingung: h) Ein Lehrer, der ein Fach nach Plan unterrichtet, soll das Fach auch unterrichten dürfen. ∀ UP ∈ UNTERRICHTET_PLANMÄSSIG ∃ DU ∈ DARF_UNTERRICHTEN (UP.Personalnummer = DU.Personalnummer ∧ UP.Fachname = DU.Fachname) 4.2.10. HAT_UNTERRICHT a) Keine zwei Einträge in HAT_UNTERRICHT dürfen sich in Klassenbezeichnung, Fachname und Halbjahr gleichen. ∀ HU1, HU2 ∈ HAT_UNTERRICHT (HU1.Klassenbezeichnung = HU2.Klassenbezeichnung ∧ HU1.Fachname = HU2.Fachname ∧ HU1.Halbjahr = HU2.Halbjahr HU1 = HU2) b) Jede Klassenbezeichnung, die in HAT_UNTERRICHT vorkommt, muss auch in KLASSE vorkommen. ∀ HU ∈ HAT_UNTERRICHT ∃ K ∈ KLASSE (HU.Klassenbezeichnung = K.Klassenbezeichnung) 4.2.11. SCHÜLERINFO a) Keine zwei Schülerinformationen dürfen dieselbe Schülernummer und denselben Eintrag haben. ∀ SI1, SI2 ∈ SCHÜLERINFO (SI1.Schülernummer=SI2.Schülernummer ∧ SI1.Eintrag=SI2.Eintrag SI1=SI2) 20 b) Jede Schülernummer, die in SCHÜLERINFO vorkommt, muss auch in SCHÜLER vorkommen. ∀ SI ∈ SCHÜLERINFO ∃ M ∈ SCHÜLER (SI.Schülernnummer = M.Schülernummer) 4.2.12. MITARBEITERINFO a) Keine zwei Mitarbeiterinformationen dürfen dieselbe Personalnummer und denselben Eintrag haben. ∀ MI1, MI2 ∈ MITARBEITERINFO (M1.Personalnummer = MI2.Personalnummer ∧ MI1.Eintrag = MI2.Eintrag MI1 = MI2) b) Jede Personalnummer, die in MITARBEITERINFO vorkommt, muss auch in MITARBEITER vorkommen. ∀ MI ∈ MITARBEITERINFO ∃ M ∈ MITARBEITER (MI.Personalnummer = M.Personalnummer) 21 5. SQL (Standard Query Language) 5.1. Relationenschemata Auf der konzeptionellen Ebene lassen sich mit SQL Relationenschemata für Basisrelationen definieren. Hier sollen nun die zuvor entworfenen Relationenschemata in SQL erstellt werden. Das create table- Kommando erzeugt ein Relationenschema mit einem bestimmten Namen sowie die zu diesem Schema gehörigen Attribute, denen jeweils ein bestimmter Wertebereich zugeordnet wird. a) SCHÜLER create table Schüler ( Schülernummer char(6) , Name varchar(50) , Anschrift varchar(50) , Geburtsdatum date , Telefonnummer varchar(10) , Name_Mutter varchar(50) , Name_Vater varchar(50) , Anschrift_Sorgeberechtigter varchar(50) , Klassenbezeichnung varchar(6) , primary key (Schülernummer) , foreign key (Klassenbezeichnung) references Klasse (Klassenbezeichnung) ) b) MITARBEITER create table Mitarbeiter ( Personalnummer char(6) , Name varchar(50) , Anschrift varchar(50) , Geburtsdatum date , Telefonnummer varchar(10) , Funktion varchar(30) , Einstellungsdatum date , Gehaltsinformation varchar(10) , Stundenanzahl smallint check (Stundenanzahl > 0) , primary key (Personalnummer) ) 22 c) KLASSE create table Klasse ( Klassenbezeichnung varchar(6) , Personalnummer char(6) , Klassenraum varchar(6) , Schüleranzahl smallint check (Schüleranzahl > 0) , primary key (Klassenbezeichnung) , foreign key (Personalnummer) references Mitarbeiter (Personalnummer), foreign key (Klassenraum) references Raum (Raumnummer) ) d) RAUM create table Raum ( Raumnummer varchar(6) , Kapazität smallint check (Kapazität > 0) , primary key (Raumnummer) ) e) INVESTITION create table Investition ( Eintragsnummer varchar(6) , Betrag int , Zweck varchar(80) , Bereich varchar(30) , Personalnummer char(6) , primary key (Eintragsnummer) , foreign key (Personalnummer) references Mitarbeiter (Personalnummer) ) f) BEKOMMT_NOTE create table bekommt_Note ( Schülernummer char(6) , Fachname varchar(25) , Halbjahr varchar(6) , Note smallint check (Note between 1 and 6) , primary key (Schülernummer, Fachname, Halbjahr) , foreign key (Schülernummer) references Schüler (Schülernummer) ) g) DARF_UNTERRICHTEN create table darf_unterrichten ( Personalnummer char(6) , Fachname varchar(25) , Schulstufe varchar(10) , primary key (Personalnummer, Fachname, Schulstufe) , 23 foreign key (Personalnummer) references Mitarbeiter (Personalnummer) ) h) UNTERRICHTET create table unterrichtet ( Personalnummer char(6) , Klassenbezeichnung varchar(6) , Fachname varchar(25) , Raumnummer varchar(6) , Zeitangabe varchar(25) , primary key (Raumnummer, Zeitangabe) , foreign key (Personalnummer) references Mitarbeiter (Personalnummer) , foreign key (Klassenbezeichnung) references Klasse (Klassenbezeichnung) , foreign key (Raumnummer) references Raum(Raumnummer) ) i) UNTERRICHTET_PLANMÄßIG create table unterrichtet_planmäßig ( Personalnummer char(6) , Klassenbezeichnung varchar(6) , Fachname varchar(25) , Raumnummer varchar(6) , Zeitangabe varchar(25) , primary key (Raumnummer, Zeitangabe) , foreign key (Personalnummer) references Mitarbeiter (Personalnummer) , foreign key (Klassenbezeichnung) references Klasse (Klassenbezeichnung) , foreign key (Raumnummer) references Raum(Raumnummer) ) j) HAT_UNTERRICHT create table hat_Unterricht ( Klassenbezeichnung varchar(6) , Fachname varchar(25) , Halbjahr varchar(6) , Stundenanzahl smallint , primary key (Klassenbezeichnung, Fachname, Halbjahr) , foreign key (Klassenbezeichnung) references Klasse (Klassenbezeichnung) ) k) SCHÜLERINFO create table Schülerinfo ( Schülernummer char(6) , Eintrag varchar(200) , primary key (Schülernummer, Eintrag) 24 foreign key (Schülernummer) references Schüler (Schülernummer) ) l) MITARBEITERINFO create table Schülerinfo ( Personalnummer char(6) , Eintrag varchar(200) , primary key (Personalnummer, Eintrag) foreign key (Personalnummer) references Mitarbeiter (Personalnummer) ) Mit dem alter table- Kommando lässt sich eine Spalte zu einem Relationenschema hinzufügen, z.B.: alter table Mitarbeiter add Stundenanzahl Mit dem drop table- Kommando lässt sich ein Relationenschema wieder löschen, z.B.: drop table Raum 25 5.2. Änderungsoperationen Um nun auch Daten in die Datenbank einzufügen, bzw. die eingefügten Daten zu verändern oder wieder zu löschen, werden gewisse Operationen benötigt. Um die Basisrelationen zu verändern, existieren folgende Kommandos: - mit dem insert- Kommando können Tupel eingefügt werden - mit dem update- Kommando können Tupel verändert werden - mit dem delete- Kommando können Tupel gelöscht werden Es soll beispielhaft ein Tupel in KLASSE eingefügt werden. Die Klasse hat die Bezeichnung 4a, den Lehrer mit der Personalnummer P-0045 als Klassenlehrer, den Raum mit der Raumnummer R-127 als Klassenraum und 27 Schüler. insert into Klasse values ( ’4a’ , ’P-0045’ , ’R-127’ , 27 ) Nun soll das eingefügte Tupel verändert werden, indem die Schüleranzahl auf 29 erhöht wird. update Klasse set Schüleranzahl = 29 where Klassenbezeichnung = ’4a’ Schließlich soll das Tupel wieder gelöscht werden. delete from Klasse where Klassenbezeichnung = ’4a’ 26 5.3. Anfragen Um aus der Datenbank bestimmte Daten zu erhalten, müssen Anfragen formuliert werden. In SQL geschieht dies mit Hilfe der select- from- und where- Klauseln. Die select- Klausel dient dazu, die jeweiligen Attribute auszuwählen, von denen Werte im Anfrageergebnis geliefert werden sollen. In der from- Klausel werden die Relationen angegeben, aus denen Attribute benötigt werden. Mit der where- Klausel lassen sich schließlich Bedingungen formulieren, unter denen bestimmte Tupel ausgewählt werden sollen. 1. Mit folgender Anfrage würde die komplette Relation Klasse geliefert werden. select * from Klasse 2. Es sollen Name, Personalnummer, Funktion und Einstellungsdatum aller Mitarbeiter ausgewählt werden. select Name, Personalnummer, Funktion, Einstellungsdatum from Mitarbeiter 3. Das Ergebnis der folgenden Anfrage liefert die Anzahl der Schüler an der Schule. Dazu wird die Aggregatfunktion count verwendet. select count (*) from Schüler 4. Es sollen Name, Anschrift und Telefonnummer aller Schüler der Klasse 4a ausgewählt werden. select Name, Anschrift, Telefonnummer from Schüler where Klassenbezeichnung = ´4a´ 5. Durch diese Anfrage werden die Namen aller Schüler, die einen bestimmten Fehleintrag im Januar 2005 haben, ausgewählt. Mit Hilfe der like- Klausel und des Prozentzeichens wird die Zeichenfolge im Eintrag gesucht. Die zweite Bedingung in der where- Klausel dient dazu, den Namen des entsprechenden Schülers zu ermitteln. select Schüler.Schülernummer, Name, Eintrag from Schüler, Schülerinfo where Eintrag like ´%Fehleintrag%01.2005%´ and Schüler.Schülernummer = Schülerinfo.Schülernummer 27 6. Hier werden alle Investitionen ausgewählt. select Mitarbeiter.Name, Eintragsnummer, Zweck, Betrag from Mitarbeiter, Investition where Mitarbeiter.Personalnummer = Investition.Personalnummer 7. Die Anfrage wählt die Investition mit dem größten Betrag aus. Dazu wird die Aggregatfunktion max benutzt. select * from Investition where Betrag = ( select max (Betrag) from Investition ) 8. Die Summe der Beträge, die für einen jeweiligen Zweck ausgegeben werden, soll ermittelt werden. select Zweck, sum (Betrag) from Investition group by Zweck 9. Mit dieser Anfrage werden alle Mitarbeiter ausgewählt, die kein Lehrer sind. select Personalnummer, Name, Funktion from Mitarbeiter where not Funktion = ´Lehrer´ 10. Der am längste an der Schule arbeitende Mitarbeiter wird ausgewählt. select Personalnummer, Name, Funktion from Mitarbeiter where Einstellungsdatum <= all ( select Einstellungsdatum from Mitarbeiter ) 11. Es wird ermittelt, welche Note welcher Schüler der Klasse 4a in Mathe bekommen hat. select bekommt_Note.Schülernummer, Name, Note from bekommt_Note, Schüler where Klassenbezeichnung = ´4a´ and Fachname = ´Mathe´ and Halbjahr = ´2004/05: 1´ and bekommt_Note.Schülernummer = Schüler.Schülernummer 12. Es werden die Lehrer ausgewählt, die Sport unterrichten dürfen. select darf_unterrichten.Personalnummer, Name from darf_unterrichten, Mitarbeiter where Mitarbeiter.Personalnummer = darf_unterrichten.Personalnummer and darf_unterrichten.Fachname = ´Sport´ 28 13. Durch diese Anfrage werden für jedes Fach die Lehrer zusammengefasst, die dieses Fach unterrichten dürfen. select Mitarbeiter.Personalnummer, Name, Fachname from Mitarbeiter, darf_unterrichten where Mitarbeiter.Personalnummer = darf_unterrichten.Personalnummer group by Fachname 14. Diese Anfrage gibt die Liste alle Fächer zurück, die der Mitarbeiter mit der Personalnummer ‘P-0102’ unterrichten darf. select Fachname, Stufenname from darf_unterrichten where Personalnummer = ‘P-0102’ 15. Diese Anfrage liefert den Stundenplan des Lehrers mit der Personalnummer ´P-0102´. select Zeitangabe, Klassenbezeichnung, Fachname, Raumnummer from unterrichtet_planmässig where Personalnummer = ´P-0102´ order by Zeitangabe 16. Die Anfrage wählt den Name und die Personalnummer des Lehrers aus, der die Klasse 4a am Datum 2005-03-04 in der dritten Stunde unterrichtet hat. select Name, unterrichtet.Personalnummer from Mitarbeiter, unterrichtet where Mitarbeiter.Personalnummer = unterrichtet.Personalnummer and Klassenbezeichnung = ´4a´ and Zeitangabe = ´2005-03-04; 3.Stunde´ 17. Die Raumnummer des Raums mit der größten Kapazität soll ausgewählt werden. select Raumnummer from Raum where Kapazität = (select max(Kapazität) from Raum) 18. Das Ergebnis der Anfrage sind die Nummern der Räume, die eine größere Kapazität als 35 haben. Diese Räume werden nach Kapazität gruppiert. select Raumnummer from Raum where Kapazität > 35 group by Kapazität 29 6. Literatur Andreas Heuer, Gunter Saake: Datenbanken: Konzepte und Sprachen, 2 Auflage, Bonn: mitp-Verlag, 2000. Martin Gogolla: Material zur Vorlesung Datenbanksysteme im WS 2004/05 an der Universität Bremen, http://db.informatik.uni-bremen.de/teaching/courses/ws2004_dbs/ 30