Aufgabe 8-1 Anfragen in SQL Aggregatfunktionen in SQL
Info
(!!!) steht für Teilaufgaben mit hohem Schwierigkeitsgrad
Gegeben seien die Relationen Professoren
, Personal
, Studenten
, Vorlesungen
, Voraussetzungen
, hoeren
und Pruefungen
also Datenmodell für eine Universitätsdatenbank:
Professoren
(persNr
,name
,raum
)Studenten
(matrNr
,name
,semester
)Vorlesungen
(vorlNr
,titel
,ects
,gelesenVon
[Professoren])Voraussetzungen
(vorausgesetzt
[Vorlesungen],vorlesung
[Vorlesungen])hoeren
(matrNr
[Studenten],vorlNr
[Vorlesungen])Pruefungen
(matrNr
[Studenten],vorlNr
[Vorlesungen],note
)
Formulieren Sie folgende Anfragen für das obige Datenbankschema in der Datenbanksprache SQL.
Hinweis: Am End des Übungsblattes finden Sie zum Verständnis eine passende Beispielausprägung des Relationenschemas. Achten Sie darauf, dass Ihre Anfrage für jede mögliche Ausprägung der Datenbank das richtige Ergebnis liefert; nicht nur für die gegebene Beispielausprägung. Darüber Hinaus finden Sie eine Beispielausprägung auch in der SQL-Schnittstelle.
a) Bestimmen Sie für jede Vorlesung (Anzuzeigen: Nummer und Title) die Durchschnittsnote (gerundet auf drei Stellen) über alle in dem Fach stattgefundenen Prüfungen. AVG()
Zum Runden können Sie die Function ROUND
benutzen. Beispielsweise wird das Ergebnis der Berechnung in folgender Anfrage auf drei Nachkommastellen gerundet:
Lösung:
b) Bestimmen Sie Personalnummer und Namen eines jeden Professors, zusammen mit der Anzahl der unterschiedlichen Vorlesungen, die er hält. Professoren ohne Vorlesung sollen mit einer Vorlesungsanzahl von 0 angegeben werden.
Sortieren Sie das Ergebnis absteigend nach der Anzahl der Vorlesungen.
!!! c) Bestimmen Sie für jeden Studenten (Anzuzeigen: Matrikelnummer und Name), wie viele andere Studenten aus einem höheren Semester dieser kennt (d.h. beide besuchen mindestens eine Vorlesung gemeinsam). Zeigen Sie nur Studenten an, die mehr also zwei andere Studenten aus einem höheren Semester kennen.
!!! d) Bestimmen Sie die Professoren (Anzuzeigen: Personalnummer und Name), für die mindestens zwei Studenten mindestens drei Vorlesungen des jeweiligen Professors hören
Tipp: Erstellen Sie passende Views, um die Anfrage übersichtlicher zu gestalten. Benutzen Sie hierzu die Syntax aus der Vorlesung!
Erklärung
-
CREATE VIEW AZ
: Erstellt eine temporäre Tabelle zur Vereinfachung komplexer Abfragen. -
SELECT matrNr, gelesenVon, COUNT(*) as anz
: Wählt Studenten-ID, Professor-ID und zählt Vorlesungen. -
FROM Vorlesungen NATURAL JOIN hoeren
: Verbindet Vorlesungen mit gehörten Vorlesungen auf Basis gleicher Spalten. -
GROUP BY matrNr, gelesenVon
: Gruppiert Ergebnisse nach Student und Professor. -
HAVING COUNT(*) >= 3
: Berücksichtigt nur Gruppen mit mindestens drei Vorlesungen. -
SELECT persNr, name
: Wählt Professoren-ID und -Namen. -
FROM Professoren JOIN AZ ON persNr = gelesenVon
: Verknüpft Professoren mit dem View, basierend auf ID. -
GROUP BY persNr, name
: Gruppiert nach Professor. -
HAVING COUNT(*) >= 2
: Filtert Professoren mit mindestens zwei zugehörigen Studenten.
!!! e) Bestimmen Sie für jede Vorlesung (anzuzeigen: Nummer und Title), welche mindestens eine andere Vorlesung voraussetzt, die prozentualen Anteile (gerundet auf zwei Nachkommastellen) der teilnehmenden Studenten pro Semester. Dabei interessieren uns nur Vorlesungen, die von Studenten aus unterschiedlichen Semestern gehört werden. Andere Vorlesungen sollen nicht in der Ergebnistabelle auftauchen.
Ein Beispiel: Die Vorlesung Softwaretechnik setzt eine andere Vorlesung voraus und wird von insgesamt 6 Studenten gehört. Davon stammt ein Student aus dem fünften Semester. Also macht dieser Fünftsemestler ein Sechstel aller Hörer aus. Das entsprechende Ergebnistupel ist somit (6, ‘Softwaretechnik’, 5, 16,67).
Das Ergebnis soll sortiert werden: alphabetisch nach dem Vorlesungstitel, dann absteigend nach dem prozentualen Anteil, bei gleichem Anteil aufsteigend nach dem Semester.
Tipp: Erstellen Sie passende Views.
Erklärung
Um die gestellte Aufgabe zu lösen, wurde ein schrittweiser Ansatz verfolgt, bei dem Views (virtuelle Tabellen) verwendet wurden, um die Komplexität der SQL-Anfrage zu reduzieren. Hier ist die Erklärung für jeden Schritt:
-
View
Vorlesung_mit_Voraussetzung
: Der erste Schritt besteht darin, alle Vorlesungen zu identifizieren, die mindestens eine andere Vorlesung also Voraussetzung haben. Dies wird erreicht, indem eine View erstellt wird, die allevorlNr
undtitel
aus derVorlesungen
-Tabelle enthält, für die es einen Eintrag in derVoraussetzungen
-Tabelle gibt. Das bedeutet, dass nur Vorlesungen in diese View aufgenommen werden, die mindestens eine Voraussetzung haben. -
View
Anzahl_Gesamt
: Der nächste Schritt ist die Erstellung einer View, die für jede Vorlesung die Gesamtanzahl der teilnehmenden Studenten berechnet. Dies wird durch Gruppierung der Einträge in derhoeren
-Tabelle nachvorlNr
erreicht und dann die Anzahl der Studenten pro Vorlesung (anz_ges
) gezählt. -
View
Anzahl_Semester
: Diese View ermittelt die Anzahl der teilnehmenden Studenten pro Semester für jede Vorlesung. Dazu wird eine natürliche Verknüpfung (NATURAL JOIN
) zwischen derhoeren
- und derStudenten
-Tabelle verwendet, um diesemester
-Information zu denvorlNr
zu erhalten. Anschließend wird für jede Kombination ausvorlNr
undsemester
die Anzahl der Studenten (anz_sem
) berechnet. -
Finale SQL-Anfrage: Schließlich wird die endgültige Anfrage gestellt, um die geforderten Informationen zu erhalten. Die Anfrage verknüpft die zuvor erstellten Views (
Anzahl_Semester
,Anzahl_Gesamt
,Vorlesung_mit_Voraussetzung
) miteinander, um für jede Vorlesung, die eine Voraussetzung hat, die prozentualen Anteile der teilnehmenden Studenten pro Semester zu berechnen. Die Bedingunganz_sem < anz_ges
stellt sicher, dass nur Vorlesungen berücksichtigt werden, die von Studenten aus verschiedenen Semestern besucht werden. Die Ergebnisse werden dann entsprechend den Vorgaben sortiert: alphabetisch nach dem Vorlesungstitel, absteigend nach dem prozentualen Anteil und bei gleichem Anteil aufsteigend nach dem Semester.
Durch diesen schrittweisen Ansatz wird die Komplexität der Anfrage reduziert, und es wird einfacher, das gewünschte Ergebnis zu erzielen. Jeder Schritt baut auf dem vorherigen auf, indem er eine spezifische Teilmenge der Daten vorbereitet, die dann in der finalen Anfrage verwendet wird, um das Endergebnis zu berechnen.
Aufgabe 8-2 Anfragen in SQL*
Diese Aufgabe bezieht sich auf das aus früheren Übungsblättern bekannte Möbel-Datenbankschema. Formulieren Sie die folgenden Anfragen in SQL. Auf der Vorlesungswebseite steht auch eine SQL-Schnittstelle für dieses Schema zur Verfügung:
Kunde
(kund_nr, kund_name, address, ort, plz)Personal
(pers_nr, nachname, vorname, einsatz, vorgesetzt, gehalt)Verkauf
(auftr_nr, bestelldatum, pers_nr, kund_nr)Inventar
(art_nr, art_bez, lagerbest, lagerort, preis)Auftragsposten
(auftr_nr, art_nr, menge)
a) Finden Sie die Artikelnummer, die Artikelbezeichnung, den Lagerort und den Lagerbestand aller in Hamburg oder München gelagerten Artikel.
ODER
b) Finden Sie für alle in der Tabelle Auftragsposten gespeicherten Bestellungen des Artikels mit der Nummer 203333 die Auftragsnummer, die Artikelnummer, die bestellte Menge und alle Lagerbestände und Lagerorte, an denen eine ausreichende Stückzahl des Artikels 203333 vorhanden ist.
c) Finden Sie die Nummern derjenigen Kunden, die keinen Auftrag erteilt haben.
ODER