SQL-Übungsaufgaben (zur “Let’s Meet”-Datenbank)
https://oer-informatik.de/lets_meet-beispielloesung_uebungsaufgaben
https://bildung.social/@oerinformatik/110378362964551953
tl/dr; Übungsaufgaben zu SQL-DDL- und DML-Befehlen am Beispiel der “Let’s Meet”-Datenbank. Da deren Daten als SQL-Importskript vorliegen, können die Aufgaben auch unmittelbar im DBMS ausprobiert werden… (Zuletzt geändert am 13.06.2023)
Ausgangslage
Ausgangsbasis der folgenden Aufgaben ist die Datenbank einer Dating/Meeting-App, die anhand des folgenden Relationenmodells erstellt wurde. Es sollen bei den Lösungen die hier abgedruckten Namen verwendet werden:

Die Fragen basieren auf der Datenbank aus der “Let’s Meet” Datenbank-Lernsituation, können aber auch ohne Hintergrundinfos nur mit obigem Relationenmodell bearbeitet werden.
Wer die Abfragen mit einer gefüllten Datenbank ausprobieren will, der kann die folgenden SQL-Skripte importieren. Es müssen alle drei SQL-Skripte der Reihe nach ausgeführt werden.
Für Hintergrundwissen lohnt sich ein Blick in die anderen Beiträge, in denen die Datenbank modelliert (Teil 1), importiert (Teil 2) und im Bestand normalisiert (Teil 3) wird.
Aufgaben
Erstellen der Tabelle tblHobby2User
- Erstelle den SQL-Befehl, mit dem die Tabelle
tblHobby2User
wie oben angegeben erzeugt werden kann. Die IDs sind intblHobby
undtblUser
als fortlaufende Nummern realisiert. Die Priorität soll als Gleitkommazahl umgesetzt werden. Es muss keine Lösch- und Änderungsweitergabe berücksichtigt werden.
CREATE TABLE tblHobby2User ( /* 1P */
user_id INTEGER, /* 0,5P */
hobby_id INTEGER, /* 0,5P */
priority DOUBLE, /* 1P */
PRIMARY KEY (hobby_id, user_id), /* 1P */
FOREIGN KEY (hobby_id) REFERENCES letsMeetMigrationScheme.tblHobby(hobby_id), /*1P*/
FOREIGN KEY (user_id) REFERENCES letsMeetMigrationScheme.tblUser(user_id) /*1P*/
);
Bewertung 6 Punkte: CREATE
1P / Datentypen 2P / PK 2P / FK 1P
- Welche Anpassung muss am Befehl aus Aufgabe a) vorgenommen werden, wenn das Feld
priority
eingabepflichtig sein soll? (Wenn es oben bereits eingabepflichtig umgesetzt wurde: welcher Bestandteil des SQL-Befehls ist dafür verantwortlich?)
Ausgabe von Userdaten
In der Tabelle tblUser
sind beispielhaft folgende Daten enthalten (Auszug).
user_id | firstname | lastname | telephone | street | street_no |
---|---|---|---|---|---|
708 | Gheorghe | Florentina | 05222 / 92995 | Kirchstraße | 50 |
719 | Edith | Vehlow | 0611 / 17692 | Uhlandstr. | 67 |
720 | Stefan | Hubert | (030) 4108976 | Am Vogelanger | 21 |
736 | Marcus | Göllnitz | (02702) 78293 | Rembrandtstr. | 37 b |
739 | Szymański | Dariusz | 06897 / 55039 | Markt | 27 |
746 | Sabine | Hubert | 07752 / 41061 | Jarmener Str. | 49 |
- Nenne den SQL-Befehl, mit dem nur die Vornamen aller User ausgegeben werden, die mit Nachnamen “Hubert” heißen. Die Ausgabe soll nach der
user_id
absteigend sortiert sein.
SELECT firstname /* 1P */
FROM letsmeetmigrationscheme.tblUser /* 1P */
WHERE lastname LIKE 'Hubert' /* 2P */
ORDER BY user_id DESC /* 1P */
Bewertung: 5 Punkte
- Die Telefonnummern sind auf zweierlei Art erfasst: “030 / 12345” und “(030) 12345”. Erstelle einen SQL-Befehl, mit dem alle Daten von Datensätzen ausgegeben werden, deren Telefonnummern in der Schreibweise mit Schrägstrich erfasst sind! Die Ausgabe soll nach Telefonnummern aufsteigend sortiert sein.
SELECT * /* 1P */
FROM letsmeetmigrationscheme.tblUser /* 1P */
WHERE telephone LIKE '%/%'/* 2P */
ORDER BY telephone ASC; /* 2P */
Bewertung: 5 Punkte
Auswertung der Alterstruktur
- Es soll für jede Stadt ermittelt werden, an welchem Datum der jüngste und der älteste User (m/w/nb) geboren wurde. Die Ausgabe soll wie folgt aussehen (Sortierung egal):
Stadt | Ältester | Jüngster |
---|---|---|
Hamburg | 1958-04-05 | 2002-04-24 |
Lübeck | 1958-01-24 | 2001-09-30 |
Berlin | 1959-04-14 | 2002-12-05 |
Kiel | 1958-05-29 | 2001-12-26 |
Dortmund | 1959-03-24 | 2002-08-27 |
Essen | 1959-07-26 | 2002-08-13 |
- Mithilfe der Funktion
extract(year from age(birthday))
kann beispielsweise in PostgreSQL das Alter eines Users in Jahren (als Zahl) ausgegeben werden:
Erstelle mithilfe dieses Befehls eine Abfrage, die alle Städte auflistet, in denen mehr als 10 User leben, die 50 Jahre oder älter sind. Es soll die Stadt und die Anzahl der mindestens 50-jährigen wie folgt dargestellt werden, Sortierung egal:
Stadt | Anzahl |
---|---|
Berlin | 24 |
Hamburg | 18 |
SELECT city AS "Stadt", COUNT(*) AS "Anzahl" /* 4P */
FROM letsmeetmigrationscheme.tblUser /* 1P */
WHERE extract(year FROM age(birthday)) >=50 /* 2P */
GROUP BY city /* 1P */
HAVING COUNT(*) > 10; /* 2P */
Bewertung gesamt: 10 Punkte
Einfügen neuer Nutzer
In die Datenbank soll ein neuer Nutzer aufgenommen werden. Erstelle alle Abfragen, die nötig sind, um die angezeigten Daten zu speichern. Sofern Du nicht mit Subqueries arbeitest und zum Einfügen IDs aus anderen Tabellen benötigst, erstelle die Abfragen, mit denen Du diese IDs auslesen kannst und nenne fiktive Ergebnisse zum Weiterarbeiten. Es kann davon ausgegangen werden, dass es nur eine Userin “Martina Mustermann” und einen “Peter Meyer” gibt und dass das Hobby “Tanzen” bereits in der Datenbank unter diesem Namen angelegt ist.
firstname | lastname | postcode | city | Hobby | Hobby Prio | befreundet mit |
---|---|---|---|---|---|---|
Peter | Meyer | 31319 | Sehnde | Tanzen | 100 | Martina Mustermann |
/*ERSTE TABELLE 3P*/
INSERT INTO tblUser /*1P*/
(user_id, firstname, lastname, postcode , city) /*1P*/
VALUES (DEFAULT, 'Peter', 'Meyer', '31319', 'Sehnde'); /*1P*/
/*9P = ZWEITE TABELLE 3P, 2x SUBQUERY 3P*/
INSERT INTO tblHobby2User /*1P*/
(user_id, hobby_id, priority) /*1P*/
VALUES (
(SELECT user_id FROM tblUser WHERE firstname LIKE 'Peter%' AND lastname LIKE 'Meyer%'), /*2P*/
(SELECT hobby_id FROM tblHobby WHERE hobbyname like 'Tanzen%'), /*4P*/
100); /*1P*/
/*7P = DRITTE TABELLE 3P, 2x SUBQUERY 2P*/
INSERT INTOo tblFriendship/*1P*/
(user_id, friend_user_id) /*1P*/
VALUES (
(SELECT user_id FROM tblUser WHERE firstname LIKE 'Peter%' AND lastname LIKE 'Meyer%'), /*2P*/
(SELECT user_id FROM tblUser WHERE firstname LIKE 'Martina%' AND lastname LIKE 'Mustermann%') /*2P*/
) /*1P*/;
Bewertung 19 Punkte
Analyse Profilbilder und Freundschaften
- Es sollen alle Nutzer per E-Mail angeschrieben werden, die über kein Profilbild (
tblProfilePicture
) verfügen. Hierzu soll eine Abfrage erstellt werden, die alle in der Datenbank befindlichen Adressen ausgibt, für die kein Profilbild hinterlegt ist.
- Ausgegeben werden sollen alle Einträge der
tblUser
und deren zugehörige Freunde (übertblFriendship
) wie unten angegeben, Sortierung egal.
Vorname1 | Nachname1 | Vorname2 | Nachname2 |
---|---|---|---|
Peter | Meyer | Martina | Mustermann |
Peter | Meyer | Helmut | Meyerhof |
Kay | Fabian | NULL | NULL |
Marco | Kriener | Cetin | Hamide |
Marco | Kriener | Sybille | Dropmann |
Anpassungen in der Datenbank
- Der “Gerhard-Schröder-Platz” in München wurde umbenannt und heißt jetzt “Angela-Merkel-Forum”. Passe die betreffenden Adressen in
tblUser
entsprechend an!
|
- Die Priorisierung in
tblHobby2User
wurde bislang mit Zahlen von 0-100 umgesetzt. Um eine größere Bandbreite abzudecken sollen alle Werte jetzt um den Faktor 10 erhöht werden (zukünftig also zwischen 0 und 1000 sein). Erstelle eine Abfrage, um den Bestand anzupassen!
Links und weitere Informationen
Hinweis zur Nachnutzung als Open Educational Resource (OER)
Dieser Artikel und seine Texte, Bilder, Grafiken, Code und sonstiger Inhalt sind - sofern nicht anders angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: “SQL-Übungsaufgaben (zur "Let’s Meet"-Datenbank)” von oer-informatik.de (H. Stein), Lizenz: CC BY 4.0. Der Artikel wurde unter https://oer-informatik.de/lets_meet-beispielloesung_uebungsaufgaben veröffentlicht, die Quelltexte sind in weiterverarbeitbarer Form verfügbar im Repository unter https://gitlab.com/oer-informatik/db-sql/lets-meet-db. Stand: 13.06.2023.
[Kommentare zum Artikel lesen, schreiben] / [Artikel teilen] / [gitlab-Issue zum Artikel schreiben]