Aufgabe 3 - SQL-Abfragen · Abitur NRW Informatik LK · Haupttermin 2023

Thema: SQL-Abfragen · Aus der Prüfung LK · Haupttermin (2023)

Aufgabenstellung

Aufgabenstellung

Ein Informatikprojektkurs plant, einige Bahnlinien in einer Datenbank zu modellieren. In einer ersten Version sollen unter anderem die Bahnhöfe sowie die Streckenabschnitte abgelegt werden.

Ein Streckenabschnitt ist eine direkte Verbindung von dem einen Bahnhof zu dem anderen Bahnhof ohne Zwischenhalt. Aus Sicherheitsgründen kann ein Streckenabschnitt nur in einer Richtung und somit nicht für die Gegenrichtung genutzt werden.

Eine Bahnlinie besteht aus Streckenabschnitten, die die Folge der Bahnhöfe auf dieser Bahnlinie beschreiben. Dabei wird für jeden zugehörigen Streckenabschnitt die Fahrzeit in Minuten angegeben.

Für die Datenverwaltung will der Projektkurs eine relationale Datenbank erstellen, die auf der folgenden Teilmodellierung beruht:

Die weiteren Aufgaben beziehen sich auf das Datenbankschema aus Abbildung 3, das nur einen Teil der gesamten Datenbank wiedergibt. Beispieldaten zu diesem Schema stehen im Anhang.

Anlage: Ausschnitt aus den Beispieldaten zum Datenbankschema

Bahnhof

Name · barrierefrei

Glücksdorf · 1

Oberdorf · 0

Medeburg · 1

Zweierwalde · 1

Hintertupfingen · 1

Bahnlinie

ID · Name

L1 · Bergexpress

L2 · Burglinie

L3 · Hintertupfingenlinie

L4 · Glücksdorfexpress

Streckenabschnitt

ID · vonBahnhofName · zuBahnhofname

1 · Glücksdorf · Oberdorf

2 · Oberdorf · Medeburg

3 · Medeburg · Hintertupfingen

4 · Medeburg · Zweierwalde

5 · Zweierwalde · Hintertupfingen

6 · Hintertupfingen · Glücksdorf

gehoertZu

StreckenabschnittID · BahnlinieID · Abschnittsnummer · Fahrzeit

1 · L1 · 1 · 30

2 · L1 · 2 · 20

3 · L1 · 3 · 90

1 · L2 · 1 · 40

2 · L2 · 2 · 50

4 · L2 · 3 · 30

5 · L3 · 1 · 50

6 · L4 · 1 · 90

Anhang: Dokumentationen der verwendeten Klassen

Die Klasse Bahnlinientest

Ein Objekt der Klasse wird genutzt, um die Datenbankverbindung und die Datenbankabfragen zu testen.

Bahnlinientest()

Ein Objekt vom Typ DatabaseConnector wird initialisiert und stellt die Datenbankverbindung her.

List<String> ermittleEtwas(String pBName, int pHops)

Diese Methode ist Bestandteil der Teilaufgabe d.

Darüber hinaus verfügt die Klasse über folgende private Methode:

List<String> ermittleNachbarbahnhoefe(String pBName)

Die Methode liefert eine Liste mit den Namen der Nachbarbahnhöfe für den im Parameter übergebenen Bahnhof pBName zurück.

Nachbarbahnhöfe sind die Bahnhöfe, zu denen ein Streckenabschnitt ohne Zwischenhalt von diesem Bahnhof pBName führt.

Falls der Bahnhofsname pBName nicht existiert, wird eine leere Liste zurückgeliefert.

Die Klasse DatabaseConnector

Ein Objekt der Klasse DatabaseConnector ermöglicht die Abfrage und Manipulation einer MySQL-Datenbank.

Beim Erzeugen des Objekts wird eine Datenbankverbindung aufgebaut, sodass anschließend SQL-Anweisungen an diese Datenbank gerichtet werden können.

DatabaseConnector(String pIP, String pPort, String pDatabase, String pUsername, String pPassword)

Ein Objekt vom Typ DatabaseConnector wird erstellt, und eine Verbindung zur Datenbank wird aufgebaut. Mit den Parametern pIP und pPort werden die IP-Adresse und die Port-Nummer übergeben, unter denen die Datenbank mit Namen pDatabase zu erreichen ist. Mit den Parametern pUsername und pPassword werden Benutzername und Passwort für die Datenbank übergeben.

void executeStatement(String pSQLStatement)

Der Auftrag schickt den im Parameter pSQLStatement enthaltenen SQL-Befehl an die Datenbank ab.

Handelt es sich bei pSQLStatement um einen SQL-Befehl, der eine Ergebnismenge liefert, so kann dieses Ergebnis anschließend mit der Methode getCurrentQueryResult abgerufen werden.

QueryResult getCurrentQueryResult()

Die Anfrage liefert das Ergebnis des letzten mit der Methode executeStatement an die Datenbank geschickten SQL-Befehls als Objekt vom Typ QueryResult zurück.

Wurde bisher kein SQL-Befehl abgeschickt oder ergab der letzte Aufruf von executeStatement keine Ergebnismenge (z. B. bei einem INSERT-Befehl oder einem Syntaxfehler), so wird null geliefert.

String getErrorMessage()

Die Anfrage liefert null oder eine Fehlermeldung, die sich jeweils auf die letzte zuvor ausgeführte Datenbankoperation bezieht.

void close()

Die Datenbankverbindung wird geschlossen.

Die Klasse QueryResult

Ein Objekt der Klasse QueryResult stellt die Ergebnistabelle einer Datenbankanfrage mit Hilfe der Klasse DatabaseConnector dar. Objekte dieser Klasse werden nur von der Klasse DatabaseConnector erstellt. Die Klasse verfügt über keinen öffentlichen Konstruktor.

String[][] getData()

Die Anfrage liefert die Einträge der Ergebnistabelle als zweidimensionales Feld vom Typ String. Der erste Index des Feldes stellt die Zeile und der zweite die Spalte dar (d. h. String[zeile][spalte]).

String[] getColumnNames()

Die Anfrage liefert die Bezeichner der Spalten der Ergebnistabelle als Feld vom Typ String zurück.

String[] getColumnTypes()

Die Anfrage liefert die Typenbezeichnung der Spalten der Ergebnistabelle als Feld vom Typ String zurück. Die Bezeichnungen entsprechen den Angaben in der MySQL-Datenbank.

int getRowCount()

Die Anfrage liefert die Anzahl der Zeilen der Ergebnistabelle als int.

int getColumnCount()

Die Anfrage liefert die Anzahl der Spalten der Ergebnistabelle als int.

Teilaufgabe b

Aus der Datenbank sollen die nachstehenden Informationen abgerufen werden:

i.

Zu ermitteln sind für jede Bahnlinie ihr Name sowie ihre jeweilige Gesamtfahrzeit. [3 Punkte]

ii.

Zu ermitteln sind alle Streckenabschnitte, die die maximale Fahrzeit aufweisen. Zu jedem dieser Abschnitte sollen die ID der Bahnlinie, der Name des „von-Bahnhofs“, der Name des „zu-Bahnhofs“ und die Fahrzeit des Abschnitts ausgegeben werden. [5 Punkte]

Teilaufgabe c

Gegeben ist die folgende SQL-Anweisung:

1 SELECT G1.BahnlinieID, S.zuBahnhofName

2 FROM (

3 SELECT BahnlinieID,

4 MAX(Abschnittsnummer) AS max

5 FROM gehoertZu

6 GROUP BY BahnlinieID

7) AS G1

8 INNER JOIN gehoertZu AS G2

9 ON G1.max = G2.Abschnittsnummer AND

10 G1.BahnlinieID = G2.BahnlinieID

11 INNER JOIN Streckenabschnitt AS S

12 ON G2.StreckenabschnittID = S.ID

Analysieren und erläutern Sie die Unterabfrage in den Zeilen 3 – 6. [3 Punkte]

Analysieren und erläutern Sie die vollständige SQL-Anweisung. [4 Punkte]

Erläutern Sie im Sachzusammenhang, welche Information mit der vollständigen SQL-Anweisung bestimmt wird. [3 Punkte]

Aufgabenstellung: Aufgabe 3 - SQL-Abfragen · Abitur NRW Informatik LK · Haupttermin 2023

Lösung

Nach den offiziellen Korrekturhinweisen

b) i. Zu ermitteln sind für jede Bahnlinie ihr Name sowie ihre jeweilige Gesamtfahrzeit.

Lösung: ```sql SELECT Bahnlinie.Name, SUM(gehoertZu.Fahrzeit) FROM Bahnlinie INNER JOIN gehoertZu ON Bahnlinie.ID = gehoertZu.BahnlinieID GROUP BY Bahnlinie.ID ```

b) ii. Zu ermitteln sind alle Streckenabschnitte, die die maximale Fahrzeit aufweisen (BahnlinieID, vonBahnhofName, zuBahnhofname, Fahrzeit).

Lösung: ```sql SELECT gehoertZu.BahnlinieID, Streckenabschnitt.vonBahnhofName, Streckenabschnitt.zuBahnhofname, gehoertZu.Fahrzeit FROM Streckenabschnitt INNER JOIN gehoertZu ON gehoertZu.StreckenabschnittID = Streckenabschnitt.ID WHERE Fahrzeit = ( SELECT MAX(gehoertZu.Fahrzeit) FROM gehoertZu ) ```

c) Analysieren und erläutern Sie die Unterabfrage in den Zeilen 3 – 6.

Lösung: In der Unterabfrage wird für jede Bahnlinie (vgl. Zeile 6) die größte Abschnittsnummer (vgl. Zeile 4) der zugehörigen Streckenabschnitte bestimmt.

c) Analysieren und erläutern Sie die vollständige SQL-Anweisung.

Lösung: In Zeile 1 findet die Projektion auf die BahnlinieID, welche man aus der Unterabfrage erhält, und den zuBahnhofName statt. Die Ergebnistabelle der Unterabfrage wird erneut mit der Tabelle gehoertZu über einen Innerjoin verknüpft (vgl. Zeilen 8 – 10). Die Verknüpfung findet über die BahnlinieID und die Abschnittsnummer statt, die der in der Unterabfrage ermittelten größten Abschnittsnummer eines Streckenabschnitts entspricht. In den Zeilen 11 – 12 findet eine weitere Verknüpfung zur Tabelle Streckenabschnitt mit einem Innerjoin statt. Die Verknüpfung erfolgt über die StreckenabschnittID.

c) Erläutern Sie im Sachzusammenhang, welche Information mit der vollständigen SQL-Anweisung bestimmt wird.

Lösung: Im Sachzusammenhang wird für jede Bahnlinie der Zielbahnhof ermittelt.

Die ausführliche Erklärung Schritt für Schritt (mit KI) gibt es mit Premium. Premium

Löse sie direkt hier: automatische Korrektur, Hinweise und Lösung Schritt für Schritt.

‹ Aufgabe 3 - SQL-Abfragen und Auswertung in Java · GK · Nachtermin 2023 · Aufgabe 3 - SQL-Abfragen · LK · Haupttermin · Weiterbildungskolleg 2023 ›

Mehr Aufgaben zu SQL-Abfragen