\documentclass{bschlangaul-aufgabe} \bLadePakete{syntax} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 1: SQL Einstieg}, Thematik = {Bands}, Referenz = DB.Relationale-Anfragesprachen.SQL.Bands, RelativerPfad = Module/10_DB/40_Relationale-Anfragesprachen/10_SQL/Aufgabe_Bands.tex, ZitatSchluessel = db:pu:2, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {SQL, SQL mit Übungsdatenbank}, } Gegeben ist folgende Datenbank:\index{SQL} \footcite{db:pu:2} \bigskip { \ttfamily \noindent Album (Titel, Typ, Firma, Preis, \underline{ANr})\\ \noindent herausgegeben (\underline{BName}, \underline{ANr}, Jahr)\\ \noindent Band (\underline{BName}, Musikrichtung, Gruendungsjahr, Aktiv)\\ \noindent Musiker (Vorname, Name, GebJahr, BName, \underline{ID})\\ } % Datenbankname: Bands \begin{minted}{sql} CREATE TABLE Album ( ANr integer PRIMARY KEY, Titel VARCHAR(20) NOT NULL, Typ VARCHAR(20), Firma VARCHAR(20), Preis decimal(5,0) ); CREATE TABLE Band ( BName VARCHAR(20) PRIMARY KEY, Musikrichtung VARCHAR(20), Gruendungsjahr integer, Aktiv smallint ); CREATE TABLE herausgegeben ( ANr integer REFERENCES Album(ANr), BName VARCHAR(20) REFERENCES Band(BName), Jahr integer, PRIMARY KEY (ANr, BName) ); CREATE TABLE Musiker ( ID integer PRIMARY KEY, Vorname VARCHAR(20), Name VARCHAR(20), GebJahr integer, BName VARCHAR(20) REFERENCES Band(BName) ); INSERT INTO Album (ANr, Titel, Typ, Firma, Preis) VALUES (1, 'Sin after sin', NULL, 'CBS', '16'), (2, 'Highway to hell', NULL, 'Atlantic Records', '20'), (3, 'Metallica', NULL, 'Electra Records', '17'), (4, 'Paranoid', NULL, 'Vertigo Records', '15'), (5, 'High Hopes', NULL, 'Col', '14'), (6, 'Tyr', NULL, 'I.R.S. Records', '9'); INSERT INTO Band (BName, Musikrichtung, Gruendungsjahr, Aktiv) VALUES ('ACDC', 'Hardrock', 1973, 1), ('Black Sabbath', 'Hardrock', 1969, 0), ('Bruce Springsteen', 'Rock', 1971, 1), ('Judas Priest', 'Heavy Metal', 1969, 1), ('Lynyrd Skynyrd', 'Southern Rock', 1964, 1), ('Metallica', 'Heavy Metal', 1981, 1); INSERT INTO herausgegeben (ANr, BName, Jahr) VALUES (1, 'Judas Priest', 1977), (2, 'ACDC', 1979), (3, 'Metallica', 1999), (4, 'Black Sabbath', 1970), (6, 'Black Sabbath', 1990); INSERT INTO Musiker (ID, Vorname, Name, GebJahr, BName) VALUES (1, 'Ozzy', 'Osbourne', 1948, 'Black Sabbath'), (2, 'Bruce', 'Springsteen', 1949, 'Bruce Springsteen'), (3, 'Matt', 'Chamberlain', 1967, 'Bruce Springsteen'), (4, 'Angus', 'Young', 1955, 'ACDC'), (5, 'Kirk', 'Hammett', 1962, 'Metallica'), (6, 'Malcom', 'Young', 1953, 'ACDC'), (7, 'Robert', 'Trujillo', 1964, 'Metallica'); \end{minted} \index{SQL mit Übungsdatenbank} \noindent Beantworten Sie folgende Fragen durch geeignete SQL-Anfragen. \begin{enumerate} %% % (a) %% \item Welche Alben wurden von der Firma „Col“ herausgegeben? \begin{bAntwort} \begin{minted}{sql} SELECT a.Titel FROM Album a WHERE a.Firma = 'Col'; \end{minted} \end{bAntwort} %% % (b) %% \item Welche Alben wurden 1990 von \emph{„Black Sabbath“} veröffentlicht? \begin{bAntwort} \begin{minted}{sql} SELECT a.Titel FROM ALBUM a, herausgegeben h WHERE a.ANr = h.ANr AND h.BName = 'Black Sabbath' AND h.Jahr = 1990; \end{minted} \end{bAntwort} %% % (c) %% \item Welche Band veröffentlichte das Album \emph{„Sin After Sin“}? \begin{bAntwort} \begin{minted}{sql} SELECT h.BName FROM herausgegeben h, Album a WHERE a.ANr = h.ANr AND a.Titel = 'Sin After Sin'; \end{minted} \end{bAntwort} %% % (d) %% \item In welcher Band spielt „Ozzy Osbourne“? \begin{bAntwort} \begin{minted}{sql} SELECT BName FROM Musiker WHERE Name = 'Osbourne' AND Vorname = 'Ozzy'; \end{minted} \end{bAntwort} %% % (e) %% \item Welche Bands wurden vor \emph{1980} gegründet, spielen \emph{Hardrock} und sind nicht bei \emph{Col} unter Vertrag? \begin{bAntwort} Joins sind teuer: zuerst Bedingungen \begin{minted}{sql} SELECT DISTINCT b.BName FROM Band b, herausgegeben h, Album a WHERE b.Musikrichtung = 'Hardrock' AND a.Firma != 'Col' AND b.Gruendungsjahr < 1980 AND b.BName = h.BName AND h.ANr = a.ANr; \end{minted} \end{bAntwort} %% % (f) %% \item Wie viele Alben mit einem Preis von unter 10€ sind gelistet? \begin{bAntwort} Nicht \verb|COUNT(a.Titel)|: doppelte werden nur 1 mal gezählt \begin{minted}{sql} SELECT COUNT(*) AS Anzahl FROM Album a WHERE a.Preis < 10; \end{minted} \end{bAntwort} %% % (g) %% \item Welche Musiker spielen in einer Hardrock Band (alphabetisch nach Name)? \begin{bAntwort} \verb|DISTINCT|: keine Duplicate. \verb|DISTINCT| ist \verb|GROUP BY| vorzuziehen \begin{minted}{sql} SELECT DISTINCT m.Name, m.Vorname FROM Musiker m, Band b WHERE m.BName = b.BName AND b.Musikrichtung = 'Hardrock' ORDER BY m.Name, m.Vorname; \end{minted} \end{bAntwort} %% % (h) %% \item Wie viele Alben hat jede Band veröffentlicht (Bandname, Anzahl der Alben)? \begin{bAntwort} \begin{minted}{sql} SELECT BName, COUNT(*) AS AnzahlAlben FROM herausgegeben GROUP by BName; \end{minted} \end{bAntwort} %% % (i) %% \item Gib alle verschiedenen \emph{Namen} der \emph{Musiker} aufsteigend sortiert aus, die in \emph{aktiven} Bands spielen. \begin{bAntwort} \begin{minted}{sql} SELECT DISTINCT m.Name, m.Vorname FROM Band b, Musiker m WHERE b.BName = m.BName AND b.aktiv = 1 ORDER By m.Name, m.Vorname ASC; \end{minted} \end{bAntwort} %% % (j) %% \item Welche Musiker spielen in einer Band, die keine Alben vor \emph{1970} veröffentlicht hat? \begin{bAntwort} \begin{minted}{sql} SELECT DISTINCT m.Name FROM Musiker m WHERE m.BName NOT IN (SELECT BName FROM herausgegeben WHERE Jahr < 1970); \end{minted} \end{bAntwort} %% % k) %% \item Welche \emph{Musiker} spielen in einer Band, in der es mindestens ein \emph{jüngeres} Bandmitglied gibt? \begin{bAntwort} \begin{minted}{sql} SELECT DISTINCT a.Vorname, a.Name FROM Musiker a, Musiker b WHERE a.BName = b.BName AND a.GebJahr < b.GebJahr; \end{minted} \end{bAntwort} \end{enumerate} \end{document}