Aufgabe 3 - SQL-Abfragen und Auswertung in Java · Abitur NRW Informatik GK · Nachtermin 2023

Thema: SQL-Abfragen · Aus der Prüfung GK · Nachtermin (2023)

Aufgabenstellung

Aufgabenstellung: App zur Verwaltung von E-Auto-Ladesäulen

Fahrzeuge mit Verbrennungsmotor setzen CO2\text{CO}_2 frei, das wesentlich zum Klimawandel beiträgt. Aus diesem Grund strebt Deutschland an, den Verkehr auf Fahrzeuge mit Elektroantrieb (E-Autos) umzustellen. Hierfür entstehen bundesweit an zahlreichen Standorten Ladesäulen, an denen E-Autos aufgeladen werden können.

Die Ladesäulen werden von unterschiedlichen Betreibergesellschaften betrieben. Wer unterwegs sein E-Auto laden möchte, muss sich dafür jeweils bei der Betreibergesellschaft der betreffenden Ladesäule registrieren.

Eine Firma stellt eine App bereit, mit der man E-Autos an Ladesäulen verschiedener Betreibergesellschaften laden kann. Dazu hinterlegt die Fahrerin oder der Fahrer eine Kreditkarte in der App und scannt vor dem Ladevorgang den QR-Code an der Ladesäule. Anschließend leitet die Firma die Bezahlung des Ladevorgangs an die zuständige Betreibergesellschaft weiter.

Die Daten der Firma liegen in einer relationalen Datenbank. Abbildung 1 zeigt eine Teilmodellierung.

Hinweis: Das Attribut Menge gibt die bei dem Ladevorgang übertragene Energiemenge in kWh an.

Das in Abbildung 2 angegebene Datenbankschema setzt die Teilmodellierung um und liegt den folgenden Aufgaben zugrunde. Beispieldaten zu diesem Schema finden sich im Anhang.

Anlage: Ausschnitt aus den Beispieldaten zum Datenbankschema aus Abbildung 2

Kunde ID · Name · Emailadresse · Kreditkartennummer

1 · Albert Anger · a@anger.de · 1234-5678-9000-4321

2 · Birte Bolweg · b@bolweg.de · 1212-3434-5656-7878

3 · Christa Ciunta · c@ciunta.de · 1111-2222-3333-4444

Betreiber Name · Adresse · Bank · Kontonummer

E-Werke Sauerland · Industrieweg 9, 59755 Arnsberg · Voltbank · 987654321

Pottpower · Werkstraße 3, 45219 Essen · Amperekasse · 232323232

Rheinstrom · An der Fabrik 7, 40597 Düsseldorf · Wattsparkasse · 123456789

Westfalenkraft · Gewerbegasse 8, 48143 Münster · Amperekasse · 100000001

Ladesaeule ID · BetreiberName · Standort · Steckertyp · maximaleLadeleistung

1 · Rheinstrom · Sonnenhang · Typ 2 · 22

2 · Pottpower · Sonnenhang · CCS · 150

3 · Westfalenkraft · Stausee · CCS · 300

4 · Pottpower · Windwinkel · CHAdeMO · 50

5 · Rheinstrom · Windwinkel · Typ 1 · 7

6 · Pottpower · Windwinkel · CCS · 150

7 · Rheinstrom · Windwinkel · CCS · 150

8 · Westfalenkraft · Grüner Strom · Typ 2 · 11

9 · Westfalenkraft · Grüner Strom · Typ 2 · 11

hatGeladen KundeID · LadesaeuleID · Zeitstempel · Menge

1 · 3 · 2023-03-21-14-27 · 35

1 · 2 · 2023-03-28-07-02 · 21

3 · 8 · 2023-03-30-22-54 · 47

1 · 6 · 2023-04-02-18-43 · 29

3 · 1 · 2023-04-06-09-00 · 38

Anhang: Dokumentationen der verwendeten Klassen

Die Klasse LadeApp

Ein Objekt der Klasse LadeApp stellt der Benutzerin bzw. dem Benutzer auf einem mobilen Endgerät die Funktionen des Ladesystems zur Verfügung.

LadeApp()

Ein Objekt der Klasse LadeApp wird initialisiert.

String liefereEtwas()

Diese Anfrage wird in Aufgabenteil e) analysiert.

Die Klasse DatabaseConnector

Ein Objekt der Klasse DatabaseConnector ermöglicht die Abfrage und Manipulation einer relationalen Datenbank. Beim Erzeugen des Objekts wird eine Datenbankverbindung aufgebaut, sodass anschließend SQL-Anweisungen an diese Datenbank gerichtet werden können.

DatabaseConnector(String pIP, int 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 mithilfe 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 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:

b) (i)

Ein Kunde benötigt eine Ladesäule mit dem Steckertyp CCS. Gesucht sind sämtliche Standorte, an denen mindestens eine Ladesäule mit einem Stecker des Typs CCS verfügbar ist. [3 Punkte]

b) (ii)

Aufgrund von Bauarbeiten am Standort Sonnenhang müssen die Betreibergesellschaften der dort aufgestellten Ladesäulen benachrichtigt werden. Hierfür wird eine Liste dieser Betreibergesellschaften mit Namen und Adressen benötigt, die alphabetisch aufsteigend nach dem Namen der Betreibergesellschaft geordnet ist. [5 Punkte]

Teilaufgabe c)

Gegeben ist die folgende SQL-Anweisung:

1 SELECT Kunde.Name, Kunde.Emailadresse, tmp.Lademenge

2 FROM (

3 SELECT hatGeladen.KundeID, SUM(Menge) AS Lademenge

4 FROM hatGeladen

5 INNER JOIN Ladesaeule

6 ON hatGeladen.LadesaeuleID = Ladesaeule.ID

7 WHERE Ladesaeule.BetreiberName = 'Pottpower'

8 GROUP BY hatGeladen.KundeID

9) AS tmp

10 INNER JOIN Kunde ON tmp.KundeID = Kunde.ID

11 WHERE tmp.Lademenge > 500 c) 1

Analysieren und erläutern Sie die Unterabfrage der Zeilen 3 bis 8. [4 Punkte]

c) 2

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

c) 3

Erläutern Sie im Sachzusammenhang, welche Information die vollständige SQL-Anweisung liefert. [3 Punkte]

Teilaufgabe e)

Abbildung 3 zeigt als Implementationsdiagramm einen Ausschnitt aus der Modellierung der App:

Eine neue Mitarbeiterin des Unternehmens findet eine nicht dokumentierte Methode liefereEtwas der Klasse LadeApp:

1 public String liefereEtwas() {

2 String ergebnis = "Kein Ergebnis";

3 String sql = "SELECT Standort, COUNT(*) "

4 + "FROM Ladesaeule "

5 + "GROUP BY Standort";

6

7 datenbank.executeStatement(sql);

8

9 QueryResult qr = datenbank.getCurrentQueryResult();

10 if (qr != null && qr.getRowCount() > 0) {

11 ergebnis = qr.getData()[0][0];

12 int max = Integer.parseInt(qr.getData()[0][1]);

13 for (int i = 1; i < qr.getRowCount(); i++) {

14 int akt = Integer.parseInt(qr.getData()[i][1]);

15 if (akt > max) {

16 ergebnis = qr.getData()[i][0];

17 max = akt;

18 }

19 }

20 }

21 return ergebnis;

22 } e) 1

Analysieren Sie die SQL-Anweisung der Zeilen 3 – 5 und geben Sie anhand der Beispieldaten in der Anlage deren Ergebnis an. [3 Punkte]

e) 2

Analysieren Sie die Methode liefereEtwas, erläutern Sie deren Funktionsweise und geben Sie anhand der Beispieldaten in der Anlage den Rückgabewert an. [3 Punkte]

e) 3

Beschreiben Sie im Sachzusammenhang, welchen Wert die Methode zurückliefert. [2 Punkte]

e) 4

Beurteilen Sie die Aussage der Mitarbeiterin, die Methode lasse sich auch ohne Schleife (wie in den Zeilen 13 – 19) realisieren. [4 Punkte]

Aufgabenstellung: Aufgabe 3 - SQL-Abfragen und Auswertung in Java · Abitur NRW Informatik GK · Nachtermin 2023

Lösung

Nach den offiziellen Korrekturhinweisen

b) (i) Ein Kunde benötigt eine Ladesäule mit dem Steckertyp CCS. Gesucht sind sämtliche Standorte, an denen mindestens eine Ladesäule mit einem Stecker des Typs CCS verfügbar ist.

Lösung: ```sql SELECT Standort FROM Ladesaeule WHERE Steckertyp = 'CCS' ``` ```sql SELECT DISTINCT Standort FROM Ladesaeule WHERE Steckertyp = 'CCS' ```

b) (ii) Aufgrund von Bauarbeiten am Standort Sonnenhang müssen die Betreibergesellschaften der dort aufgestellten Ladesäulen benachrichtigt werden. Hierfür wird eine Liste dieser Betreibergesellschaften mit Namen und Adressen benötigt, die alphabetisch aufsteigend nach dem Namen der Betreibergesellschaft geordnet ist.

Lösung: ```sql SELECT Betreiber.Name, Betreiber.Adresse FROM Ladesaeule INNER JOIN Betreiber ON Ladesaeule.BetreiberName = Betreiber.Name WHERE Ladesaeule.Standort = 'Sonnenhang' ORDER BY Betreiber.Name ASC ``` ```sql SELECT DISTINCT Betreiber.Name, Betreiber.Adresse FROM Betreiber JOIN Ladesaeule ON Betreiber.Name = Ladesaeule.BetreiberName WHERE Ladesaeule.Standort = 'Sonnenhang' ORDER BY Betreiber.Name ```

c) 1 Analysieren und erläutern Sie die Unterabfrage der Zeilen 3 bis 8.

Lösung: In der inneren SQL-Abfrage werden die Relationen hatGeladen und Ladesaeule über die ID der Ladesäulen mit einem INNER JOIN verknüpft. Durch die Bedingung in Zeile 7 werden die Datensätze zu Ladesäulen der Betreibergesellschaft Pottpower selektiert und durch die GROUP BY Anweisung in Zeile 8 nach dem Attribut KundeID gruppiert. Innerhalb der Gruppen werden die Lademengen der einzelnen Datensätze mit der Aggregatfunktion SUM addiert. In der Ergebnistabelle der Unterabfrage werden dann die ID der Kundinnen und Kunden zusammen mit der aufsummierten Lademenge ausgegeben.

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

Lösung: In der äußeren SQL-Abfrage wird die Ergebnistabelle der inneren Anfrage durch einen INNER JOIN über die ID der Kundin bzw. des Kunden mit der Relation Kunde verknüpft. Es werden die Datensätze selektiert, bei denen die in der inneren SQL-Abfrage aufsummierte Lademenge den Wert 500 überschreitet. Ausgegeben werden diese Datensätze mit den Namen der Kundinnen bzw. Kunden, der E-Mail-Adresse und der aufsummierten Lademenge.

c) 3 Erläutern Sie im Sachzusammenhang, welche Information die vollständige SQL-Anweisung liefert.

Lösung: Insgesamt liefert die SQL-Anweisung eine Liste der Kundinnen bzw. Kunden, die in Summe mehr als 500 kWh bei der Betreibergesellschaft Pottpower geladen haben. Ausgegeben werden dabei jeweils der Name der Kundin bzw. des Kunden, die E-Mail-Adresse sowie die bei Pottpower geladene Gesamtmenge.

e) 1 Analysieren Sie die SQL-Anweisung der Zeilen 3 – 5 und geben Sie anhand der Beispieldaten in der Anlage deren Ergebnis an.

Lösung: | Standort | COUNT(*) | |---|---| | Sonnenhang | 2 | | Stausee | 1 | | Windwinkel | 4 | | Grüner Strom | 2 |

e) 2 Analysieren Sie die Methode liefereEtwas, erläutern Sie deren Funktionsweise und geben Sie anhand der Beispieldaten in der Anlage den Rückgabewert an.

Lösung: Nach der Ausführung der SQL-Anweisung werden in der Methode zunächst die Variablen max mit dem Wert 2 und ergebnis mit dem Wert Sonnenhang aus der ersten Zeile der Ergebnistabelle belegt. In der Schleife werden diese Werte nur bei der Bearbeitung der dritten Zeile überschrieben mit den Werten 4 für die Variable max und Windwinkel für die Variable ergebnis. Am Ende wird dann der Standortname Windwinkel zurückgegeben.

e) 3 Beschreiben Sie im Sachzusammenhang, welchen Wert die Methode zurückliefert.

Lösung: Die Methode gibt den Namen des Standorts mit der größten Anzahl an Ladesäulen zurück. Sollte es mehrere Standorte mit der gleichen größten Anzahl geben, so ist nicht definiert, welcher der Standorte zurückgegeben wird. Können keine Daten aus der Datenbank ermittelt werden, so wird die Zeichenkette „kein Ergebnis“ zurückgeliefert.

e) 4 Beurteilen Sie die Aussage der Mitarbeiterin, die Methode lasse sich auch ohne Schleife (wie in den Zeilen 13 – 19) realisieren.

Lösung: Die Behauptung der Mitarbeiterin ist richtig. Es ist z. B. möglich, die SQL-Anweisung in den Zeilen 3 – 5 um eine Anweisung zur Sortierung der Ergebnistabelle zu ergänzen, sodass einer der Datensätze mit den meisten Ladesäulen in der ersten Zeile der Ergebnistabelle steht. Das kann z. B. durch die Ergänzung "ORDER BY COUNT(*) DESC" erreicht werden. Dann kann der Name dieses Standortes direkt aus der ersten Spalte der ersten Zeile der Ergebnistabelle abgerufen werden.

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 · GK · Haupttermin · Weiterbildungskolleg 2023 · Aufgabe 3 - SQL-Abfragen · LK · Haupttermin 2023 ›

Mehr Aufgaben zu SQL-Abfragen