\documentclass{bschlangaul-aufgabe} \bLadePakete{syntax} \begin{document} \bAufgabenMetadaten{ Titel = {Kaufhausdatenbank}, Thematik = {Kaufhaus}, Referenz = DB.Relationale-Anfragesprachen.SQL.Kaufhaus, RelativerPfad = Module/10_DB/40_Relationale-Anfragesprachen/10_SQL/Aufgabe_Kaufhaus.tex, ZitatSchluessel = db:ab:2, ZitatBeschreibung = {Aufgabe 1: Kaufhausdatenbank - einfacher Einstieg}, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {SQL, SQL mit Übungsdatenbank, Relationale Algebra}, } Die relationale Datenbank eines Kaufhauses enthält folgende Tabellen: \index{SQL} \footcite[Aufgabe 1: Kaufhausdatenbank - einfacher Einstieg]{db:ab:2} \bPseudoUeberschrift{Artikel} \begin{tabular}{llll} \textbf{ArtNr} & \textbf{Bezeichnung} & \textbf{Verkaufspreis} & \textbf{Einkaufspreis} \\ 95 & Kamm & 1.25 & 0.80 \\ 97 & Kamm & 0.99 & 0.75 \\ 507 & Seife & 3.93 & 2.45 \\ 1056 & Zwieback & 1.20 & 0.90 \\ 1401 & Räucherlachs & 4.90 & 3.60 \\ 2045 & Herrenhose & 37.25 & 24.45 \\ 2046 & Herrenhose & 20.00 & 17.00 \\ 2340 & Sommerkleid & 94.60 & 71.50 \end{tabular} \bPseudoUeberschrift{Abteilung} \begin{tabular}{lll} \textbf{Abteilungsname} & \textbf{Stockwerk} & \textbf{Abteilungsleiter} \\ Lebensmittel & I & Josef Kunz \\ Lebensmittel & EG & Monika Stiehl \\ Textilien & II & Monika Stiehl \end{tabular} \bPseudoUeberschrift{Bestand} \begin{tabular}{lll} \textbf{Abteilungsname} & \textbf{ArtNr} & \textbf{Vorrat} \\ Lebensmittel & 1056 & 129 \\ Lebensmittel & 1401 & 200 \\ Textilien & 2045 & 14 \end{tabular} % Datenbankname: Kaufhaus \begin{minted}{sql} CREATE TABLE Artikel ( ArtNr INTEGER PRIMARY KEY NOT NULL, Bezeichnung VARCHAR(100) NOT NULL, Verkaufspreis FLOAT(2), Einkaufspreis FLOAT(2) ); CREATE TABLE Abteilung ( Abteilungsname VARCHAR(60) NOT NULL, Stockwerk VARCHAR(10) NOT NULL, Abteilungsleiter VARCHAR(100), PRIMARY KEY (Abteilungsname, Stockwerk) ); CREATE TABLE Bestand ( Abteilungsname VARCHAR(100) REFERENCES Abteilung(Abteilungsname), ArtNr INTEGER REFERENCES Artikel(ArtNr), Vorrat INTEGER, PRIMARY KEY (Abteilungsname, ArtNr) ); INSERT INTO Artikel VALUES (95, 'Kamm', 1.25, 0.80), (97, 'Kamm', 0.99, 0.75), (507, 'Seife', 3.93, 2.45), (1056, 'Zwieback', 1.20, 0.90), (1401, 'Räucherlachs', 4.90, 3.60), (2045, 'Herrenhose', 37.25, 24.45), (2046, 'Herrenhose', 20.00, 17.00), (2340, 'Sommerkleid', 94.60, 71.50); INSERT INTO Abteilung VALUES ('Lebensmittel', 'I', 'Josef Kunz'), ('Lebensmittel', 'EG', 'Monika Stiehl'), ('Textilien', 'II', 'Monika Stiehl'); INSERT INTO Bestand VALUES ('Lebensmittel', 1056, 129) ('Lebensmittel', 1401, 200) ('Textilien', 2045, 14); \end{minted} \index{SQL mit Übungsdatenbank} Formulieren Sie mit Hilfe von SQL folgende Anfragen: \begin{enumerate} %% % (a) %% \item Gesucht sind alle Informationen über Herrenhose und Sommerkleid! \begin{bAntwort} \begin{minted}{sql} SELECT * FROM Artikel WHERE Bezeichnung = 'Herrenhose' OR Bezeichnung = 'Sommerkleid'; \end{minted} \end{bAntwort} %% % (b) %% \item Welche Artikelnummer hat der Zwieback? \begin{bAntwort} \begin{minted}{sql} SELECT ArtNr FROM Artikel WHERE Bezeichnung = 'Zwieback'; \end{minted} \end{bAntwort} %% % (c) %% \item Welche Waren (Artikelnummer und Verkaufspreis) werden für mehr als 25€ verkauft? \begin{bAntwort} \begin{minted}{sql} SELECT ArtNr, Verkaufspreis FROM Artikel WHERE Verkaufspreis > 25.00; \end{minted} \end{bAntwort} %% % (d) %% \item Welche Artikel (Angabe der Bezeichnung) bietet das Kaufhaus an? \begin{bAntwort} \begin{minted}{sql} SELECT DISTINCT Bezeichnung FROM Artikel; \end{minted} \end{bAntwort} %% % (e) %% \item Gesucht sind die Artikelnummern aller Artikel mit Ausnahme der Artikelnummer 2046. \begin{bAntwort} \begin{minted}{sql} SELECT ArtNr FROM Artikel WHERE NOT (ArtNr = 2046); \end{minted} \end{bAntwort} %% % (f) %% \item Gib die Artikelnummern und die Verkaufspreise aller Herrenhosen aus, die für höchstens 25€ verkauft werden! Der Spaltenname für die Verkaufspreise soll in der Ergebnistabelle „Sonderangebot“ heißen. \begin{bAntwort} \begin{minted}{sql} SELECT ArtNr, Verkaufspreis AS Sonderangebot FROM Artikel WHERE Bezeichnung = 'Herrenhose' AND Verkaufspreis <= 25; \end{minted} \end{bAntwort} %% % (g) %% \item Gib Artikelnummer und Verkaufspreis aller Artikel aus, die im Einkauf zwischen 80 Cent und 5€ kosten. \begin{bAntwort} \begin{minted}{sql} SELECT ArtNr, Verkaufspreis FROM Artikel WHERE Einkaufspreis BETWEEN 0.80 AND 5.00; \end{minted} \end{bAntwort} \end{enumerate} %----------------------------------------------------------------------- % %----------------------------------------------------------------------- \bPseudoUeberschrift{Teilaufgabe 2\footcite[Aufgabe 2: Kaufhaus reloaded]{db:ab:2}} \begin{enumerate} \item Geben Sie die SQL-Befehle an, mit der die Tabellenschemata von Artikel und Bestand erzeugt werden können. Wählen Sie dabei geeignete Domänen. \begin{bAntwort} \begin{minted}{sql} CREATE TABLE Artikel ( ArtNr INTEGER PRIMARY KEY NOT NULL, Bezeichnung VARCHAR(100) NOT NULL, Verkaufspreis FLOAT(2), Einkaufspreis FLOAT(2) ); CREATE TABLE Bestand ( Abteilungsname VARCHAR(100) REFERENCES Abteilung(Abteilungsname), ArtNr INTEGER REFERENCES Artikel(ArtNr), Vorrat INTEGER, PRIMARY KEY (Abteilungsname, ArtNr) ); \end{minted} \end{bAntwort} %% % 2. %% \item Es treten nun nacheinander die folgenden Änderungen auf. Aktualisieren Sie den Tabellenbestand mit den entsprechenden SQL-Befehlen: \begin{enumerate} %% % (a) %% \item Ein Sommerkleid mit der Artikelnummer 2341, dem Einkaufspreis 70€ und dem Verkaufspreis 90,75€ wird in das Artikelsortiment aufgenommen. \begin{bAntwort} \begin{minted}{sql} INSERT INTO Artikel VALUES (2341, 'Sommerkleid', 90.75, 70.00); \end{minted} \end{bAntwort} %% % (b) %% \item Der Artikel mit der Nummer 2341 wird wieder aus dem Sortiment genommen, da er den Qualitätsstandards nicht entsprochen hat. \begin{bAntwort} \begin{minted}{sql} DELETE FROM Artikel WHERE ArtNr = 2341; \end{minted} \end{bAntwort} %% % (c) %% \item Eine Bürste mit der Artikelnummer 2 wird in das Sortiment aufgenommen. Einkaufs- bzw. Verkaufspreis sind noch nicht festgelegt. \begin{bAntwort} \begin{minted}{sql} INSERT INTO Artikel (ArtNr, Bezeichnung) VALUES (2, 'Bürste'); \end{minted} \end{bAntwort} %% % (d) %% \item Eine Damenhose (Verkaufspreis 89€, Einkaufspreis: 60,50€) wird neu in das Sortiment aufgenommen. Eine Artikelnummer wurde noch nicht festgelegt. \begin{bAntwort} \texttt{ArtNr} ist der Primärschlüssel der Tabelle \texttt{Artikel}. Bei Eingabe eines neuen Datensatzes müssen mindestens die Werte aller Attribute, die zum Primärschlüssel gehören, angegeben werden. Da aber im Fall der Damenhose die Artikelnummer noch nicht festgelegt ist, ist eine Eingabe der Damenhose-Daten in die Tabelle Artikel nicht möglich. Hinweis: Denken Sie also immer daran, dass bei Einfügen von Datensätzen der Primärschlüssel keine NULL-Werte enthalten darf! \end{bAntwort} %% % (e) %% \item Die Herrenhosen werden aus dem Sortiment genommen und deshalb aus der Tabelle Artikel gelöscht. \begin{bAntwort} \begin{minted}{sql} DELETE FROM Bestand WHERE ArtNr = 2045; DELETE FROM Artikel WHERE Bezeichnung = 'Herrenhose'; \end{minted} \end{bAntwort} %% % (f) %% \item Die neue Abteilungsleiterin der Lebensmittelabteilung heißt Elvira Sommer. \begin{bAntwort} \begin{minted}{sql} UPDATE Abteilung SET Abteilungsleiter = 'Elvira Sommer' WHERE Abteilungsnahme = 'Lebensmittel'; \end{minted} \end{bAntwort} %% % (g) %% \item Die Abteilung Feinkost hat einen Bestand von 150 Räucherlachspackungen. \begin{bAntwort} Die Attribute ArtNr und Abteilungsname der Tabelle Bestand sind Fremdschlüssel. Ein neuer Datensatz darf in die Tabelle nur eingefügt werden, wenn die Fremdschlüsselwerte in den entsprechenden (Primärschlüssel-)Attribute der referenzierten Tabelle auch existieren. Die Abteilung Feinkost, genauer gesagt den Abteilungsnamen ’Feinkost’ gibt es in Abteilung aber noch nicht. \begin{enumerate} \item Lösungsmöglichkeit: Die Aktualisierung kann nicht durchgeführt werden. \item Lösungsmöglichkeit: Die entsprechende Abteilung Feinkost wird – natürlich in „Absprache“ mit der Kaufhausleitung – eingeführt und ein dementsprechender Datensatz in Abteilung eingefügt. \end{enumerate} \begin{minted}{sql} INSERT INTO Abteilung (Abteilungsname) VALUES ('Feinkost'); INSERT INTO Bestand VALUES ('Feinkost', 1401, 150); \end{minted} \end{bAntwort} \end{enumerate} %% % 3. %% \item Formulieren Sie folgende Anfragen in SQL: \begin{enumerate} %% % (a) %% \item Gesucht sind Artikelnummer und Vorrat aller Artikel aus der Textil-Abteilung. \begin{bAntwort} \begin{minted}{sql} SELECT ArtNr, Vorrat FROM Bestand WHERE Abteilungsname = 'Textilien'; \end{minted} \end{bAntwort} %% % (b) %% \item Gesucht sind alle Informationen über die Abteilungen, die im zweiten Stock platziert sind oder von Frau Stiehl geleitet werden. \begin{bAntwort} \begin{minted}{sql} SELECT * FROM Abteilung WHERE Stockwerk = 'II' OR Abteilungsleiter = 'Monika Stiehl'; \end{minted} \end{bAntwort} \end{enumerate} %% % 4. %% \item Formulieren Sie folgende SQL-Anfragen umgangssprachlich: \begin{enumerate} %% % (a) %% \item SQL-Anfrage: \begin{minted}{sql} SELECT DISTINCT Abteilungsleiter FROM Abteilung WHERE NOT (Abteilungsname = 'Kosmetik'); \end{minted} \begin{bAntwort} Gesucht sind die Namen aller Abteilungsleiter mit Ausnahme der Kosmetik-Abteilung. Duplikate sollen eliminiert werden. \end{bAntwort} %% % (b) %% \item SQL-Anfrage: \begin{minted}{sql} SELECT ArtNr FROM Bestand WHERE Abteilungsname = "Lebensmittel" AND Vorrat <= 100; \end{minted} \begin{bAntwort} Gesucht sind die Nummern der Artikel, von denen in der Lebensmittelabteilung maximal 100 vorrätig sind. \end{bAntwort} \end{enumerate} \item Interpretieren Sie nun die obigen Tabellen als Repräsentationen der drei Relationen Artikel, Abteilung und Bestand. Bestimmen Sie die Ergebnisrelationen folgender relationaler Ausdrücke\index{Relationale Algebra}: \begin{enumerate} %% % (a) %% \item $\pi_{ArtNr,Bezeichnung}(Artikel)$ \begin{bAntwort} \begin{tabular}{ll} 95 & Kamm \\ 97 & Kamm \\ 507 & Seife \\ 1056 & Zwieback \\ 1401 & Räucherlachs \\ 2045 & Herrenhose \\ 2046 & Herrenhose \\ 2340 & Sommerkleid \end{tabular} \end{bAntwort} %% % (b) %% \item $\pi_{Abteilungsname}(Bestand)$ \begin{bAntwort} \begin{tabular}{l} Lebensmittel \\ Textilien \end{tabular} \end{bAntwort} %% % (c) %% \item $\sigma_{((Vorrat < 100 \land ArtNr > 1500) \lor ArtNr < 1100)}(Bestand)$ \begin{bAntwort} \begin{tabular}{lll} Lebensmittel & 1056 & 129 \\ Textilien & 2045 & 14 \end{tabular} \end{bAntwort} %% % (d) %% \item $\sigma_{((Vorrat < 100 \land (ArtNr > 1500 \lor ArtNr < 1100)}(Bestand)$ \begin{bAntwort} \begin{tabular}{lll} Textilien & 2045 & 14 \end{tabular} \end{bAntwort} %% % (e) %% \item $\pi_{ArtNr}(\sigma_{Bezeichnung=Herrenhose}(Artikel))$ \begin{bAntwort} \begin{tabular}{l} 2045 \\ 2046 \end{tabular} \end{bAntwort} %% % (f) %% \item $\pi_{Abteilungsname}(Abteilung) - \pi_{Abteilungsname} (Bestand)$ \begin{bAntwort} \begin{tabular}{l} Kosmetik \end{tabular} \end{bAntwort} %% % (g) %% \item \begin{math} \pi_{Bezeichnung,Einkaufspreis}(\sigma_{Einkaufspreis < 2.50} (Artikel)) \cup\\ \pi_{Bezeichnung,Einkaufspreis}(\sigma_{Einkaufsreis > 20.00} (Artikel)) \end{math} \begin{bAntwort} Die letzten Zeile ist nicht in der Musterlösung dabei. Ich glaube aber es müsste so stimmen. \begin{tabular}{llll} Bezeichnung & Einkaufspreis \\ Kamm & 0.80 \\ Kamm & 0.75 \\ Seife & 2.45 \\ Zwieback & 0.90 \\ Herrenhose & 24.45 \\ Sommerkleid & 71.50 \end{tabular} \end{bAntwort} \end{enumerate} \end{enumerate} %----------------------------------------------------------------------- % %----------------------------------------------------------------------- \bPseudoUeberschrift{Teilaufgabe 2 \footcite[Kaufhaus again..., Aufgabe 1]{db:ab:7}} \begin{enumerate} %% % (a) %% \item Formulieren Sie nachfolgende Anfragen in SQL mit Hilfe von Joins! \begin{itemize} %% % Punkt 1 %% \item Wie viele Packungen Zwieback sind noch vorrätig? \begin{bAntwort} Hinweis: In obigem Lösungsansatz wird berücksichtigt, dass ein Artikel, hier der Zwieback, in mehreren Abteilungen verkauft werden kann. Geht man davon aus, dass Zwieback nur in einer Abteilung verkauft wird, kann man die Aggregatfunktion SUM weglassen. \begin{minted}{sql} SELECT SUM(b.Vorrat) FROM Bestand b, Artikel a WHERE b.ArtNr = a.ArtNr AND a.Bezeichnung = 'Zwieback'; \end{minted} \end{bAntwort} %% % Punkt 2 %% \item In welchem Stockwerk wird Räucherlachs verkauft? \begin{bAntwort} \begin{minted}{sql} SELECT Abteilung.Stockwerk FROM Artikel, Abteilung, Bestand WHERE Artikel.ArtNr = Bestand.ArtNr AND Bestand.Abteilungsname = Abteilung.Abteilungsname AND Artikel.Bezeichnung = 'Räucherlachs'; \end{minted} \end{bAntwort} \end{itemize} %% % (b) %% \item Formulieren Sie folgende Anfragen an die Kaufhaus-Datenbank unter Verwendung von geschachtelten SELECT-Anweisungen! \begin{itemize} %% % Punkt 1 %% \item Gib die Bezeichnungen und die Artikelnummern aller Artikel aus, die nicht mehr als der Artikel mit der Artikelnummer 1401 kosten! \begin{bAntwort} Hinweis: Durch Hinzufügen der Bedingung NOT(ArtNr=1401) wird der Artikel mit der Nummer 1401 in der Ergebnistabelle nicht aufgeführt \begin{minted}{sql} SELECT Bezeichnung, ArtNr AS Artikelnummer FROM Artikel WHERE Verkaufspreis <= ( SELECT Verkaufspreis FROM Artikel WHERE ArtNr = 1401 ); \end{minted} \end{bAntwort} %% % Punkt 2 %% \item Gesucht sind Bezeichnung und Verkaufspreis aller Artikel, die in der Textilienabteilung verkauft werden! \begin{bAntwort} \begin{minted}{sql} SELECT Bezeichnung, Verkaufspreis FROM Artikel WHERE ArtNr in ( SELECT ArtNr FROM Bestand WHERE Abteilungsname = 'Textilien' ); \end{minted} \end{bAntwort} %% % Punkt 3 %% \item Welche Produkte (Angabe der Bezeichnung) werden im Erdgeschoss verkauft? \begin{bAntwort} \begin{minted}{sql} SELECT DISTINCT Bezeichnung FROM Artikel WHERE ArtNr in ( SELECT ArtNr FROM Bestand WHERE Abteilungsname IN ( SELECT Abteilungsname FROM Abteilung WHERE Stockwerk = 'EG' ) ); \end{minted} \end{bAntwort} %% % Punkt 4 %% \item Gib die Namen aller Abteilungsleiter aus, in deren Abteilungen von jedem Artikel weniger als 100 Exemplare vorrätig sind! \begin{bAntwort} \begin{minted}{sql} SELECT DISTINCT Abteilungsleiter FROM Abteilung WHERE NOT EXISTS ( SELECT * FROM Bestand WHERE (Abteilung.Abteilungsname = Bestand.Abteilungsname) AND Vorrat >= 100 ); \end{minted} \end{bAntwort} \end{itemize} %% % (c) %% \item Lösen Sie die Aufgabe 1b) Punkt 1 ohne Verwendung einer geschachtelten SQL Anfrage! (Gib die Bezeichnungen und die Artikelnummern aller Artikel aus, die nicht mehr als der Artikel mit der Artikelnummer 1401 kosten!) \begin{bAntwort} \begin{minted}{sql} SELECT a.Bezeichnung, a.ArtNr as Artikelnummer FROM Artikel a, Artikel b WHERE a.Verkaufspreis <= b.Verkaufspreis AND b.ArtNr = 1401; \end{minted} \end{bAntwort} %% % (d) %% \item Formulieren Sie nachfolgende Anfragen mit Mengenoperatoren! \begin{itemize} %% % Punkt 1 %% \item Gibt es registrierte Artikel, die noch nicht im Bestand aufgeführt sind? \begin{bAntwort} \begin{minted}{sql} SELECT ArtNr FROM Artikel EXCEPT SELECT ArtNr FROM Bestand; \end{minted} \end{bAntwort} %% % Punkt 2 %% \item Welche Artikel (Artikelnummer) sind registriert und bereits im Bestand aufgeführt? \begin{bAntwort} \begin{minted}{sql} SELECT ArtNr FROM Artikel INTERSECT SELECT ArtNr FROM Bestand; \end{minted} \end{bAntwort} %% % Punkt 3 %% \item Welche Artikel (Bezeichnung und Artikelnummer) sind bereits registriert und im Bestand aufgeführt? \begin{bAntwort} \begin{minted}{sql} SELECT Bezeichnung, ArtNr FROM Artikel WHERE ArtNr IN ( SELECT ArtNr FROM Artikel INTERSECT SELECT ArtNr FROM Bestand ); \end{minted} \end{bAntwort} \end{itemize} %% % (d) %% \item Formulieren Sie folgende Anfragen in SQL: \begin{itemize} %% % Punkt 1 %% \item Welche Artikel mit dem Anfangsbuchstaben “S” gibt es? \begin{bAntwort} \begin{minted}{sql} SELECT Bezeichnung FROM Artikel WHERE Bezeichnung LIKE 'S%'; \end{minted} \end{bAntwort} %% % Punkt 2 %% \item Welche Artikel haben an der 3. Stelle ein “i”? \begin{bAntwort} \begin{minted}{sql} SELECT Bezeichnung FROM Artikel WHERE Bezeichnung LIKE '__i%'; \end{minted} \end{bAntwort} %% % Punkt 3 %% \item Heißt der Artikel “Zwieback” oder “Zweiback”? \begin{bAntwort} \begin{minted}{sql} SELECT Bezeichnung FROM Artikel WHERE Bezeichnung LIKE 'Zw__back'; \end{minted} \end{bAntwort} \end{itemize} \end{enumerate} %----------------------------------------------------------------------- % %----------------------------------------------------------------------- \bPseudoUeberschrift{Teilaufgabe 4 \index{SQL} \footcite[noch mal Kaufhaus..., Aufgabe 2]{db:ab:7}} \begin{enumerate} %% % (a) %% \item 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. \begin{bAntwort} \begin{minted}{sql} SELECT ArtNr, Abteilungsname FROM Bestand ORDER BY ArtNr DESC, Abteilungsname; \end{minted} \end{bAntwort} %% % (b) %% \item Wie viele verschiedene Waren werden in der Lebensmittelabteilung verkauft? \begin{bAntwort} \begin{minted}{sql} SELECT COUNT(*) FROM Bestand WHERE Abteilungsname = 'Lebensmittel'; \end{minted} \end{bAntwort} %% % (c) %% \item Wie viele verschiedene Waren werden in den einzelnen Abteilungen verkauft? \begin{bAntwort} \begin{minted}{sql} SELECT Abteilungsname, COUNT(*) FROM Bestand GROUP BY Abteilungsname; \end{minted} \end{bAntwort} %% % (d) %% \item Wie viel kostet der billigste, wie viel der teuerste Artikel? \begin{bAntwort} \begin{minted}{sql} SELECT MIN(Verkaufspreis), MAX(Verkaufspreis) FROM Artikel; \end{minted} \end{bAntwort} %% % (e) %% \item Gib die Namen aller Abteilungen aus, deren Gesamtvorrat an Artikel kleiner als 100 ist! \begin{bAntwort} \begin{minted}{sql} SELECT Abteilungsname FROM Bestand GROUP BY Abteilungsname HAVING COUNT(Vorrat) < 100; \end{minted} \end{bAntwort} %% % (f) %% \item Gesucht sind Bezeichnung und Verkaufspreis aller in der Datenbank gespeicherten Artikel. Die Ausgabe soll alphabetisch aufgelistet werden. Bei gleicher Bezeichnung sollen die teureren Artikel zuerst aufgelistet werden. \begin{bAntwort} \begin{minted}{sql} SELECT Bezeichnung, Verkaufspreis FROM Artikel ORDER BY Bezeichnung, Verkaufspreis DESC; \end{minted} \end{bAntwort} %% % (g) %% \item Gib für alle Artikel, von denen (unabhängig von der Abteilung) noch mindestens 130 Exemplare vorrätig sind, die Artikelnummer und den aktuellen Vorrat aus! \begin{bAntwort} \begin{minted}{sql} SELECT ArtNr, SUM(Vorrat) FROM Bestand GROUP BY ArtNr HAVING SUM(Vorrat) >= 130; \end{minted} \end{bAntwort} \end{enumerate} %----------------------------------------------------------------------- % %----------------------------------------------------------------------- \bPseudoUeberschrift{Teilaufgabe 5 \footcite[Aufgabe 3: Kaufhaus zum letzten Mal!]{db:ab:7}} \begin{enumerate} %% % (a) %% \item Sicht \verb|view1|: Gesucht sind alle Informationen zu Artikeln, an denen das Kaufhaus mehr als 35\% verdient. \begin{bAntwort} \begin{minted}{sql} CREATE VIEW view1 AS SELECT * FROM Artikel WHERE Verkaufspreis > 1.35 * Einkaufspreis; \end{minted} \end{bAntwort} %% % (b) %% \item Sicht \verb|view2|: Gesucht sind alle Informationen zu Artikeln, an denen das Kaufhaus mehr als 35\% verdient und die für höchstens 50 € verkauft werden. \begin{bAntwort} \begin{minted}{sql} CREATE VIEW view2 AS SELECT * FROM view1 WHERE Verkaufspreis <= 50; \end{minted} \end{bAntwort} \end{enumerate} \end{document}