Aufgabe 6-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:
Formulieren Sie folgende Anfragen für das obige Datenbankschema in der Datenbanksprache SQL.
Hinweis: Am Ende 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 Titel ) die Durchschnittsnote (gerundet auf drei Stellen) über alle in dem Fach stattgefundenen Prüfungen.
Runden: Zum Runden können Sie die Funktion ROUND
benutzen. Beispielsweise wird das Ergebnis der Berechnung in folgender Anfrage auf drei Nachkommastellen gerundet:
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), wieviele andere Studenten aus einem höheren Semester dieser kennt.
(d.h. beide besuchen mindestens eine Vorlesung gemeinsam). Zeigen Sie nur Studenten an, die mehr als zwei andere Studenten aus einem höheren Semester kennen.
Erklärung der SQL-Abfrage
Diese Abfrage ermittelt für jeden Studenten (
S1
), wie viele andere Studenten aus höheren Semestern (S2
) er kennt. Ein Student wird als “bekannt” betrachtet, wenn beide mindestens eine Vorlesung gemeinsam besuchen.
- Tabellenverknüpfung: Die Tabelle
hoeren
verknüpft Studenten mit den von ihnen belegten Vorlesungen. MitJOIN
wird geprüft, welche Vorlesungen zwei Studenten (S1 und S2) gemeinsam hören.- Semesterbedingung: Die Bedingung
S1.semester < S2.semester
filtert die Ergebnisse, sodass nur Studenten gezählt werden, die sich in einem höheren Semester befinden alsS1
. Dies stellt sicher, dass ausschließlich Beziehungen zu älteren Semestern betrachtet werden.- Gruppierung und Zählung: Mithilfe von
GROUP BY S1.matrNr, S1.name
werden die Ergebnisse nach den Matrikelnummern und Namen der Studenten (S1
) gruppiert. Anschließend wird mitCOUNT(DISTINCT S2.matrNr)
ermittelt, wie viele eindeutige Matrikelnummern der Studenten aus höheren Semestern (S2
) mit jedem Studenten verknüpft sind.- Filterung: Die Bedingung
HAVING COUNT(DISTINCT S2.matrNr) > 2
sorgt dafür, dass nur Studenten berücksichtigt werden, die mehr als zwei andere aus höheren Semestern kennen.Ergebnis: Die Abfrage liefert eine Liste mit den Matrikelnummern und Namen der Studenten, sowie der Anzahl der Studenten aus höheren Semestern, die sie kennen. Nur diejenigen Studenten werden angezeigt, die mehr als zwei solche Verbindungen haben.
d) Bestimmen Sie die Professoren (Anzuzeigen: Personalnummer und Name), die 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 Titel), 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ünftsemester ein sechstel aller Hörer aus. Das entsprechende Ergebnisbeispiel ist somit .
Das Ergebnis soll sortiert werden:
- Alphabetisch nach dem Vorlesungstitel
- Absteigend nach dem prozentualen Anteil
- Bei gleichem Anteil aufsteigend nach dem Semester.
Tipp: Erstellen Sie passende Views.
Erklärung der SQL-Abfrage Die Aufgabe wird durch einen schrittweisen Ansatz mit Views (virtuellen Tabellen) gelöst, um die SQL-Abfrage zu vereinfachen:
- View
Vorlesung_mit_Voraussetzung
: Enthält alle Vorlesungen mit mindestens einer Voraussetzung, basierend auf den TabellenVorlesungen
undVoraussetzungen
.- View
Anzahl_Gesamt
: Berechnet für jede Vorlesung die Gesamtanzahl der teilnehmenden Studenten durch Gruppierung der Tabellehoeren
.- View
Anzahl_Semester
: Zählt die Studenten pro Semester je Vorlesung mithilfe einesNATURAL JOIN
zwischenhoeren
undStudenten
.- Finale Anfrage: Verknüpft die Views, um prozentuale Anteile der Teilnehmer je Semester zu berechnen, sortiert die Ergebnisse nach Titel, Anteil (absteigend) und Semester (aufsteigend), und filtert mit
anz_sem < anz_ges
nur Vorlesungen, die von Studenten aus unterschiedlichen Semestern besucht werden.Ergebnis: Durch diese Schritte wird die Komplexität reduziert, und das gewünschte Ergebnis effizient ermittelt.
Aufgabe 6-2 Anfragen in SQL
Diese Aufgabe nimmt Bezug 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.
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
d) Gesucht sind die verschiedenen Lagerorte von Artikeln in der Tabelle Inventar
, die einen Lagerbestand von mindestens 8 Exemplaren haben.
e) Finden Sie den Vornamen und den Nachnamen derjenigen Angestellten, die einen oder mehrere Verkäufe an Kunden aus Stuttgart bearbeitet haben.
f) Finden Sie den Nachnamen, Vornamen, Einsatzort und das Gehalt aller in der Tabelle Personal
gespeicherten Angestellten.
Das Ergebnis soll lexikographisch nach dem Einsatzort sortiert werden. Bei gleichem Einsatzort soll in absteigender Reihenfolge nach dem Gehalt sortiert werden.
g) Finden Sie die Personalnummern und das Gehalt der Angestellten mit minimalem oder maximalem Gehalt.
h) Finden Sie für jeden Einsatzort die Anzahl der dort eingesetzten Angestellten.
i) Wie hoch ist die durchschnittliche Anzahl Angestellter über alle Einsatzorte?
j) Finden Sie für jeden Artikel die Artikelnummer und die Summe der Lagerbestände in den Lagerorten, die den Artikel führen.
Es sollen nur solche Artikel ausgegeben werden, die einen Gesamtbestand von mehr als 10 Stück haben.