From f6a4a922640852ed6f86ff349489213e8a85ecf3 Mon Sep 17 00:00:00 2001 From: Sangelo Date: Thu, 13 Apr 2023 20:36:04 +0200 Subject: [PATCH] Restructure & Progress on day 5 - Created aggregatsfunktionen.md - Created select-join.md - Modified Tage/5/README.md - Moved Tourenplaner/ and Introduction/ to Tage/2-3 --- .../2-3/Introduction}/Mindmap.drawio | 0 .../2-3/Introduction}/Tourenplaner.drawio | 0 .../2-3/Tourenplaner}/Tourenplaner.mwb | Bin .../2-3/Tourenplaner}/Tourenplaner.sql | 0 ...lian-loesung.md => lb1-stelian-loesung.md} | 0 Tage/4/lb1/{tsekov.sql => stelian.sql} | 14 +- Tage/5/README.md | 2 + Tage/5/aggregatsfunktionen.md | 196 ++++++++++++++++++ Tage/5/select-join.md | 74 +++++++ 9 files changed, 279 insertions(+), 7 deletions(-) rename {Introduction => Tage/2-3/Introduction}/Mindmap.drawio (100%) rename {Introduction => Tage/2-3/Introduction}/Tourenplaner.drawio (100%) rename {Tourenplaner => Tage/2-3/Tourenplaner}/Tourenplaner.mwb (100%) rename {Tourenplaner => Tage/2-3/Tourenplaner}/Tourenplaner.sql (100%) rename Tage/4/lb1/{lb1-tsekov-stelian-loesung.md => lb1-stelian-loesung.md} (100%) rename Tage/4/lb1/{tsekov.sql => stelian.sql} (86%) create mode 100644 Tage/5/aggregatsfunktionen.md create mode 100644 Tage/5/select-join.md diff --git a/Introduction/Mindmap.drawio b/Tage/2-3/Introduction/Mindmap.drawio similarity index 100% rename from Introduction/Mindmap.drawio rename to Tage/2-3/Introduction/Mindmap.drawio diff --git a/Introduction/Tourenplaner.drawio b/Tage/2-3/Introduction/Tourenplaner.drawio similarity index 100% rename from Introduction/Tourenplaner.drawio rename to Tage/2-3/Introduction/Tourenplaner.drawio diff --git a/Tourenplaner/Tourenplaner.mwb b/Tage/2-3/Tourenplaner/Tourenplaner.mwb similarity index 100% rename from Tourenplaner/Tourenplaner.mwb rename to Tage/2-3/Tourenplaner/Tourenplaner.mwb diff --git a/Tourenplaner/Tourenplaner.sql b/Tage/2-3/Tourenplaner/Tourenplaner.sql similarity index 100% rename from Tourenplaner/Tourenplaner.sql rename to Tage/2-3/Tourenplaner/Tourenplaner.sql diff --git a/Tage/4/lb1/lb1-tsekov-stelian-loesung.md b/Tage/4/lb1/lb1-stelian-loesung.md similarity index 100% rename from Tage/4/lb1/lb1-tsekov-stelian-loesung.md rename to Tage/4/lb1/lb1-stelian-loesung.md diff --git a/Tage/4/lb1/tsekov.sql b/Tage/4/lb1/stelian.sql similarity index 86% rename from Tage/4/lb1/tsekov.sql rename to Tage/4/lb1/stelian.sql index 2ae8a7e..6ff7e22 100644 --- a/Tage/4/lb1/tsekov.sql +++ b/Tage/4/lb1/stelian.sql @@ -1,10 +1,10 @@ -# Auftrag 1 +-- Auftrag 1 CREATE SCHEMA if not exists db_MyFlower DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci; USE db_MyFlower; -# Auftrag 2 +-- Auftrag 2 CREATE TABLE if not exists Bestellung ( id INT NOT NULL AUTO_INCREMENT, Best_Nummer VARCHAR(5) NOT NULL, @@ -15,24 +15,24 @@ CREATE TABLE if not exists Bestellung ( PRIMARY KEY (id) ); -# Auftrag 3 +-- Auftrag 3 INSERT INTO Bestellung (Best_Nummer, Lieferadresse, Lieferdatum, Lieferzeit, Betrag) VALUES ('#0001', 'Musterstrasse 3', '2023-08-09', '17:08', '10.05'); -# Auftrag 4 +-- Auftrag 4 INSERT INTO Bestellung (Best_Nummer, Lieferadresse, Lieferdatum, Betrag) VALUES ('#0002', 'Musterville 32', '2023-12-10', '100.20'); -# Auftrag 6 +-- Auftrag 6 UPDATE Bestellung SET Betrag = Betrag + 20 WHERE id = 1; -# Auftrag 7 +-- Auftrag 7 SELECT id, Lieferdatum, Lieferzeit, Lieferadresse FROM Bestellung WHERE (Lieferdatum >= '2023-01-01' AND Lieferzeit > '12:00') OR Lieferadresse = 'Zürich' ORDER BY Lieferdatum DESC, Lieferzeit ASC; -# Auftrag 5 +-- Auftrag 5 ALTER TABLE Bestellung MODIFY Lieferzeit DateTime; \ No newline at end of file diff --git a/Tage/5/README.md b/Tage/5/README.md index c774617..0cb5123 100644 --- a/Tage/5/README.md +++ b/Tage/5/README.md @@ -3,6 +3,8 @@ - [Tag 5](#tag-5) - [Inhaltsverzeichnis](#inhaltsverzeichnis) - [Select Alias](#select-alias) + - [Select Join \[↗\]](select-join.md) + - [Aggregatsfunktionen \[↗\]](aggregatsfunktionen.md) ## Select Alias SQL Script-Ergänzung: diff --git a/Tage/5/aggregatsfunktionen.md b/Tage/5/aggregatsfunktionen.md new file mode 100644 index 0000000..3ccd435 --- /dev/null +++ b/Tage/5/aggregatsfunktionen.md @@ -0,0 +1,196 @@ +# Aggregatsfunktionen + +## Aufgaben + +1. Welches ist das niedrigste/höchste Gehalt eines Lehrers? +```sql +MariaDB [uebungSchule]> select min(gehalt) from lehrer; ++-------------+ +| min(gehalt) | ++-------------+ +| 1740 | ++-------------+ +1 row in set (0.000 sec) + +------ + +MariaDB [uebungSchule]> select max(gehalt) from lehrer; ++-------------+ +| max(gehalt) | ++-------------+ +| 6581 | ++-------------+ +1 row in set (0.000 sec) +``` +2. Was ist das niedrigste Gehalt, das einer unserer Mathelehrer bekommt? +```sql +MariaDB [uebungSchule]> select min(gehalt) from lehrer where id in (select idLehrer from lehrer_hat_faecher where idFaecher = (select id from faecher where fachbezeichnung = 'Mathe')); ++-------------+ +| min(gehalt) | ++-------------+ +| 2490 | ++-------------+ +1 row in set (0.001 sec) +``` +3. Was ist der beste Notendurchschnitt der Noten Deutsch/Mathe? +```sql +MariaDB [uebungSchule]> select avg(noteMathe) from schueler; ++----------------+ +| avg(noteMathe) | ++----------------+ +| 3.5437 | ++----------------+ +1 row in set (0.000 sec) + +------ + +MariaDB [uebungSchule]> select avg(noteDeutsch) from schueler; ++------------------+ +| avg(noteDeutsch) | ++------------------+ +| 3.6699 | ++------------------+ +1 row in set (0.000 sec) + +-- Besserer Durchschnitt ist in Deutsch. +``` + +4. Wie viel Einwohner hat der größte Ort, wie viel der Kleinste? Ausgabe "Höchste Einwohnerzahl", "Niedrigste Einwohnerzahl" +```sql +MariaDB [uebungSchule]> select min(einwohnerzahl) from orte; ++--------------------+ +| min(einwohnerzahl) | ++--------------------+ +| 2977 | ++--------------------+ +1 row in set (0.000 sec) + +--- + +MariaDB [uebungSchule]> select max(einwohnerzahl) from orte; ++--------------------+ +| max(einwohnerzahl) | ++--------------------+ +| 262811 | ++--------------------+ +1 row in set (0.000 sec) +``` + +5. Wie groß ist die Differenz zwischen dem Ort mit den meisten und dem mit den wenigsten Einwohnern (z.B.: kleinster Ort hat 1000 Einwohner, größter Ort hat 3000 - Differenz ist 2000). Ausgabe einer Spalte "Differenz". +```sql +MariaDB [uebungSchule]> select max(einwohnerzahl) - min(einwohnerzahl) as differenz from orte; ++------------+ +| differenz | ++------------+ +| 259834 | ++------------+ +1 row in set (0.000 sec) +``` + +6. Wie viele Schüler haben wir in der Datenbank? +```sql +MariaDB [uebungSchule]> select count(*) from schueler; ++----------+ +| count(*) | ++----------+ +| 103 | ++----------+ +1 row in set (0.000 sec) +``` + +7. Wie viele Schüler haben ein Smartphone? +```sql +MariaDB [uebungSchule]> select count(idSmartphones) from schueler; ++----------------------+ +| count(idSmartphones) | ++----------------------+ +| 98 | ++----------------------+ +1 row in set (0.000 sec) +``` +8. Wie viele Schüler haben ein Smartphone der Firma Samsung oder der Firma HTC? +```sql +MariaDB [uebungSchule]> select count(idSmartphones) from schueler where idSmartphones = 1 or idSmartphones = 3; ++----------------------+ +| COUNT(idSmartphones) | ++----------------------+ +| 39 | ++----------------------+ +1 row in set (0.000 sec) +``` + +9. Wie viele Schüler wohnen in Waldkirch? +```sql +MariaDB [uebungSchule]> select * from orte; ++----+--------------+-------------+---------+---------------+ +| id | postleitzahl | name | vorwahl | einwohnerzahl | ++----+--------------+-------------+---------+---------------+ +| 1 | 79312 | Emmendingen | 07641 | 29612 | +| 2 | 79311 | Reute | 07641 | 8501 | +| 3 | 79312 | Wasser | 07641 | 2977 | +| 4 | 79098 | Freiburg | 0761 | 262811 | +| 5 | 79206 | Breisach | 07667 | 22719 | +| 6 | 79313 | Waldkirch | 07681 | 25020 | ++----+--------------+-------------+---------+---------------+ +6 rows in set (0.000 sec) + +MariaDB [uebungSchule]> select count(idOrte) from schueler where idOrte = 6; ++---------------+ +| count(idOrte) | ++---------------+ +| 12 | ++---------------+ +1 row in set (0.000 sec) +``` + +10. Wie viele Schüler, die bei Herrn Bohnert Unterricht haben, wohnen in Emmendingen? +```sql +MariaDB [uebungSchule]> SELECT COUNT(*) + -> FROM schueler s + -> JOIN lehrer_hat_schueler l ON s.id = l.idSchueler + -> JOIN lehrer le ON l.idLehrer = le.id + -> WHERE le.id = 4 AND s.idOrte = 1; ++----------+ +| COUNT(*) | ++----------+ +| 1 | ++----------+ +1 row in set (0.001 sec) +``` + +11. Wie viele Schüler unterrichtet Frau Zelawat? +```sql +MariaDB [uebungSchule]> select count(idSchueler) from lehrer_hat_schueler where idLehrer = 28; ++-------------------+ +| count(idSchueler) | ++-------------------+ +| 35 | ++-------------------+ +1 row in set (0.001 sec) +``` + +12. Wie viele Schüler russischer Nationalität unterrichtet Frau Zelawat? +```sql +MariaDB [uebungSchule]> SELECT COUNT(*) + -> FROM schueler + -> JOIN lehrer_hat_schueler ls ON schueler.id = ls.idSchueler + -> JOIN lehrer ON ls.idLehrer = lehrer.id + -> WHERE lehrer.id = 28 AND schueler.nationalitaet = "RU"; ++----------+ +| COUNT(*) | ++----------+ +| 16 | ++----------+ +1 row in set (0.001 sec) +``` + +13. Welcher Lehrer verdient am meisten? (Achtung: Falle! Überprüfen Sie Ihr Ergebnis.) +```sql +MariaDB [uebungSchule]> select name, max(gehalt) from lehrer; ++---------+-------------+ +| name | max(gehalt) | ++---------+-------------+ +| Schmitt | 6581 | ++---------+-------------+ +1 row in set (0.000 sec) +``` \ No newline at end of file diff --git a/Tage/5/select-join.md b/Tage/5/select-join.md new file mode 100644 index 0000000..a427f70 --- /dev/null +++ b/Tage/5/select-join.md @@ -0,0 +1,74 @@ +# SELECT JOIN + +## Inhaltsverzeichnis +- [SELECT JOIN](#select-join) + - [Inhaltsverzeichnis](#inhaltsverzeichnis) + - [Aufgaben](#aufgaben) + - [Kartesisches Produkt](#kartesisches-produkt) + - [Einfache Abfragen über zwei Tabellen](#einfache-abfragen-über-zwei-tabellen) + +## Aufgaben + +### Kartesisches Produkt +> Erklären Sie in eigenen Worten, warum diese Abfrage kein sinnvolles Ergebnis gibt: + +Die folgende Abfrage hat kein nützliches Ergebnis, weil die beiden Tabellen nicht zusammengeführt wurden. Ohne Zusammenführung entsteht eine riesige Tabelle, die nicht sehr aussagekräftig ist. Man muss die Abfrage ändern, um nur wichtige Ergebnisse zu erhalten. + +```sql +SELECT * FROM kunden +INNER JOIN orte +``` + + +### Einfache Abfragen über zwei Tabellen + +1. Geben Sie Name, Postleitzahl und Wohnort aller Kunden aus. Die Liste enthält den Kundennamen und den Namen des Orts, wo er wohnt.
+2. Geben Sie Name und Wohnort aller Kunden aus, die die Postleitzahl 79312 haben.
+3. Geben Sie Name und Wohnort aller Kunden aus, die in Emmendingen wohnen (Einschränkungskriterium ist NICHT die Postleitzahl, sondern 'Emmendingen').
+4. Geben Sie Name, Wohnort und Einwohnerzahl für alle Kunden aus, die in einem Ort mit mehr als 70000 Einwohnern wohnen.
+5. Geben Sie alle Orte aus, die weniger als 1000000 Einwohner haben. +6. Geben Sie Kundename und Ortname aus für alle Kunden, die in Orten mit einer Einwohnerzahl zwischen 100.000 und 1.500.000 leben.
+7. Geben Sie Kundename, Postleitzahl und Ortname aus für alle Kunden, deren Name ein "e" enthält und alle Orte, die ein "u" oder ein "r" enthalten (frEd aus stUden wird also genau so angezeigt wie jEssE aus bRnz, frEd aus salzen aber nicht und martin aus hambURg auch nicht).
+ + +```sql +-- 1 +SELECT kunden.Name, kunden.Postleitzahl, orte.Name as Wohnort +FROM kunden +JOIN orte ON kunden.OrtID = orte.ID; + +-- 2 +SELECT kunden.Name, orte.Name as Wohnort +FROM kunden +JOIN orte ON kunden.OrtID = orte.ID +WHERE kunden.Postleitzahl = 79312; + +-- 3 +SELECT kunden.Name, orte.Name as Wohnort +FROM kunden +JOIN orte ON kunden.OrtID = orte.ID +WHERE orte.Name = 'Emmendingen'; + +-- A4 +SELECT kunden.Name, orte.Name as Wohnort, orte.Einwohnerzahl +FROM kunden +JOIN orte ON kunden.OrtID = orte.ID +WHERE orte.Einwohnerzahl > 70000; + +-- 5 +SELECT orte.Name, orte.Einwohnerzahl +FROM orte +WHERE orte.Einwohnerzahl < 1000000; + +-- 6 +SELECT kunden.Name, orte.Name as Wohnort +FROM kunden +JOIN orte ON kunden.OrtID = orte.ID +WHERE orte.Einwohnerzahl BETWEEN 100000 AND 1500000; + +-- 7 +SELECT kunden.Name, kunden.Postleitzahl, orte.Name as Wohnort +FROM kunden +JOIN orte ON kunden.OrtID = orte.ID +WHERE kunden.Name LIKE '%e%' AND (orte.Name LIKE '%u%' OR orte.Name LIKE '%r%'); +``` \ No newline at end of file