This commit is contained in:
Sangelo ST 2023-05-12 10:29:34 +02:00
parent b2fa196612
commit 8124daeb67
10 changed files with 446 additions and 0 deletions

View File

@ -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;

View File

@ -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%');

View File

@ -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';

View File

@ -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%'

View File

@ -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

View File

@ -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`

View File

@ -0,0 +1,22 @@
# Referentielle Datenintegrität
Zeit: 30 Min.<br>
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.
---

6
Tage/6/README.md Normal file
View File

@ -0,0 +1,6 @@
# Tag 6
## Inhaltsverzeichnis
- [Datensicherung](datensicherung.md)
- [Bulk Import](bulk-import.md)

8
Tage/6/bulk-import.md Normal file
View File

@ -0,0 +1,8 @@
# Bulk Import
## Inhaltsverzeichnis
- [Bulk Import](#bulk-import)
- [Inhaltsverzeichnis](#inhaltsverzeichnis)
- [placeholder](#placeholder)
## placeholder

23
Tage/6/datensicherung.md Normal file
View File

@ -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 <datenbankname> -u <user> -p=<passwort>
```
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 <datenbankname> -u <user> -p=<passwort> > /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.