Inf 12 - Brichzin

Werbung
Inf 12
SQL Abfragen
Gymnasium
Ottobrunn
Eine Kaufhaus-Datenbank besteht aus folgenden Tabellen
Artikel
Abteilung Abteilungsname
Kosmetik
Lebensmittel
Textilien
Hinweis:
ArtNr
95
97
507
1056
1401
2045
2046
Stockwerk
I
EG
II
Bezeichnung
Kamm
Kamm
Seife
Zwieback
Räucherlachs
Herrenhose
Herrenhose
Abteilungsleiter
Josef Kunz
Monika Stiehl
Monika Stiehl
Verkaufspreis
1.25
0.99
3.93
1.20
4.90
37.25
20.00
Einkaufspreis
0.80
0.75
2.45
0.90
3.60
24.45
17.00
Bestand Abteilungsname
ArtNr
Lebensmittel
1056
Lebensmittel
1401
Textilien
2045
Vorrat
129
200
14
Basistabellen (Tabellen, die in der Datenbank definiert sind), werden graphisch dadurch gekennzeichnet,
dass es eine "nullte" Spalte gibt, in der der Tabellenname angegeben wird. Die Realisierung der Tabellen
in der Datenbank enthält diese Spalte natürlich nicht.
1. Geben Sie ein mögliches ER-Modell an, auf dem diese Datenbank basieren könnte.
2. Was fällt Ihnen auf, wenn Sie sich die Tabelleneinträge ansehen? Wie würden Sie
korrigieren?
3.
Formulieren Sie folgende Anfragen in SQL:
a) Gesucht sind Artikelnummer und Vorrat aller Artikel aus der Textil-Abteilung.
b) Gesucht sind alle Informationen über die Abteilungen, die im zweiten Stock platziert sind
oder von Frau Stiehl geleitet werden.
c) Gesucht ist der Name des Abteilungsleiters, der für Zwieback zuständig ist.
d) Gesucht sind alle Bezeichnung, Artikelnummer und Name des verantwortlichen
Abteilungsleiters von Artikeln, deren Vorrat kleiner als 100 ist
e) Welche Artikel (Artikelnummer, Abteilungsname) werden in den Abteilungen angeboten?
Die Ausgabe soll absteigend nach der Artikelnummer sortiert werden. Bei gleicher
Artikelnummer sollen die betroffenen Abteilungen alphabetisch aufgelistet werden.
f) Wie viele verschiedene Waren werden in der Lebensmittelabteilung verkauft?
g) Wie viele verschiedene Waren werden in den einzelnen Abteilungen verkauft?
h) Wie viel kostet der billigste, wie viel der teuerste Artikel?
Achtung: Es sind NICHT einzelne Tabelleneinträge entsprechend dem obigen Beispiel
gefragt! Die Antwort muss eine vollständige SQL Anfrage sein, die sich auf alle
Datenbanken der gegebenen Struktur anwenden lässt.
3. Formulieren Sie folgende SQL-Anfragen umgangssprachlich
SELECT DISTINCT Abteilungsleiter FROM Abteilung
WHERE NOT(Abteilungsname = Kosmetik);
b) SELECT ArtNr FROM Bestand
WHERE Abteilungsname = ‘Lebensmittel’ AND Vorrat <= 100;
a)
1.
Hinweis: -
-
Die obige Festlegung der n:m-Funktionalität ist aufgrund der vorgegebenen drei Tabellen
naheliegend, aber nicht zwingend. Falls man annimmt, dass ein Artikel nur in einer
Abteilung vertrieben wird, handelt es sich bei Bestand um einen 1:n-Relationship-Typen.
In diesem Fall ist aber dann die Verwendung von drei Tabellen unzweckmäßig
(Verfeinerung des Relationenschemas!).
Die jeweiligen Primärschlüssel sind aus den in der Angabe vorgegebenen Tabellen nicht
ablesbar. ArtNr und Abteilungsname erscheinen aber als Primärschlüssel geeignet. Als
Folge dessen ergibt sich natürlich für die Relation Bestand in Abhängigkeit von der
festgelegten Funktionalität der entsprechende Primärschlüssel.
Aufgabe 3
a)
SELECT ArtNr, Vorrat
FROM Bestand
WHERE Abteilungsname = ‘Textilien’;
b)
SELECT * FROM Abteilung
WHERE Stockwerk = ‘II’
OR Abteilungsleiter = ‘Monika Stiehl’;
c)
SELECT Abteilungsleiter
FROM Abteilung, Artikel, Bestand
WHERE Bezeichnung = ‘Zwieback’
AND Bestand.Artikelnummer = Artikel. Artikelnummer
AND Bestand.Abteilungsname = Abteilung.Abteilungsname
d)
SELECT Bezeichnung, Artikelnummer, Abteilungsleiter
FROM Abteilung, Artikel, Bestand
WHERE Bestand < 100
AND Bestand.Artikelnummer = Artikel. Artikelnummer
AND Bestand.Abteilungsname = Abteilung.Abteilungsname
e)
SELECT ArtNr, Abteilungsname
FROM Bestand
ORDER BY ArtNr DESC, Abteilungsname;
SELECT COUNT(*)
FROM Bestand
WHERE Abteilungsname = 'Lebensmittel';
f)
Hinweise: - Neben Aggregatfunktionen dürfen in der SELECT-Klausel nur die Attribute aufgeführt werden,
die in der GROUP By-Klausel vorkommen!
Alternative zu b:
SELECT Abteilungsname, COUNT(*) FROM Bestand
WHERE Abteilungsname = 'Lebensmittel'
GROUP BY Abteilungsname;
- Man kann „verschiedene Waren“ einerseits auf die Artikelnummer, andererseits auf die
Bezeichnung beziehen. Diese Lösungsvorschläge gehen von den Artikelnummern aus.
g)
h)
SELECT Abteilungsname, COUNT(*)
FROM Bestand
GROUP BY Abteilungsname;
SELECT MIN(Verkaufspreis), MAX(Verkaufspreis)
FROM Artikel;
Aufgabe 4
a)
Gesucht sind die Namen aller Abteilungsleiter mit Ausnahme
der Kosmetik-Abteilung? Duplikate sollen eliminiert werden.
b)
Gesucht sind die Nummern der Artikel, von denen in der
Lebensmittelabteilung maximal 100 vorrätig sind.
Herunterladen