SQL Masterclass
SQL Masterclass
SQL Masterclass
SQL Masterclass
Wie ist dieser Kurs aufgebaut?
● Weitere Themen:
○ Rechnen mit Datumsangaben
○ Expertenwissen
○ Transaktionen
○ Datenbank modellieren
○ Benutzer & Berechtigungen verwalten
○ Stored Procedures & Functions
○ Volltextsuche
○ Trigger
MySQL oder PostgreSQL?
● MariaDB:
○ MySQL wurde von Oracle gekauft
○ Der Haupt-Entwickler hat daraufhin
einen Fork gestartet: MariaDB
○ Bisher sind die Datenbanken relativ
kompatibel
○ Bei neueren Features unterscheiden
sie sich aber
PostgreSQL
SQL Masterclass
Daten abfragen: SELECT
SQL Masterclass
Daten abfragen: SELECT … WHERE
SQL Masterclass
SELECT COUNT(*)...
1x aus
SELECT COUNT(DISTINCT firstname))
firstname aus
Erste Schritte mit SQL:
Werte durchsuchen mit
LIKE
SQL Masterclass
SELECT … WHERE spalte LIKE ...
● Hierbei gilt:
● Hierbei gilt:
● Beispiel:
● Hinweise:
SQL Masterclass
SELECT … WHERE spalte IN ...
SQL Masterclass
ORDER BY...
○ … ORDER BY firstname
● LIMIT kommt ganz am Schluss der Query - noch nach eine ORDER BY
● Hiermit kannst du z.B. die Ergebnisse auf 20 Einträge begrenzen:
○ … LIMIT 20
● Du kannst aber auch angeben, ab wo die Einträge ausgegeben
werden sollen, z.B. 20 Zeilen ab Zeile 40:
○ MySQL: LIMIT offset, count => … LIMIT 40, 20
○ PostgreSQL: OFFSET offset LIMIT count
■ => ...OFFSET 40 LIMIT 20
Erste Schritte mit SQL:
SELECT AS und Eingebaute
Funktionen
SQL Masterclass
SELECT spalte1 AS ...
○ UPPER(spalte): Großbuchstaben
○ LOWER(spalte): Kleinbuchstaben
○ CONCAT(spalte1, spalte2,...)
SQL Masterclass
Daten einfügen
SQL Masterclass
Daten updaten
SQL Masterclass
Daten löschen
SQL Masterclass
Tabelle erstellen
spalte1 datatype,
spalte2 datatype
)
Was hat es mit dem Datentyp auf sich?
○ Exakte Zahlen
○ Gerundete Zahlen
○ Datumswerte
Wie speichern wir Text?
● VARCHAR: Hier müssen wir eine Maximallänge angeben
● MYSQL, TEXT:
○ Limitiert auf ca. 65k Zeichen
○ MEDIUMTEXT: Limitiert auf ca. 16MB
○ LONGTEXT: Limitiert auf ca. 4GB
● PostgreSQL, TEXT:
○ Unbegrenzte Länge
○ Aber generell limitiert auf maximal 1GB an Text
(allgemeines Limit)
Erste Schritte mit SQL:
Wie verwalten wir die
Spalten einer Tabelle?
SQL Masterclass
Wie kannst du eine Tabelle verwalten?
● Manchmal möchtest du noch nachträglich eine Spalte
entfernen / hinzufügen
● Dazu kannst du die Tabelle über ALTER TABLE verwalten
● Das passiert dann doch recht oft - oft zeigt sich erst später,
dass doch noch eine zusätzliche Spalte benötigt wird!
● Hinweis:
○ U.U. kann dies recht lange dauern
○ Währenddessen kann es sein, dass Abfragen für diese
Tabelle nicht beantwortet werden können
Tabelle verwalten
● Tabelle entfernen:
○ DROP TABLE table
● Spalte entfernen:
○ ALTER TABLE table DROP COLUMN column
● Spalte hinzufügen:
○ ALTER TABLE table ADD COLUMN column datatype [BEFORE
/ AFTER] column2
● Spalte verändern:
○ ALTER TABLE table MODIFY COLUMN column datatype
Erste Schritte mit SQL:
Wie werden Zahlen
gespeichert?
SQL Masterclass
Wie werden Zahlen gespeichert?
SQL Masterclass
Wie speichern wir Kommazahlen?
● Exakte Kommazahlen:
○ DECIMAL: Hier können wir selbst bestimmen, wie viele
Ziffern vor dem Komma oder nach dem Komma
unterstützt werden sollen
○ Beispiel: 123,45€
○ Anzahl Ziffern (precision): 5
○ Anzahl Ziffern hinter dem Komma (scale): 2
○ => DECIMAL(5, 2)
Wie speichern wir gerundete Zahlen?
● Gerundete Zahlen:
○ Je mehr Bytes, desto genauer können wir einen Wert speichern
○ Der Wert wird aber gerundet - Achtung, nicht immer so, wie wir
es erwarten würden!
○ Achtung beim Vergleichen von Zahlen: 2,123 ist nicht immer das
gleiche wie 2,123
○ Vergleich: Prüfe ob: ABS(a - b) < 0.00000001
○ REAL: 4 Bytes
○ DOUBLE: 8 Bytes
Wann was?
● Ganze Zahlen
● Kommazahlen:
○ Exakte Kommazahl (DECIMAL,...): Business-Logik
○ Gerundete Kommazahlen (DOUBLE / FLOAT):
■ Wissenschaftliche Berechnungen / ggf. Messwerte,...
Erste Schritte mit SQL:
NULL und Standardwert
SQL Masterclass
Was ist NULL? Wo ist der Unterschied zu einer 0?
● NULL:
○ Steht für: “Keine Angabe” / “Nicht definiert”
○ Beispiel: Wir speichern die Anzahl der getätigten
Einkäufe pro Kunde in einer Spalte:
■ 0 => Kein Einkauf
■ 2 => Bereits 2 Einkäufe bei uns getätigt
■ NULL => Anzahl unbekannt
○ Nicht immer möchten wir NULL erlauben
○ Hier würde es eventuell wenig Sinn machen
○ Aber: “Name nicht ausgefüllt”
Spalte mit NULL erstellen
CREATE TABLE t (
CREATE TABLE t (
)
Nach NULL suchen?
SQL Masterclass
Erste Schritte mit SQL:
Was sind Standardwerte?
SQL Masterclass
Warum benötigst du Standardwerte?
● Beispiel:
○ Wir möchten zu jedem Nutzer speichern, wie viele
Bücher er schon gekauft hat
○ Wir könnten es (ohne NULL) als Spalte num_books
modellieren:
■ 0 => 0 Bücher
■ 1 => 1 Buch gekauft,...
○ Unsere existierende Anwendung fügt die Nutzer aber
ohne die Spalte num_books in die Datenbank hinzu
○ Das INSERT wird also fehlschlagen - NULL ist hier nicht
erlaubt!
Beispiel: Standardwerte
● Beispiel:
○ Hier können wir dieser Spalte also einen Standardwert
von 0 geben
○ Unsere existierende Anwendung kann also diese Spalte
weglassen
○ Und die Datenbank trägt dann die 0 in die Spalte
(automatisch) ein
○ Wir sparen uns so das Umprogrammieren der
existierenden Anwendung!
Standardwerte definieren
● DEFAULT:
○ Hiermit kannst du einen Standardwert bestimmen
○ Dann muss später beim Einfügen diese Spalte nicht
angegeben werden!
○ Das funktioniert natürlich auch mit anderen Datentypen,
statt einer 0 könnte hier auch ein Wert (in einfachen
Anführungszeichen) stehen
○ CREATE TABLE t (
num_books INT NOT NULL DEFAULT 0
)
Erste Schritte mit SQL:
Warum benötigen wir die
Spalte “ID” (Excel-Beispiel)?
SQL Masterclass
Erste Schritte mit SQL:
Warum benötigen wir die
Spalte “ID”?
SQL Masterclass
Was ist eine ID?
● MySQL:
○ Primärschlüssel:
■ Ist Eindeutig pro Tabelle
■ Darüber können Einträge angesteuert werden
○ Auto Increment:
■ Wenn wir einen neuen Eintrag einfügen, wird
automatisch eine neue ID vergeben
● PostgreSQL:
○ Datentyp SERIAL / BIGSEARIAL
Primärschlüssel zur Tabelle hinzufügen
● MySQL:
○ CREATE TABLE t (
id INT NOT NULL AUTO INCREMENT,
…,
PRIMARY KEY (id)
)
● PostgreSQL:
○ CREATE TABLE t (
id SERIAL PRIMARY KEY,
...
)
Komplexere Abfragen in SQL:
SUBSELECT!
SQL Masterclass
Komplexere Abfragen
● Die Datenbank unterstützt aber noch viel komplexere
Abfragen:
○ Subselect
○ JOIN
○ GROUP BY
○ Common Table Expression (WITH …)
● Oft können wir über verschiedene Wege zum gleichen
Ergebnis kommen, manchmal aber nicht!
● Unterschiedliche Wege sind unterschiedlich performant!
○ Mehr dazu später noch!
SUBSELECT!
● Beispiele:
○ Generiere eine Kundenliste, inklusive:
■ Anzahl der Bestellungen pro Kunde
■ Wann war die letzte Bestellung pro Kunde?
○ Filtern nach Subselect:
■ Wie viele Kunden sind Stammkunden (haben bisher
schon mehr als 5 Bestellungen bei uns getätigt)?
■ Wie viele Kunden haben noch keine Bestellung bei
uns getätigt?
Komplexere Abfragen in SQL:
JOIN!
SQL Masterclass
Tabellen verknüpfen: JOINs!
2 Moritz 2 Spanisch
CROSS JOIN
● Hier wird also jeder Eintrag von Tabelle A mit jedem Eintrag
von Tabelle B kombiniert
● Die Ergebnismenge wird dadurch sehr groß:
○ [Anzahl Einträge Tabelle A] * [Anzahl Einträge Tabelle B]
● Natürlich können wir die Ergebnisse filtern:
○ Mit einem WHERE
● Später schauen wir uns noch die anderen JOIN-Typen an -
dort können wir die Ergebnismenge direkt einschränken.
Komplexere Abfragen in SQL:
INNER JOIN!
SQL Masterclass
CROSS JOIN - Beispiel Bestellung mit Kundendaten
● Cross Join:
○ SELECT * FROM A CROSS JOIN B WHERE BEDINGUNG
○ Hier wird zuerst das kartesische Produkt gebildet,
anschließend wird gefiltert nach BEDINGUNG
● INNER JOIN:
○ SELECT * FROM A INNER JOIN B ON BEDINGUNG
○ Hier wird nicht das komplette kartesische Produkt
aufgebaut
○ => Tendenziell performanter
Komplexere Abfragen in SQL:
INNER JOIN vs. LEFT JOIN vs.
RIGHT JOIN
SQL Masterclass
INNER JOIN vs. RIGHT JOIN vs. LEFT JOIN
=> Nur Einträge, bei denen es sowohl eine Bestellung als auch einen Kunden gibt
orders customers
LEFT JOIN
SELECT * FROM orders LEFT JOIN customers ON orders.customer_id = customers.id
orders customers
RIGHT JOIN
SELECT * FROM orders RIGHT JOIN customers ON orders.customer_id = customers.id
orders customers
FULL JOIN
SELECT * FROM orders FULL JOIN customers ON orders.customer_id = customers.id
orders customers
Komplexere Abfragen in SQL:
Daten gruppieren
SQL Masterclass
Group By vs. Subselect
SQL Masterclass
Daten gruppieren: Group By
● Where:
○ Filtert die Daten, bevor sie gruppiert werden
● Having:
○ Filtert die Daten, nachdem sie gruppiert wurden
Daten gruppieren: Group By
SQL Masterclass
Rechnen mit Datumswerten
● Unix-Timestamp:
○ Eine Zahl, die ein Datum repräsentiert
○ Idee: Wir starten irgendwann (hier: 1.1.1970), und zählen
einfach die Sekunden*
○ Damit können wir ein Datum als einfache Zahl speichern
○ Beispiel: 1571657687 = 21.10.2019, 11:34:47 UTC
○ Wir können Unix Timestamps leicht vergleichen:
■ Zeitdifferenz in Sekunden: Einfach voneinander
subtrahieren
Nachteile von Unix-Timestamps
● Unix-Timestamp:
○ Bei 32 Bit (INTEGER-Datentyp) können wir nur
Datumswerte bis zum 19.1.2038 um ca. 3 Uhr darstellen
○ Das reicht aktuell noch i.d.R. aus
○ Aber was tun wir, wenn die Anwendung 25+ Jahre
funktionieren soll?
Datumswerte in der Datenbank abspeichern
SQL Masterclass
MySQL: Datumsangaben speichern
SQL Masterclass
MySQL: Mit Datumswerten rechnen
● NOW(): Gibt die aktuelle Uhrzeit aus
● UTC_TIMESTAMP(): Gibt die aktuelle UTC-Uhrzeit aus
● YEAR(timestamp), MONTH(timestamp), DAY(timestamp):
○ Gibt das Jahr bzw. Monat bzw. Tag von einem Datumswert
aus
● DATE_ADD(timestamp, interval) / DATE_SUB:
○ Addiert einen Zeitraum auf ein Datum
● DATE_FORMAT(timestamp, format):
○ Gibt ein Datum formatiert aus
● DATEDIFF
MySQL: DATE_FORMAT
● DATE_FORMAT(timestamp, format):
○ Im Parameter format kann das Format angeben werden:
○ https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html
PostgreSQL: Datumswerte
SQL Masterclass
PostgreSQL: Datumsangaben speichern
● TIMESTAMP:
○ Wird 1:1 so abgespeichert wie angegeben
○ Es findet keine Umrechnung statt
● TIMESTAMP WITH TIME ZONE:
○ Wird beim Abspeichern in UTC umgewandelt
○ Wird beim Auslesen von UTC zurück in die lokale Zeitzone
umgewandelt
PostgreSQL: Mit
Datumswerten rechnen
SQL Masterclass
PostgreSQL: Mit Datumswerten rechnen
● CURRENT_TIMESTAMP, LOCALTIMESTAMP:
○ Gibt die aktuelle Uhrzeit aus
● DATE_PART(part, timestamp): Gibt einen Teil vom Datum aus
○ z.B. das Jahr, den Monat,...+
● Mit Datumswerten rechnen:
○ SELECT timestamp ‘2020-01-01 00:00:00’ - timestamp
‘2019-08-20 00:00:00’
○ SELECT timestamp ‘2019-01-01 00:00:00’ + interval ‘2
days’
Indexe: Wie funktionieren sie?
SQL Masterclass
Indexe: Warum brauchen wir sie?
● Bisher werden bei jedem Filtern die gesamten Daten
durchsucht
● Das ist ausgesprochen langsam
● Mit einem Index können wir dies massiv beschleunigen
● O(n) => O(log n)
● Aber wie funktioniert ein Index genau?
Fremdschlüssel
SQL Masterclass
Fremdschlüssel: Motivation
● Mit einem Fremdschlüssel können wir in SQL direkt eine
Beziehung “validieren”...
● Beispiel:
○ Tabelle customers, Spalte ID: Jeder Kunde hat eine
eindeutige ID
○ Tabelle orders, Spalte customer_id: Jede Bestellung
kann einem Kunden zugeordnet sein
● Was wir vermeiden möchten:
○ Bestellung mit customer_id = 500, aber es gibt keinen
Kunden mit der id = 500!
Fremdschlüssel
● Genau diese Prüfung kann die Datenbank für uns
übernehmen!
● CREATE TABLE orders (
…
customer_id bigint,
FOREIGN KEY (customer_id) REFERENCES customers(id)
)
● Oder wir fügen diese Prüfung nachträglich hinzu:
○ ALTER TABLE orders ADD FOREIGN KEY (customer_id)
REFERENCES customers(id)
Fremdschlüssel - Teil 2
SQL Masterclass
Fremdschlüssel: ON UPDATE
● Wie gehen wir damit um, sollte sich eine Kunden-ID
nachträglich ändern?
○ ON UPDATE RESTRICT:
● ALTER TABLE orders ADD FOREIGN KEY (customer_id)
REFERENCES customers(id) ON UPDATE RESTRICT
● Hiermit wird verboten, dass in der Tabelle customers
die id nachträglich geändert wird (wenn es eine
Bestellung von dem Kunden gibt)
Fremdschlüssel: ON UPDATE
● Wie gehen wir damit um, sollte sich eine Kunden-ID
nachträglich ändern?
○ ON UPDATE SET NULL:
● ALTER TABLE orders ADD FOREIGN KEY (customer_id)
REFERENCES customers(id) ON UPDATE SET NULL
● Wenn in der Tabelle customers zu einem Eintrag die
id nachträglich geändert wird, wird in der Tabelle
orders zu den entsprechenden Einträgen die
customer_id auf NULL gesetzt
Fremdschlüssel: ON UPDATE
● Wie gehen wir damit um, sollte sich eine Kunden-ID
nachträglich ändern?
○ ON UPDATE CASCADE:
● ALTER TABLE orders ADD FOREIGN KEY (customer_id)
REFERENCES customers(id) ON UPDATE CASCADE
● Wenn in der Tabelle customers zu einem Eintrag die
id nachträglich geändert wird, wird die customer_id
in der orders-Tabelle auch entsprechend angepasst
Fremdschlüssel: ON DELETE
● Wie gehen wir damit um, wenn ein Kunde gelöscht wird?
○ ON DELETE RESTRICT:
● Wenn es Bestellungen gibt, darf der Kunde nicht
gelöscht werden
○ ON DELETE SET NULL:
● Die customer_id wird auf NULL gesetzt
○ ON DELETE CASCADE:
● Die entsprechenden Bestellungen werden auch
gelöscht
Fremdschlüssel: Die gesamte Query
● Generell gilt:
○ Der Datentyp muss 1:1 übereinstimmen
○ ALTER TABLE orders
ADD FOREIGN KEY (customer_id) REFERENCES
customers(id)
ON UPDATE CASCADE
ON DELETE SET NULL
Wichtige Unterschiede
● Tabelle: orders, Spalte customer_id
● MySQL:
○ Wenn wir den Fremdschlüssel hinzufügen, wird
automatisch auch ein Index erstellt (sofern er nicht existiert)
○ Dadurch werden die ON UPDATE / ON DELETE-Klauseln
effizient ausgeführt
● PostgreSQL:
○ Ein Index wird für uns nicht automatisch erstellt
○ Er ist aber i.d.R. empfehlenswert (für die Performance) - wir
sollten ihn also manuell anlegen!
Komplexe Abfragen
speichern - Views!
SQL Masterclass
Views
● Views sind eine Art “virtuelle Tabelle”
● Wir können eine Query “abspeichern”, und als eine “virtuelle
Tabelle” verwenden
● Wenn wir dann diese Tabelle abfragen, wird unsere
ursprünglich abgespeicherte Query ausgeführt
Views: Anwendung
● Komplexe Queries können so vereinfacht werden
○ => Achtung, nur für uns!
○ => Nicht für die Datenbank - die muss immer noch die
komplexe Query ausführen
● Migration zu einer neuen Struktur:
○ Beispiel: Eine Anwendung erwartet, dass die Spalte für den
Nachnamen “surname” heißt
○ In der neuen Anwendung heißt die Spalte aber “lastname”
● Wir können einen View erstellen, der die Spalte für die
alte Anwendung “umbenennt”
Views: Limitierungen
● UPDATE und INSERT wird nur eingeschränkt unterstützt
● Die Abfragen können nur mit Indexes beschleunigt werden, die
auf den ursprünglichen Tabellen angelegt wurden
● Mit Views wird eine für die Datenbank komplexe Query
“versteckt”
● Sonderfall:
○ PostgreSQL - Materialized View
Transaktionen
SQL Masterclass
Transaktionen
● Wir können in SQL mehrere Anfragen direkt hintereinander
ausführen:
○ UPDATE …; UPDATE …;
● Jetzt könnte es aber sein, dass die Datenbank zwischen 2
Queries abstürzt
● Das möchten wir vermeiden:
○ Wir möchte, dass entweder alle Updates durchlaufen
○ Oder gar keine Änderung übernommen wird
Transaktionen
● Genau dafür gibt es Transaktionen:
○ START TRANSACTION
○ UPDATE …;
○ COMMIT
● Wir können auch nachträglich eine Transaktion abbrechen
○ START TRANSACTION
○ UPDATE …;
○ ROLLBACK
Locking
SQL Masterclass
SELECT … FOR UPDATE
● Mit einem FOR UPDATE kann eine Transaktion den Lesezugriff
auf einen Datensatz blockieren!
● Dieser Lesezugriff ist geblockt, bis die Transaktion
abgeschlossen wurde (COMMIT / ROLLBACK)
● Dadurch können wir bestimmtes Problem verhindern!
START TRANSACTION
START TRANSACTION
COMMIT
COMMIT
START TRANSACTION
START TRANSACTION
COMMIT
START TRANSACTION
START TRANSACTION
SQL Masterclass
Locking
● Es gibt jetzt hier noch unzählige Nuancen:
○ Schreib-Lock:
● FOR UPDATE
○ Lese-Lock:
● FOR SHARE / LOCK IN SHARED MODE
○ Tabellen-Locking
○ Locks ignorieren
● Weitere Themen:
○ Deadlocks
Locking
● Wenn dich das weiter interessiert:
○ Suche nach:
● “Deadlock”
● https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.h
tml
Locking
● Es gibt jetzt hier noch unzählige Nuancen:
○
Rechteverwaltung
SQL Masterclass
Rechteverwaltung
● Bisher durfte unser Nutzer immer alles
○ Administrator / Root
● Wenn wir jetzt aber eine Anwendung schreiben:
○ Benötigt dieser Benutzer nicht so viele Rechte
○ Z.B. müssen Tabellen (oft) nicht mehr nachträglich
abgeändert werden
○ Dem Benutzer können wir also diese Rechte entziehen
Rechteverwaltung
● Zudem können wir Informationen vor unserer Anwendung
“verstecken”:
○ Beispielsweise könnten wir Kreditkartendaten für die
Anwendung ausblenden wollen
○ Diese sind dann nur über eine “Stored Procedure”
zugänglich, und hierfür gibt es zusätzliche
Plausibilitätschecks / Sicherheitschecks
Rechteverwaltung
● Wobei der Sicherheitsaspekt nicht immer so wichtig ist:
○ Wenn ein Angreifer es schafft, unseren (Web-)Server zu
hacken, kann er über kurz oder lang oft eh auf alle Daten
zugreifen
○ Dennoch ist es eine zusätzliche Hürde, die uns mehr Zeit
einräumen kann!
Rechteverwaltung
● MySQL und PostgreSQL unterscheiden sich hier bei ihrer
Rechteverwaltung
● Dieser Kurs “teilt” sich also wieder auf!
Stored Procedures / Stored
Functions
SQL Masterclass
Stored Procedures
● Erlauben es dir, eigene Programme zu schreiben
● Diese werden direkt in der Datenbank ausgeführt
● Dadurch können wir auch komplexe Anwendungslogik direkt in
der Datenbank ausführen
● Die Rechte können ein Stück weit unabhängig festgelegt
werden
Stored Procedures
● Signifikante Unterschiede zwischen PostgreSQL und MySQL
● Wir schauen uns das hier also separat an!
Anwendungslogik in Stored
Procedure?
SQL Masterclass
Stored Procedure...
● Kein Overhead (z.B. PHP -> MySQL -> PHP)
● Kann direkt auf Daten zugreifen
● Ein Befehl kann mehrere Aktionen ansteuern (z.B. Log-Eintrag
schreiben, Daten zurückgeben,...)
● Das kann sehr komfortabel sein
Stored Procedure...
● Aber:
○ Das Testen von Stored Procedures ist oft aufwendiger
○ Für die Anwendung existiert oft schon ein
Testing-Framework
○ Man ist gefesselt an ein Datenbanksystem
○ Stored Procedures unterscheiden sich sehr zwischen
MySQL und PostgreSQL
○ Oft ist das Aufwendige eher das Zusammensammeln der
Daten (z.B. komplexe GROUP BYs)
○ Das kann auch eine Procedure nicht beschleunigen
Volltextsuche
SQL Masterclass
Volltextsuche
● Problem:
○ Das Durchsuchen von vielen Dokumenten dauert oft sehr
lange
○ Es gibt viele “nutzlose” Wörter, die nicht viel mit dem Inhalt
zu tun haben: der, die, das, ist, …
○ Zudem: Plural-Formen müssen in Singular-Formen
umgewandelt werden (Stemming):
● Bücher -> Buch
● Datenbanken -> Datenbank
Volltextsuche
● Volltextsuche ist also kein “triviales” Problem
● Wir können eine rudimentäre Volltextsuche auch direkt in
MySQL oder PostgreSQL ausführen
● Wichtig:
○ Wenn wir mehr Kontrolle über den Prozess benötigen…
○ … Hadoop, Spark, Elasticsearch,...
○
Volltextsuche
● Zudem:
○ MySQL und PostgreSQL unterscheiden sich in der
Schreibweise und den Features sehr
○ Der Kurs teilt sich hier also auf
● Generell gilt:
○ PostgreSQL bietet hier ein paar mehr Optionen
○ Dafür ist das Ansteuern etwas komplizierter
Trigger
SQL Masterclass
Trigger
● Problem:
○ Manchmal möchten wir, dass Dinge vor / nach einem
Update / Insert / Delete automatisch passieren
○ Beispiel:
● Eine Überweisung wird in die entsprechende Tabelle
geschrieben
● Der Kontostand vom Kunden soll automatisch
aktualisiert werden
Trigger
● Mit Triggern können wir.
○ Code ausführen
○ Zeitpunkt:
● Vor / Nach
● UPDATE / DELETE / INSERT
Trigger
● MySQL und PostgreSQL bieten beide die Möglichkeit für
Trigger
● Allerdings unterscheidet sich die Schreibweise sehr
● => Wir gehen daher auf beide Datenbanksysteme separat ein!
Constraints
SQL Masterclass
Constraints
● Mit Constraints können Daten automatisch validiert werden
● Beispiel:
○ Der Titel muss mindestens 3 Zeichen lang sein
● Aber:
○ Wo gehört diese Validierung hin?
○ Datenbank?
○ Anwendungslogik?
Constraints
● Werden von PostgreSQL nativ unterstützt
● MySQL unterstützt keine Constraints (nur Foreign Key
Constraints)
○ Aber wir können über Trigger ein ähnliches Verhalten
erzeugen!
Schlussworte
SQL Masterclass
Schlussworte:
Vielen Dank, dass ich dir SQL
beibringen durfte!
SQL Masterclass
Du hast jetzt einiges gelernt...
● Von einfachen Queries…
● … bis hin zu komplexen Abfragen,
● Indexes, Fremdschlüssel,
● Volltextsuche,
● Stored Functions / Procedures, Trigger,...
Wie geht es jetzt weiter?
● Du beherrscht jetzt SQL als Abfragesprache
● Aber:
○ I.d.R. entwickelst du ja eine Anwendung, die SQL nutzt
○ Du könntest dir dort noch die Tools anschauen, wie du
möglichst komfortabel die Datenbank ansteuern kannst
○ Beispiel: Object Relational Mapper