diff --git a/Tage/2-3/Solutions/Tag03 Auftrag SELECT.sql b/Tage/2-3/Solutions/Tag03 Auftrag SELECT.sql new file mode 100644 index 0000000..aac62bf --- /dev/null +++ b/Tage/2-3/Solutions/Tag03 Auftrag SELECT.sql @@ -0,0 +1,90 @@ +USE filmeDatenbank; + +#a. Lassen Sie sich mit SELECT alle Datensätze Ihrer DVD-Sammlung ausgeben. +SELECT + * +FROM dvd_sammlung; + +#b. Erstellen Sie eine Anweisung, die alle Filmtitel und die jeweils zugehörige Nummer ausgibt. +SELECT + film + , nummer +FROM dvd_sammlung; + +#c. Erstellen Sie eine Anweisung, die alle Filmtitel und den jeweils zugehörigen Regisseur ausgibt. +SELECT + film + , regisseur +FROM dvd_sammlung; +#d. Erstellen Sie eine Liste mit allen Filmen von Quentin Tarantino. +SELECT + * +FROM dvd_sammlung +WHERE regisseur = 'Quentin Tarantino'; + +#e. Erstellen Sie eine Liste mit allen Filmen von Steven Spielberg. +SELECT + * +FROM dvd_sammlung +WHERE regisseur = 'Steven Spielberg'; + +#f. Erstellen Sie eine Liste aller Filme, in denen der Regisseur den Vornamen "Steven" hat. +SELECT + * +FROM dvd_sammlung +WHERE regisseur LIKE 'Steven%'; + +#g. Erstellen Sie eine Liste mit allen Filmen, die länger als 2 Stunden sind. +SELECT + * +FROM dvd_sammlung +WHERE laenge_minuten > 120; + +#h. Erstellen Sie eine Liste mit allen Filmen, die von Tarantino oder von Spielberg gedreht wurden. +SELECT + film, regisseur +FROM dvd_sammlung +WHERE regisseur = 'Steven Spielberg' +OR regisseur = 'Quentin Tarantino'; + +#i. Suchen Sie alle Filme heraus, die von Tarantino gedreht wurden und kürzer als 90 Minuten sind. +SELECT + * +FROM dvd_sammlung +WHERE regisseur = 'Quentin Tarantino' +AND laenge_minuten < 90; + +#j. Sie erinnern sich an einen Film, in dessen Titel "Sibirien" vorkam. Suchen Sie ihn. +SELECT + * +FROM dvd_sammlung +WHERE film LIKE '%Sibirien%'; + +#k. Lassen Sie sich alle Teile von "Das große Rennen" ausgeben. +SELECT + * +FROM dvd_sammlung +WHERE film = 'Das große Rennen'; + +#l. Lassen Sie sich eine Liste aller Filme ausgeben, sortiert nach Regisseur. +SELECT + film + , regisseur +FROM dvd_sammlung +ORDER BY regisseur; + +#m. Lassen Sie sich eine Liste aller Filme ausgeben, sortiert nach Regisseur, dann nach Filmtitel. +SELECT + film + , regisseur +FROM dvd_sammlung +ORDER BY regisseur, film; + +#n. Lassen Sie sich eine Liste aller Filme von Tarantino ausgeben, die längsten zuerst. +SELECT + film + , laenge_minuten + , regisseur +FROM dvd_sammlung +WHERE regisseur = 'Quentin Tarantino' +ORDER BY laenge_minuten DESC; \ No newline at end of file diff --git a/Tage/4/Solutions/Tag04 SELECT JOIN.sql b/Tage/4/Solutions/Tag04 SELECT JOIN.sql new file mode 100644 index 0000000..e2a5cbc --- /dev/null +++ b/Tage/4/Solutions/Tag04 SELECT JOIN.sql @@ -0,0 +1,73 @@ + +SELECT * FROM kunden +LEFT JOIN orte + ON ort_postleitzahl = postleitzahl; + +#a) Geben Sie Name, Postleitzahl und Wohnort aller Kunden aus. Die Liste enthält den Kundennamen und den Namen des Orts, wo er wohnt. +SELECT + kunden.Name + , ort_Postleitzahl + , orte.name +FROM kunden +LEFT JOIN orte + ON kunden.ort_postleitzahl = orte.postleitzahl; + +#b) Geben Sie Name und Wohnort aller Kunden aus, die die Postleitzahl 79312 haben. + +SELECT + kunden.Name + , orte.name +FROM kunden +LEFT JOIN orte + ON kunden.ort_postleitzahl = orte.postleitzahl +WHERE kunden.ort_postleitzahl = 79312; + +#c) Geben Sie Name und Wohnort aller Kunden aus, die in Emmendingen wohnen (Einschränkungskrite-rium ist NICHT die Postleitzahl, sondern 'Emmendingen'). +SELECT + kunden.Name + , orte.name +FROM kunden k +LEFT JOIN orte + ON kunden.ort_postleitzahl = orte.postleitzahl +WHERE orte.name = 'Emmendingen'; + +#d) Geben Sie Name, Wohnort und Einwohnerzahl für alle Kunden aus, die in einem Ort mit mehr als 70000 Einwohnern wohnen. +SELECT + kunden.Name + , orte.name + , orte.Einwohnerzahl +FROM kunden +LEFT JOIN orte +ON kunden.ort_postleitzahl = orte.postleitzahl +WHERE orte.einwohnerzahl > 70000; + +#e) Geben Sie alle Orte aus, die weniger als 1000000 Einwohner haben. +SELECT + name + , Einwohnerzahl +FROM orte +WHERE einwohnerzahl < 1000000; + +#f) Geben Sie Kundename und Ortname aus für alle Kunden, die in Orten mit einer Einwohnerzahl zwischen 100.000 und 1.500.000 leben. +SELECT + kunden.Name + , orte.name + , orte.Einwohnerzahl +FROM kunden +LEFT JOIN orte + ON kunden.ort_postleitzahl = orte.postleitzahl +WHERE orte.einwohnerzahl BETWEEN 100000 AND 1500000; + +#g) 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). + +SELECT + kunden.Name + , kunden.ort_postleitzahl + , orte.name +FROM kunden +LEFT JOIN orte + ON kunden.ort_postleitzahl = orte.postleitzahl +WHERE kunden.name LIKE '%e%' +AND (orte.name LIKE '%u%'OR orte.name like '%r%'); \ No newline at end of file diff --git a/Tage/5/Solutions/Tag05 Aggregatsfunktionen.sql b/Tage/5/Solutions/Tag05 Aggregatsfunktionen.sql new file mode 100644 index 0000000..aaf62a3 --- /dev/null +++ b/Tage/5/Solutions/Tag05 Aggregatsfunktionen.sql @@ -0,0 +1,82 @@ +#1.a +SELECT MAX(gehalt), MIN(gehalt) +FROM lehrer; + +#1.b +SELECT + MAX(l.gehalt) +FROM lehrer l +INNER JOIN lehrer_hat_faecher lhf + ON lhf.idlehrer = l.id +INNER JOIN faecher f + ON f.id = lhf.idfaecher +WHERE f.fachbezeichnung = 'Mathe'; + +#1.c +SELECT MAX((s.noteMathe+s.noteDeutsch)/2) +FROM schueler s; + +#1.d +SELECT MIN(orte.einwohnerzahl) AS 'Niedrigste Einwohnerzahl', MAX(orte.einwohnerzahl) 'Höchste Einwohnerzahl' +FROM orte; + +#1.e +SELECT MAX(orte.einwohnerzahl) - MIN(orte.einwohnerzahl) AS 'Differenz' +FROM orte; + +#1.f +SELECT COUNT(*) +FROM schueler; + +#1.g +SELECT COUNT(*) +FROM schueler +WHERE idSmartphones is not null; + +#1.h +SELECT COUNT(schueler.id) +FROM schueler +INNER JOIN smartphones phone + ON schueler.idsmartphones = phone.id +WHERE phone.marke = 'Samsung' +OR phone.marke = 'HTC'; + +#1.i +SELECT COUNT(schueler.id) +FROM schueler +INNER JOIN orte + ON schueler.idOrte = orte.id +WHERE orte.name = 'Waldkirch'; + +#1.j +SELECT COUNT(schueler.id) +FROM schueler +INNER JOIN orte + ON schueler.idOrte = orte.id +INNER JOIN lehrer_hat_schueler lhs + ON schueler.id = lhs.idSchueler +INNER JOIN lehrer + ON lhs.idLehrer = lehrer.id +WHERE orte.name = 'Emmendingen' +AND lehrer.name = 'Bohnert'; + +#1.k +SELECT COUNT(schueler.id) +FROM schueler +INNER JOIN lehrer_hat_schueler lhs + ON schueler.id = lhs.idSchueler +INNER JOIN lehrer + ON lhs.idLehrer = lehrer.id +WHERE lehrer.name = 'Zelawat'; + +#1.l +SELECT COUNT(schueler.id) +FROM schueler +INNER JOIN lehrer_hat_schueler lhs + ON schueler.id = lhs.idSchueler +INNER JOIN lehrer + ON lhs.idLehrer = lehrer.id +WHERE lehrer.name = 'Zelawat' +AND schueler.nationalitaet = 'RU'; + + diff --git a/Tage/5/Solutions/Tag05 SELECT ALIAS.sql b/Tage/5/Solutions/Tag05 SELECT ALIAS.sql new file mode 100644 index 0000000..600ad1f --- /dev/null +++ b/Tage/5/Solutions/Tag05 SELECT ALIAS.sql @@ -0,0 +1,37 @@ +-- 1. Ergänzen Sie folgende Statements und überprüfen Sie die Funktion: + +SELECT + kundenliste.kunde_id + , kundenliste.name + , kundenliste.ort_postleitzahl +FROM kunden AS kundenliste +WHERE kundenliste.ort_postleitzahl > 80000; +-- -- ausgegeben werden sollen kunde_id, Name des Kunden und Postleitzahl des Kunden + +SELECT + o.name + , k.name +FROM kunden AS k +INNER JOIN orte AS ON o.postleitzahl = k.ort_postleitzahl +WHERE o.name LIKE '%n' + + +-- 2. Korrigieren Sie die folgenden Statements, dass sie funktionieren. +-- -- Aliasse 'prfz' und 'hrgs' bitte nicht verändern! +SELECT kunde_id + , hrgs.name + , prfz.name +FROM kunde AS hrgs +INNER JOIN ort AS prfz ON prfz.postleitzahl = hrgs.ort_postleitzahl +ORDER BY hrgs.kunde_id + +-- -- Fügen Sie die notwendigen Aliasse ein! +SELECT + k.name + , o.postleitzahl + , o.name +FROM kunden AS k +INNER JOIN orte AS o ON k.ort_postleitzahl = o.postleitzahl +WHERE k.name LIKE '%a%' + AND o.name LIKE '%u%' + diff --git a/Tage/5/Solutions/Tag05 SELECT GROUP BY.sql b/Tage/5/Solutions/Tag05 SELECT GROUP BY.sql new file mode 100644 index 0000000..4723698 --- /dev/null +++ b/Tage/5/Solutions/Tag05 SELECT GROUP BY.sql @@ -0,0 +1,57 @@ +#1.a +SELECT + COUNT(schueler.id) AS 'Anzahl' + , schueler.nationalitaet +FROM schueler +GROUP by schueler.nationalitaet; + +#1.b +select + orte.name AS 'Ort' + , COUNT(schueler.id) AS 'Anzahl der Schüler' +FROM schueler +INNER JOIN orte + ON schueler.idOrte = orte.id +GROUP BY orte.name +order by COUNT(schueler.id) DESC; + +#1.c +SELECT + f.fachbezeichnung + , COUNT(l.id) AS 'Anzahl' +FROM lehrer l +INNER JOIN lehrer_hat_faecher lhf + ON lhf.idlehrer = l.id +INNER JOIN faecher f + ON f.id = lhf.idfaecher +GROUP BY f.fachbezeichnung +ORDER BY COUNT(distinct l.id) DESC; + +#1.d +SELECT + l.name AS Lehrername, + GROUP_CONCAT(f.fachbezeichnung) AS 'Fächer' +FROM lehrer l +INNER JOIN lehrer_hat_faecher lhf + ON lhf.idLehrer = l.id +INNER JOIN faecher f + ON f.id = lhf.idFaecher +GROUP BY l.id +ORDER BY Lehrername; + +#1.e +SELECT + s.name, + GROUP_CONCAT(DISTINCT l.name) `Lehrer`, + GROUP_CONCAT(DISTINCT f.fachbezeichnung) `Fächer` +FROM lehrer l +INNER JOIN lehrer_hat_faecher lhf + ON lhf.idLehrer = l.id +INNER JOIN faecher f + ON f.id = lhf.idFaecher +INNER JOIN lehrer_hat_schueler lhs + ON lhs.idLehrer = l.id +INNER JOIN schueler s + ON s.id = lhs.idSchueler +GROUP BY s.name +ORDER BY s.name \ No newline at end of file diff --git a/Tage/5/Solutions/Tag05 SELECT HAVING.sql b/Tage/5/Solutions/Tag05 SELECT HAVING.sql new file mode 100644 index 0000000..6f7c9c7 --- /dev/null +++ b/Tage/5/Solutions/Tag05 SELECT HAVING.sql @@ -0,0 +1,48 @@ +#1.a +SELECT + s.name `Schülername`, + (s.noteDeutsch + s.noteMathe) / 2 AS Durchschnittsnote +FROM schueler s +HAVING Durchschnittsnote > 4; + +#1.b +SELECT + s.name `Schülername`, + ROUND(((s.noteDeutsch + s.noteMathe) / 2), 1) AS Durchschnittsnote +FROM schueler s +HAVING Durchschnittsnote > 4 +ORDER BY Durchschnittsnote ASC; + +#2 +SELECT + l.name, (gehalt * 0.7) AS nettogehalt +FROM lehrer l +HAVING nettogehalt > 3000; + +#3 +SELECT + s.klassenzimmer, COUNT(s.id) AS `Anzahl` +FROM schueler s +GROUP BY klassenzimmer +HAVING `Anzahl` < 15; + +#4.a +SELECT + COUNT(s.id) AS `Anzahl`, o.name AS `Ort-Name` +FROM schueler s +INNER JOIN orte o + ON s.idOrte = o.id +WHERE s.nationalitaet = 'RU' +GROUP BY o.id +ORDER BY `Ort-Name` + +#4.b +SELECT + COUNT(s.id) AS `Anzahl`, o.name AS `Ort-Name` +FROM schueler s +INNER JOIN orte o + ON s.idOrte = o.id +WHERE s.nationalitaet = 'RU' +GROUP BY o.id +HAVING `Anzahl` >= 10 +ORDER BY `Ort-Name` \ No newline at end of file diff --git a/Tage/5/datenintegritaet.md b/Tage/5/datenintegritaet.md new file mode 100644 index 0000000..d8f7b03 --- /dev/null +++ b/Tage/5/datenintegritaet.md @@ -0,0 +1,22 @@ +# Referentielle Datenintegrität + +Zeit: 30 Min.
+Form: 2er Team + +Lesen Sie zuerst aus dem Skript [Skript_M164_Themenübersicht](../../02_Theorie_Unterlagen/Skript_M164_Themenuebersicht.pdf) das Kapitel 3 *Löschen in professionellen Datenbanken* aufmerksam durch. + + +## Aufgabe 1 +1. Weshalb können in professionellen Datenbanken nicht einfach so Daten gelöscht werden? +2. Wer stellt die referentielle Integrität sicher? + +## Aufgaben 2 + +Verwenden Sie die Lösung von "Tourenplaner" und importieren Sie das Dump-File [tourenplaner_dump](../90_Dumps/tourenplaner_dump.sql) + +1. Als Datenbank-Entwickler stellen Sie fest, dass bei der Dateneingabe ein Fehler passiert ist. Anstatt «4000 Basel» sollte «3000 Bern» heissen. Versuchen Sie in der Tabelle «tbl_ort» die Ortschaft «Basel» zu löschen. +Was stellen sie fest? Erklären Sie! +2. Was müssten Sie tun, damit nun die richtige Ortschaft in der Datenbank eingetragen sowie die falsch eingegebene Ortschaft gelöscht werden kann? +Setzen Sie Ihren Plan um. + +--- diff --git a/Tage/6/README.md b/Tage/6/README.md new file mode 100644 index 0000000..ba9e1a8 --- /dev/null +++ b/Tage/6/README.md @@ -0,0 +1,6 @@ +# Tag 6 + +## Inhaltsverzeichnis + +- [Datensicherung](datensicherung.md) +- [Bulk Import](bulk-import.md) \ No newline at end of file diff --git a/Tage/6/bulk-import.md b/Tage/6/bulk-import.md new file mode 100644 index 0000000..507a281 --- /dev/null +++ b/Tage/6/bulk-import.md @@ -0,0 +1,8 @@ +# Bulk Import + +## Inhaltsverzeichnis +- [Bulk Import](#bulk-import) + - [Inhaltsverzeichnis](#inhaltsverzeichnis) + - [placeholder](#placeholder) + +## placeholder \ No newline at end of file diff --git a/Tage/6/datensicherung.md b/Tage/6/datensicherung.md new file mode 100644 index 0000000..0a65f25 --- /dev/null +++ b/Tage/6/datensicherung.md @@ -0,0 +1,23 @@ +# Datensicherung +## Inhaltsverzeichnis +- [Datensicherung](#datensicherung) + - [Inhaltsverzeichnis](#inhaltsverzeichnis) + - [Backup/Dumping von Datenbanken](#backupdumping-von-datenbanken) + - [Sourcing von Dumps](#sourcing-von-dumps) + +## Backup/Dumping von Datenbanken +Ein Datenbank-Dump kann leicht hergestellt werden mit folgendem Command: +```bash +$ mysqldump -u -p= +``` +Dieser Command gibt aber nur das Script hinaus, es schreibt es nicht in eine Datei. Um dies zu erreichen leiten wir einfach den Output zu einer Datei weiter: +```bash +$ mysqldump -u -p= > /path/to/database_dump.sql +``` + +## Sourcing von Dumps +Damit ein Backup oder ein selbstgeschriebenes Script eingespielt werden kann, verwenden wir folgenden Command in MySQL/MariaDB: +``` +mysql> source /path/to/database_dump.sql +``` +Dieser Command führt den angegebenen Script in MySQL aus. \ No newline at end of file