Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Lernen Sie SQL ohne Datenbank-Vorkenntnisse
Als Einsteiger:in werden Sie in diesem Buch Schritt für Schritt an die Arbeit mit SQL herangeführt. Vom Aufbau über das Ändern einer Datenbank und die Auswertung der Daten bis hin zur Administration und zum Verteilen der Datenbank auf verschiedene Server lernen Sie alle wesentlichen Aufgabenstellungen kennen. Die Beispiele sind für MySQL/MariaDB, PostgreSQL und T-SQL getestet.
Grundlagen und praktischer Einsatz
Sie erhalten eine kurze Einführung in die wichtigsten Grundbegriffe und Designregeln für relationale Datenbanken wie ER-Modell, Schlüssel, referenzielle Integrität und Normalformen. Anhand einer Beispieldatenbank, die unter MySQL/MariaDB, PostgreSQL und T-SQL verwendet werden kann, erfahren Sie dann, wie Sie SQL sinnvoll anwenden.
Kenntnisse mit Übungsaufgaben festigen
Jedes Kapitel enthält Übungen, mit denen Sie Ihr frisch erworbenes Wissen testen können. Wenn Sie SQL-Befehle einfach nachschlagen wollen, hilft Ihnen der MySQL-Befehlsindex am Ende des Buches. Darüber hinaus geht der Autor auch auf weiterführende Themen wie NoSQL und SQL Injection ein, die Lust machen, sich über den Grundkurs hinaus vertiefend mit SQL zu beschäftigen.
Unter plus.hanser-fachbuch.de finden Sie die Beispieldatenbank mit rund 1.170 SQL-Anweisungen und die Lösungen zu den Übungsaufgaben zum Download.
Ihr exklusiver Vorteil: E-Book inside beim Kauf des gedruckten Buches
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 814
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Ralf Adams
SQL
Der Grundkurs für Ausbildung und Praxis
Mit Beispielen in MySQL/MariaDB, PostgreSQL und T-SQL
5. Auflage
Ihr Plus – digitale Zusatzinhalte!
Auf unserem Download-Portal finden Sie zu diesem Titel kostenloses Zusatzmaterial.
Geben Sie auf plus.hanser-fachbuch.de einfach diesen Code ein:
plus-6qrL3-2dsm7
Der Autor:
Ralf Adams, BochumKontakt: [email protected]
Alle in diesem Werk enthaltenen Informationen, Verfahren und Darstellungen wurden nach bestem Wissen zusammengestellt und mit Sorgfalt getestet. Dennoch sind Fehler nicht ganz auszuschließen. Aus diesem Grund sind die im vorliegenden Werk enthaltenen Informationen mit keiner Verpflichtung oder Garantie irgendeiner Art verbunden. Autor und Verlag übernehmen infolgedessen keine juristische Verantwortung und werden keine daraus folgende oder sonstige Haftung übernehmen, die auf irgendeine Art aus der Benutzung dieser Informationen – oder Teilen davon – entsteht. Ebenso wenig übernehmen Autor und Verlag die Gewähr dafür, dass beschriebene Verfahren usw. frei von Schutzrechten Dritter sind. Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Werk berechtigt also auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne der Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürften.Die endgültige Entscheidung über die Eignung der Informationen für die vorgesehene Verwendung in einer bestimmten Anwendung liegt in der alleinigen Verantwortung des Nutzers.
Aus Gründen der besseren Lesbarkeit wird auf die gleichzeitige Verwendung der Sprachformen männlich, weiblich und divers (m/w/d) verzichtet. Sämtliche Personenbezeichnungen gelten gleichermaßen für alle Geschlechter.
Bibliografische Information der Deutschen Nationalbibliothek:Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.
Dieses Werk ist urheberrechtlich geschützt.Alle Rechte, auch die der Übersetzung, des Nachdruckes und der Vervielfältigung des Buches, oder Teilen daraus, vorbehalten. Kein Teil des Werkes darf ohne schriftliche Genehmigung des Verlages in irgendeiner Form (Fotokopie, Mikrofilm oder ein anderes Verfahren), auch nicht für Zwecke der Unterrichtsgestaltung – mit Ausnahme der in den §§ 53, 54 URG genannten Sonderfälle –, reproduziert oder unter Verwendung elektronischer Systeme verarbeitet, vervielfältigt oder verbreitet werden.
© 2024 Carl Hanser Verlag München, http://www.hanser-fachbuch.deLektorat: Sylvia HasselbachCopy editing: Sandra Gottmann, WasserburgLayout: der Autor mit LaTeXCoverkonzept: Marc Müller-Bremer, www.rebranding.de, MünchenCovergestaltung und Titelmotiv: Tom West, unter Verwendung von Grafiken von© shutterstock.com/Viktorus
Print-ISBN: 978-3-446-47913-5E-Book-ISBN: 978-3-446-47919-7E-Pub-ISBN: 978-3-446-48028-5
Dieses Buch möchte ich allen Lehrerinnen und Lehrern der ehemaligen Aufbaurealschule in Eslohe, Sauerland, widmen.
Besonders denke ich dabei an meinen Klassenlehrer und späteren Schulleiter, Herrn Schmidt. Durch Ihr stetes Bemühen um jeden Einzelnen sind Sie mir menschlich und als Lehrer ein Vorbild.
Titelei
Impressum
Inhalt
Vorwort zur 5. Auflage
Teil I Was man so wissen sollte
1 Datenbanksystem
1.1 Aufgaben und Komponenten
1.1.1 Datenbank
1.1.2 Datenbankmanagementsystem
1.2 Im Buch verwendete Server
1.2.1 MySQL und MariaDB
1.2.2 PostgreSQL
1.2.3 Microsoft SQL Server
2 Relationale Datenbanken
2.1 Einführung
2.1.1 Abgrenzung zu anderen Datenbanken
2.1.2 Tabelle, Zeile und Spalte
2.1.3 Schlüssel, Primärschlüssel und Fremdschlüssel
2.2 Kardinalitäten und ER-Modell
2.2.1 Darstellung von Tabellen im ER-Modell
2.2.2 1:1-Verknüpfung
2.2.2.1 Wann liegt eine 1:1-Verknüpfung vor?
2.2.2.2 Wie kann ich eine 1:1-Verknüpfung darstellen?
2.2.2.3 Kann ich die Kardinalität genauer beschreiben?
2.2.3 1:n-Verknüpfung
2.2.3.1 Wann liegt eine 1:n-Verknüpfung vor?
2.2.3.2 Wie kann ich eine 1:n-Verknüpfung darstellen?
2.2.3.3 Kann ich die Kardinalität genauer beschreiben?
2.2.4 n:m-Verknüpfung
2.2.4.1 Wann liegt eine n:m-Verknüpfung vor?
2.2.4.2 Wie kann ich eine n:m-Verknüpfung darstellen?
2.2.4.3 Kann ich die Kardinalität genauer beschreiben?
2.2.5 Aufgaben zum ER-Modell
2.3 Referenzielle Integrität
2.3.1 Verletzung der referenziellen Integrität durch Löschen
2.3.2 Verletzung der referenziellen Integrität durch Änderungen
2.4 Normalformen
2.4.1 Normalform 1
2.4.2 Normalform 2
2.4.3 Normalform 3
2.4.4 Normalform Rest
3 Unser Beispiel: Ein Online-Shop
3.1 Kundenverwaltung
3.2 Artikelverwaltung
3.3 Bestellwesen
Teil II Datenbank aufbauen
4 Installation des Servers
4.1 MySQL unter Windows 11
4.2 MariaDB unter Windows 11
4.3 Andere Installationen mit Docker
4.3.1 MySQL
4.3.2 MariaDB
4.3.3 PostgreSQL
4.3.4 Microsoft SQL Server
5 Datenbank und Tabellen anlegen
5.1 Die Programmiersprache SQL
5.2 Anlegen der Datenbank
5.2.1 Wie rufe ich den MySQL Client auf?
5.2.2 Wie lege ich eine Datenbank an?
5.2.3 Wie lösche ich eine Datenbank?
5.2.4 Wie weise ich einen Zeichensatz zu?
5.2.5 Wie weise ich eine Sortierung zu?
5.3 Anlegen der Tabellen
5.3.1 Welche Datentypen gibt es?
5.3.2 Wie lege ich eine Tabelle an?
5.3.3 Wann eine Aufzählung (ENUM) und wann eine neue Tabelle?
5.3.4 Wann ein DECIMAL und wann ein DOUBLE?
5.3.5 Wann verwende ich NOT NULL?
5.3.6 Wie lege ich einen Fremdschlüssel fest?
5.3.7 Wie kann ich Tabellen aus anderen herleiten?
5.3.8 Ich brauche mal eben kurz ’ne Tabelle!
6 Indizes anlegen
6.1 Index für Anfänger
6.1.1 Wann wird ein Index automatisch erstellt?
6.1.2 Wie kann ich einen Index manuell erstellen?
6.2 Und jetzt etwas genauer
6.2.1 Wie kann ich die Schlüsseleigenschaft erzwingen?
6.2.2 Wie kann ich Dubletten verhindern?
6.2.3 Was bedeutet Indexselektivität?
6.2.4 Wie kann ich einen Index löschen?
7 Werte in Tabellen einfügen
7.1 Daten importieren
7.1.1 Das CSV-Format
7.1.2 CSV-Daten laden mit LOAD DATA INFILE
7.1.3 Was ist, wenn ich geänderte Werte importieren will?
7.2 Daten anlegen
7.2.1 Wie lege ich mehrere Zeilen mit einem Befehl an?
7.2.2 Wie kann ich eine einzelne Zeile anlegen?
7.2.3 Vorsicht Constraints!
7.2.4 Einfügen von binären Daten über einen C#-Client
7.2.5 Einfügen von binären Daten LOAD FILE
7.3 Daten kopieren
Teil III Datenbank ändern
8 Datenbank und Tabellen umbauen
8.1 Eine Datenbank ändern
8.2 Eine Datenbank löschen
8.3 Eine Tabelle ändern
8.3.1 Wie kann ich den Namen der Tabelle ändern?
8.3.2 Wie kann ich eine Spalte hinzufügen?
8.3.3 Wie kann ich die Spezifikation einer Spalte ändern?
8.3.4 Zeichenbasierte Spalten in der Länge verändern
8.3.5 Zeichensatz verändern
8.3.6 Zeichenbasierte Spalten in numerische Spalten verändern
8.3.7 Numerische Spalten im Wertebereich verändern
8.3.8 Datum- oder Zeitspalten verändern
8.3.9 Wie kann ich aus einer Tabelle Spalten entfernen?
8.4 Eine Tabelle löschen
8.4.1 Einfach löschen
8.4.2 Was bedeuten CASCADE und RESTRICT?
9 Werte in Tabellen verändern
9.1 WHERE-Klausel
9.1.1 Wie formuliere ich eine einfache Bedingung?
9.1.2 Wird zwischen Groß- und Kleinschreibung unterschieden?
9.1.3 Wie formuliere ich eine zusammengesetzte Bedingung?
9.2 Tabelleninhalte verändern
9.2.1 Szenario 1: Einfache Wertzuweisung
9.2.2 Szenario 2: Berechnete Werte
9.2.3 Szenario 3: Gebastelte Zeichenketten
9.2.4 Was bedeuten LOW_PRIORITY und IGNORE?
9.3 Tabelleninhalte löschen
9.3.1 Und was passiert bei Constraints?
9.3.2 Was passiertmit dem AUTO_INCREMENT?
9.3.3 Was bedeuten LOW_PRIORITY, QUICK und IGNORE?
9.3.4 Wie kann ich eine Tabelle komplett leeren?
Teil IV Datenbank auswerten
10 Einfache Auswertungen
10.1 Ausdrücke
10.1.1 Konstanten
10.1.2 Wie kann ich Berechnungen vornehmen?
10.1.3 Wie ermittele ich Zufallszahlen?
10.1.4 Wie stecke ich das Berechnungsergebnis in eine Variable?
10.2 Zeilen- und Spaltenwahl
10.3 Sortierung
10.3.1 Was muss ich bei der Sortierung von Texten beachten?
10.3.2 Wird zwischen Groß- und Kleinschreibung unterschieden?
10.3.3 Wie werden Datums- und Uhrzeitwerte sortiert?
10.3.4 Wie kann ich das Sortieren beschleunigen?
10.4 Mehrfachausgaben unterbinden
10.4.1 Fallstudie: Datenimport von Bankdaten
10.4.2 Was muss ich beim DISTINCT bzgl. der Performance beachten?
10.5 Ergebnismenge ausschneiden
10.5.1 Wie kann ich die ersten n Datensätze ausschneiden?
10.5.2 Wie kann ich Teilmengen mittendrin ausschneiden?
10.6 Ergebnisse exportieren
10.6.1 Wie lege ich eine Exportdatei auf dem Server an?
10.6.2 Wie lege ich eine Exportdatei auf dem Client an?
10.6.3 Wie lese ich mithilfe eines C#-Client binäre Daten aus?
11 Tabellen verbinden
11.1 Heiße Liebe: Primär-Fremdschlüsselpaare
11.2 INNER JOIN zwischen zwei Tabellen
11.2.1 Bauanleitung für einen INNER JOIN
11.2.2 Abkürzende Schreibweisen
11.2.3 Als Datenquelle für temporäre Tabellen
11.2.4 JOIN über Nichtschlüsselspalten
11.3 INNER JOIN über mehr als zwei Tabellen
11.4 Es muss nicht immer heiße Liebe sein: OUTER JOIN
11.5 Narzissmus pur: Self Join
11.6 Eine Verknüpfung beschleunigen
12 Differenzierte Auswertungen
12.1 Statistisches mit Aggregatfunktionen
12.2 Tabelle in Gruppen zerlegen
12.3 Gruppenergebnisse filtern
12.4 Noch Fragen?
12.4.1 Kann ich nach Ausdrücken gruppieren?
12.4.2 Kann ich nach mehr als einer Spalte gruppieren?
12.4.3 Wie kann ich GROUP BY beschleunigen?
12.4.4 Parallele Bearbeitung – unterschiedliche Ergebnisse?
12.5 Aufgaben
13 Auswertungen mit Unterabfragen
13.1 Das Problem und die Lösung
13.2 Nicht korrelierende Unterabfrage
13.2.1 Skalarunterabfrage
13.2.1.1 Beispiel 1: Banken mit höchster BLZ
13.2.1.2 Beispiel 2: Überdurchschnittlich teure Artikel
13.2.1.3 Beispiel 3: Überdurchschnittlich wertvolle Bestellungen
13.2.2 Listenunterabfrage
13.2.2.1 Beispiel 1: IN()
13.2.2.2 Beispiel 2: ALL()
13.2.2.3 Beispiel 3: ALL()
13.2.2.4 Beispiel 4: ANY()
13.2.2.5 Unterschied zwischen IN(), ALL() und ANY()
13.2.2.6 Unterschied zwischen NOT IN() und <> ALL()
13.2.3 Tabellenunterabfrage
13.3 Korrelierende Unterabfrage
13.3.1 Beispiel 1: Rechnungen mit vielen Positionen
13.3.2 Beispiel 2: EXISTS
13.4 Common Table Expression versus Unterabfrage
13.5 Fallstudie Datenimport
13.6 Wie ticken Unterabfragen intern?
13.7 Aufgaben
14 Mengenoperationen
14.1 Die Vereinigung mit UNION
14.2 Die Schnittmenge
14.2.1 Mit INTERSECT
14.2.2 Mit Unterabfragen
14.3 Die Differenzmenge
14.3.1 Mit EXCEPT
14.3.2 Mit Unterabfragen
14.4 UNION, INTERSECT und EXCEPT ... versteh’ ich nicht!
15 Bedingungslogik
15.1 Warum ein CASE?
15.2 Einfacher CASE
15.3 Searched CASE
15.4 Fallbeispiele
15.4.1 Lagerbestand überprüfen
15.4.2 Kundengruppen ermitteln
15.4.3 Aktive Lieferanten ermitteln
15.4.4 Aufgaben
16 Ansichtssache
16.1 Was ist eine Ansicht?
16.1.1 Wie lege ich eine Ansicht an?
16.1.2 Wie wird eine Ansicht verarbeitet?
16.1.3 Wie lösche ich eine Ansicht?
16.1.4 Wie ändere ich eine Ansicht?
16.2 Anwendungsgebiet: Vereinfachung
16.3 Anwendungsgebiet: Datenschutz
16.4 Grenzen einer Ansicht
17 Exkurs NoSQL
17.1 Vorbereitung der MySQL-Shell
17.2 Datenmodellierung desWarenkorbs
17.2.1 JavaScript Object Notation (JSON)
17.2.2 Struktur unseres JSON-Dokuments
17.3 NoSQL:MySQLmit JavaScript-Client
17.3.1 Anlegen einesWarenkorbs
17.3.2 Inhalte des Warenkorbs anlegen
17.3.3 Inhalte des Warenkorbs auswerten
17.3.4 Inhalte des Warenkorbs verändern
17.4 NoSQL: klassisches SQL mit JSON-Funktionen
17.4.1 Anlegen einesWarenkorbs
17.4.2 Inhalte des Warenkorbs anlegen
17.4.3 Inhalte des Warenkorbs auswerten
17.4.4 Inhalte des Warenkorbs verändern
17.4.5 Inhalte des Warenkorbs löschen
Teil V Anweisungen kapseln
18 Locking
19 Transaktionen
19.1 Das Problem
19.2 Was ist eine Transaktion?
19.3 Isolationsebenen
19.3.1 READ UNCOMMITTED
19.3.2 READ COMMITTED
19.3.3 REPEATABLE READ
19.3.4 SERIALIZABLE
19.4 Fallbeispiel in C#
19.5 Deadlock
20 Prozeduren
20.1 Einstieg und Variablen
20.2 Verzweigung
20.2.1 Einfache Verzweigung mit IF
20.2.2 Mehrfache Verzweigung mit CASE
20.3 Schleifen
20.3.1 LOOP-Schleife
20.3.2 WHILE-Schleife
20.3.3 REPEAT-Schleife
20.4 Transaktion innerhalb einer Prozedur
20.5 Cursor
20.6 Aufgaben
21 Funktionen
22 Auslöser
22.1 Was ist das?
22.2 Ein Beispiel für einen INSERT-Trigger
22.3 Ein Beispiel für einen UPDATE-Trigger
22.4 Ein Beispiel für einen DELETE-Trigger
23 Ereignisse
23.1 Wie lege ich ein Ereignis an?
23.2 Wie werde ich Ereignisse wieder los?
Teil VI Anhänge
24 Datenbank administrieren
24.1 Daten sichern und wiederherstellen
24.1.1 Backup
24.1.2 Restore
24.2 Benutzerrechte
24.2.1 Benutzerrechte und Privilegien
24.2.2 Benutzer anlegen und Rechte zuweisen
24.2.2.1 CREATE USER bzw. CREATE ROLE
24.2.2.2 Rechte vergeben mit GRANT
24.2.2.3 Rechte entziehen mit REVOKE
24.3 MySQL und MariaDB Engines
25 SQL-Injection
25.1 Das Problem
25.2 Beispiel: Suchmaske
25.3 Gegenmaßnahmen
25.3.1 Never Trust an Unknown Input
25.3.2 Trennung von Anweisungen und Daten
25.3.2.1 Verwenden Sie Prozeduren oder Funktionen
25.3.2.2 Verwenden Sie Prepared Statements
25.3.3 Ich darf nur, was ich soll
25.3.4 Nichtssagende Fehlermeldungen
26 SQL-Referenz
26.1 Datentypen
26.1.1 Numerische Datentypen
26.1.1.1 Ganze Zahlen
26.1.1.2 Gebrochene Zahlen
26.1.2 Zeichen-Datentypen
26.1.3 Datums- und Zeit-Datentypen
26.1.4 Binäre Datentypen
26.1.5 JSON
26.1.6 Räumliche Datentypen
26.1.7 Standardwerte
26.1.8 Zusätze für Datentypen
26.2 Operatoren und Funktionen
26.2.1 Mathematische Operatoren
26.2.2 Mathematische Funktionen
26.2.3 Aggregatfunktionen
26.3 Bedingungen
26.3.1 Vergleichsoperatoren
26.3.2 Logikoperatoren
26.3.2.1 NOT, Negation, ¬
26.3.2.2 AND, Konjunktion, ∧
26.3.2.3 OR, Disjunktion, ∨
26.3.2.4 XOR, Antivalenz, ⊗
26.3.2.5 Verallgemeinerung auf mehr als zwei Operanden
26.4 Befehle
26.4.1 Data Definition Language
26.4.2 DataManipulation Language
26.4.3 Benutzerverwaltung
27 Ausgewählte Quelltexte
27.1 DOUBLE versus DECIMAL
27.2 Rundungsfehler
27.3 NULL versus NOT NULL
27.4 Suchen mit und ohne Index
27.5 Messen der Performance der Einfügeoperation
27.6 Messen der Indexselektivität
27.7 Sortieren ohne und mit Index
28 Quelltexte
28.1 MySQL/MariaDB
28.1.1 Quelltexte zu Teil II
28.1.2 Quelltexte zu Teil III
28.1.3 Quelltexte zu Teil IV
28.1.4 Quelltexte zu Teil V
28.1.5 Quelltexte zu Teil VI
28.2 PostgreSQL
28.2.1 Quelltexte zu Teil II
28.2.2 Quelltexte zu Teil III
28.2.3 Quelltexte zu Teil IV
28.2.4 Quelltexte zu Teil V
28.3 Microsoft SQL Server
28.3.1 Quelltexte zu Teil II
28.3.2 Quelltexte zu Teil III
28.3.3 Quelltexte zu Teil IV
Literatur
Und noch ’n SQL-Buch. Es gibt so viele SQL-Bücher, dass man berechtigt die Frage stellen kann, warum man noch eines braucht. Ich kann die Frage nur indirekt beantworten. Als Lehrer für Anwendungsentwicklung an einemBerufskolleg habe ich über Jahre erlebt, dass die Auszubildenden sich sehr mit den üblichen Büchern abmühen.
Die fachlicheQualität dieser Bücher ist unbestritten. Aber die Sprache ist meist von IT-Profi zu IT-Profi, und genau damit sind Auszubildende und Berufsanfänger oft überfordert – zumindest wird der Einstieg erschwert.
Ich habe daher begonnen, leicht verständliche Skripte zu schreiben, aus denen sich dieses Buch speist. Dabei werden Befehle didaktisch reduziert und Beispielemöglichst lebensnah ausgesucht. Fachbegriffe werden nur verwendet, wenn sie IT-sprachlicher Umgang sind; akademische Begriffe werden vermieden, wobei ich ihre Berechtigung nicht in Abrede stellen möchte.
Primärziel ist ein möglichst umfangreicher Ersteinstieg, der dann durch berufliche Praxis ausgebaut werden kann. Trotzdem vertiefe ich an vielen Stellen im Buch den Einblick in SQL oder den MySQL Server – zum einen, um zu zeigen, dass ich auch ein bisschen was draufhabe, zumanderen, umNeugierde und Jagdtrieb beimLeser1 zu wecken.
Ein weiterer Grund für dieses Buch ist, dass es mir großen Spaß gemacht hat, es zu schreiben. Ich hoffe, dass es Ihnen genau so viel Spaß macht, es zu lesen und damit zu arbeiten. Falls Sie mich fachlich korrigieren oder ergänzen möchten, senden Sie mir doch bitte eine E-Mail an [email protected].
Der Titel des Buches ist SQL und nicht MySQL. Ich habe deshalb an vielen Stellen den Unterschied zwischen SQL-Standard und seinen Dialekten aufgezeigt. Trotzdem wird es schwer sein, die Beispiele einfach so auf andere DBMS zu übertragen. Auf jeden Fall werden Sie ein Verständnis für den allgemeinen Aufbau und die Funktionsweise der Befehle erwerben, sodass Sie leicht die verschiedenen SQL-Dialekte adaptieren können.
Bitte beachten Sie, dass die Pfadangaben in den Skriptenmit LOAD DATA INFILE angepasst werden müssen, je nachdem, wo Sie die Daten entpacken.
Ich habe angefangen, für die Aufgaben Musterlösungen bei YouTube (http://www.youtube.com/channel/UCu4ZybNXw1y4Rs4Mgx-4HKw) einzustellen. In diesen Videos kann ich einfach besser erklären, worauf es bei den Lösungen ankommt.
Wenn Sie auf
plus.hanser-fachbuch.de
den Code
plus-6qrL3-2dsm7
eingeben, können Sie Skripte, Beispiele und Musterlösungen downloaden. Diese wurden auf folgenden Servern getestet: MySQL Community Server 8.0.33, MariaDB 10.6.14, MariaDB 11.0.2, PostgreSQL 15.3 und MS SQL Server 2022 16.x. Alle Server liefen in einer Dockerinstanz unter Debian 12 (Bookworm). Für alle Quelltexte, die bis einschließlich Kapitel 16 vorgestellt werden, gibt es Varianten in MySQL/MariaDB, PostgreSQL und T-SQL. Nur bei ganz wenigen Ausnahmen, die durch die Dialekte oder Eigenheiten begründet sind, musste ich auf eine Transkription verzichten.
Seit kurzem gibt es außerdem im Hanser Verlag den Hanser eCampus, das adaptive Kursangebot für die Hochschullehre und die Unternehmensweiterbildung. Hier ist der E-Learning-Kurs Datenbankgrundlagen erschienen, der auf Teil I dieses Buches basiert. Weitere Infos zum Kurs und eine Demoversion finden Sie hier:https://www.hanser-ecampus.de/kurse/informatik/datenbankgrundlagen.
Als Erstes möchte ich mich bei Frau Sylvia Hasselbach vom Hanser Verlag dafür bedanken, dass sie diese Neuauflage – wie schon die Vorauflagen – angestoßen und vorangetrieben hat. Frau Rothe und Frau Gottmann haben sprachliche Ausrutscher und allzu flapsige Formulierungen glatt gebügelt. Das Layout wurde von Frau Irene Weilhart betreut.
Besonders will ich mich bei meinen Schülerinnen und Schülern der Technischen Beruflichen Schule 1 in Bochum (http://www.tbs1.de) bedanken. Die hier vorgestellten Beispiele und Konzepte sind in großen Teilen durch ihre schonungslose Kritik an bestehenden Lehrmaterialien entstanden. Das penetrante Kapier ich nicht! hat mich immer weiter angespornt, es noch verständlicher zu versuchen. Falls dieses Buch SQL gut vermittelt, ist das auch deren Verdienst.
Dass nun aber die 5. Auflage dieses Buchs erscheinen kann, ist in erster Linie Ihnen, liebe Leserinnen und Leser, zu verdanken; dafür ein herzliches Dankeschön!
Ralf Adams, September 2023
1 Der besseren Lesbarkeit wegen verzichte ich auf Weiblich-männlich-Konstruktionen. Bitte verstehen Sie dies nicht als stillschweigende Hinnahme des geringen Frauenanteils in den IT-Berufen.
Es werden die wichtigsten Aufgaben und Komponenten eines Datenbanksystems vorgestellt. Die Begriffe werden lediglich eingeführt, weil sich ein detailliertes Verständnis erst in den nachfolgenden Kapiteln entwickeln kann.
Grundkurs
Datenbank
Datenbankmanagementsystem
Datenbanksystem
Ein Datenbanksystem besteht aus einem Datenbankmanagementsystem (DBMS) und den Datenbanken (DB). Beide Komponenten sind in der Praxis eng miteinander verzahnt, sollten aber gedanklich unterschieden werden.
In Bild 1.1 ist der Aufbau eines Datenbanksystems schematisch dargestellt. Die Datenbanken enthalten die eigentlichen Daten und unmittelbar damit verknüpfte Datenobjekte wie z.B. eine Ansicht (siehe Kapitel 16). Über eine Kommunikationsschnittstelle werden diese Datenobjekte vom DBMS verwaltet. Das DBMS selbst besteht wiederum aus vielen kleinen Komponenten, die jeweils auf eine Aufgabe spezialisiert sind.
1.1.1DatenbankDie Aufgabe der Datenbank ist die logische und physische Verwaltung der Daten und damit eng verbundener Datenobjekte. Alle diese Datenobjekte können vom Programmierer angelegt, geändert und gelöscht werden. Die Änderungen beziehen sich sowohl auf die Struktur als auch auf den Inhalt. So können einer Tabelle neue Spalten (z.B. zweiter Vorname bei einer Adresse) als auch neue Zeilen (z.B. eine neue Adresse) hinzugefügt werden.
Üblicherweise werden in einer Datenbank folgende Datenobjekte vorkommen1:
Tabellen: Bei einer relationalen Datenbank werden die Daten in Tabellen organisiert (Kundentabelle, Artikeltabelle, Filmtabelle usw.). Deshalb sind die Tabellen das Herzstück einer Datenbank. Alle anderen Datenbankobjekte sind aus diesen Tabellen abgeleitet oder verwenden diese.
Bild 1.1Aufbau eines Datenbanksystems
Temporäre Tabellen: Sie werden explizit vom Programmierer oder implizit vom Optimierer angelegt, um Zwischenergebnisse wiederverwendbar zu machen. In der Regel werden diese automatisch nach Beendigung einer Sitzung gelöscht.
Indizes:Diese erlauben eine erhebliche Beschleunigung bestimmter Auswertungen. Die Daten aus den Tabellen werden dabei in frei wählbaren, aber festgelegten Reihenfolgen sortiert.
Ansichten: Auf Vorrat gebastelte Auswertungen, die wie Tabellen verwendet werden können, ohne dabei einen eigenen Datenbestand aufzubauen.
Prozeduren: Kleine, selbst geschriebene SQL-Programme, die auf dem Server ausgeführt werden.
Trigger: Auch kleine, selbst geschriebene Programme, die aber automatisch aufgerufen werden, wenn Daten in den entsprechenden Tabellen verändert werden.
Ereignisse: Schon wieder kleine, selbst geschriebene Programme, die zeitgesteuert aufgerufen werden.
Definition 1: Datenbank (eng)
Unter einer Datenbank im engeren Sinn versteht man eine Informationssammlung, die so strukturiert ist, dass sie zweckgebunden und effizient IT-gestützt verwaltet und ausgewertet werden kann.
Entscheidend ist, dass die Daten strukturiert sind! Jede Informationssammlung, die eine gewisse Struktur hat, kann letztlich von einem Computerprogramm verwaltet und ausgewertet werden. Fehlt die Struktur, sieht das Ganze schon anders aus.
Aufgabe 1.1: Überlegen Sie sich mindestens zwei Beispiele für strukturierte und unstrukturierte Datensammlungen.
In MySQL und MariaDB werden die Datenbanken durch die Storage Engines (z.B. InnoDB bzw. XtraDB) realisiert. Diese legen auf den Festspeicherplatten die Dateien an, in denen die Daten abgespeichert werden. Auch die Zugriffskontrolle erfolgt durch die Storage Engines.
1.1.2DatenbankmanagementsystemOben habe ich erwähnt, dass ein Datenbanksystem aus der Datenbank und einem Datenbankmanagementsystem besteht.
Definition 2: Datenbankmanagementsystem (DBMS)
Eine Toolsammmlung zur Verwaltung, Bearbeitung und Auswertung einer Datenbank nennt man Datenbankmanagementsystem (DBMS).
Dies sind die Aufgaben eines DBMS2:
Sprachinterpreter: Herzstück desDBMS ist der Interpreter3. Dieser übersetzt die Befehle in einen ausführbaren Code. Die Sprache, die wir hier im Buch verwenden werden, ist SQL. Es gibt und gab aber auch andere Datenbankabfragesprachen wie zum Beispiel dBase, VB für MS-Access, OO-SQL, Sequel usw.
Optimierer: Die Ausführung eines SQL-Befehls kann oft auf verschiedene Art undWeise passieren. Der Optimierer versucht, anhand von Schätzungen und Algorithmen einen Plan für die Ausführung anzulegen, der möglichst schnell abgearbeitet werden kann.
Sitzungsverwaltung:Wann immer ein Befehl an den Server gesendet werden soll, muss man sich in einer Sitzung (engl. session) befinden. Dazu muss zuerst eine Sitzung geöffnet werden. Jetzt können beliebig viele SQL-Befehle gesendet und Daten empfangen werden. Zum Schluss wird die Sitzung serverseitig – z.B. durch einen Timeout – oder clientseitig beendet.
Randbedingungsprüfer: Für Tabellen können Randbedingungen (engl. constraints) formuliert werden, die immer gelten müssen. Würde die Ausführung eines Befehls dazu führen, dass diese Randbedingungen nicht erfüllt sind, wird die Ausführung des Befehls in der Regel verweigert.
Datenschutz: Durch die Vergabe von Zugriffsrechten kann das Recht auf lesende und schreibende Zugriffe so wie auf das Ausführen von Prozeduren passgenau zugeschnitten werden.
Datensicherheit: Der Verlust von Daten ist der GAU4 schlechthin. Das DBMS muss sicherstellen, dass nicht durch Serverabsturz oder Ähnliches Daten verloren gehen.
Transaktionsmanagement: Transaktionen ermöglichen parallelen Zugriff und eine Art undo im Fehlerfall. Das zu gewährleisten, erfordert eine Menge Mühe. Die Qualität des Transaktionsmanagements ist oft ein entscheidendes Merkmal eines DMBS.
API5: Die Daten werden in der Regel durch eine oder mehrere Anwendungen (Clients) bearbeitet. Damit die Anwendung auf das DBMS zugreifen kann, braucht es eine Schnittstelle, über die es zu den Daten gelangt. Diese APIs werden in der MySQL-/MariaDB-Welt Konnektoren genannt. Der MySQL oder MariaDB Server bietet beispielsweise APIs für C, C++, C#/.NET, Node.js PHP, Perl, Python, Ruby und Tcl. Auch stehen APIs für JDBS6 und ODBC7 zur Verfügung. MariaDB kennt zusätzlich noch Schnittstellen zu Erlang, Jupyter, Excel, Swift und R.
Metadaten: Verwaltungsinformationen, Statistiken etc., eben der ganze Rest.
Der Begriff Datenbankmanagementsystem wird oft anstelle von Datenbanksystem verwendet. Gerade die schematischen Darstellungen in den Dokumentationen der Hersteller unterscheiden nicht zwischen diesen beiden Begriffen.
Sind die Datenbanken eines Datenbankmanagementsystems in Form von Tabellen organisiert, so handelt es sich umein relationales Datenbankmanagementsystem(RDBMS); bei objektorientierten Datenbanken spricht man analog von objektorientierten Datenbankmanagementsystemen (OODBMS).
Und noch der Vollständigkeit halber:
Definition 3: Datenbanksystem
Ein System, welches die Datenbanken und das dazugehörige Datenbankmanagementsystem als Komplettpaket anbietet, nennt man Datenbanksystem.
Kurzporträts der verwendeten SQL Server: Hersteller und Geschichte
Bild 1.2Ranking einiger RDBMSe, Quelle [DE23]
In der ersten Auflage dieses Buchs habe ich fast ausschließlich MySQL/MariaDB als Plattform genutzt. Um SQL breiter vorstellen zu können, wurden in der zweiten Auflage die meisten Beispiele auch in PostgreSQL angeboten. Konsequenterweise wird seit der dritten Auflage ein weiteres System bedient: der MS SQL Server. Wie Sie Bild 1.2 entnehmen können, decke ich damit eine Vielzahl von Installationen und SQL-Dialekten ab.
Wollen Sie auf die Installation vom Servern verzichten, können Sie auchOnline diverse Server verwenden, um SQL-Code auszuprobieren. Natürlich gibt es dabei Einschränkungen. Ich empfehle: http://sqlfiddle.com/ und https://dbfiddle.uk/.
1.2.1MySQL und MariaDBDie schwedische Firma MySQL AB hat MySQL von 1994 bis 2008 entwickelt. Die ursprüngliche Intention war eine verbesserte und beschleunigte Verarbeitung eines selbst entwickelten Tabellensystems mit dem Namen ISAM. Dazu wurde mSQL (kein Tippfehler!) genutzt. Von 2008 bis 2010 wurde MySQL von Sun Microsystems gepflegt, und seit Januar 2010 wird MySQL unter dem Schirmvon Oracle weiterentwickelt.
Der Name MySQL kommt nicht vom englischen my (mein). Einer der Firmengründer, Michael Widenius, hat sympathischerweise den Vornamen My seiner Tochter verwendet. Der Name des Delphins im Logo ist Sakila. Er wurde in einem Wettbewerb ermittelt, den der Open Source-Entwickler Ambrose Twebaze aus Uganda gewann. Sakila ist ein Mädchenname in der Sprache siSwati und auch der Name einer Stadt in Tansania.
Nach der Übernahme von MySQL durch Oracle haben die Spannungen zwischen den Entwicklern und Oracle ständig zugenommen, sodass der Erfinder von MySQL – Michael Widenius – sich mit der neu erstellen Engine Aria von MySQL abgespalten und 2009 das Projekt MariaDB ins Leben gerufen hat. Wie MySQL ist auch dieses Projekt nach einer Tochter von Widenius benannt. Wegen seiner offeneren Lizenzpolitik und der schnelleren Umsetzung von Neuerungen und Bugfixes hat MariaDB an vielen Stellen – aber nicht, wie oft behauptet, an den meisten –MySQL abgelöst (siehe Bild 1.2).
MySQL und MariaDB sind Client-Server-Datenbanksysteme. Ein Server stellt alleine oder im Verbund mit anderen Servern den Anwendungen (Clients) die Datenbankdienste zur Verfügung. Der MySQL-/MariaDB-Server besteht – wie jedes DBMS – aus vielen Komponenten, die hier kurz angerissen werden.
Bild 1.3Komponenten von MySQL und MariaDB
Konnektoren (Verbinder): Der Client baut über die Konnektoren eine Sitzung zum Server auf. Dies erfolgt über das TCP/IP-Protokoll und in der Regel über den Port 3306.
Connection-Pool:Hier werden die Verbindungen zu den Clients verwaltet. Beim Verbindungsaufbau wird anhand des Benutzernamens und des Passworts die Verbindungsan-frage authentifiziert. Ist die Anzahl der maximal verfügbaren Verbindungen (Connections Limits) nicht überschritten, wird ein Verbindungsthread eingerichtet. Ebenso werden die anderen Grenzwerte für die Verbindung überwacht: Datenübertragungsvolumen, Timeout etc.
SQL-Schnittstelle: Hier werden die SQL-Befehle entgegengenommen. Sie werden dann zum Parser weitergereicht.
Parser: Der Parser überprüft die Syntax eines Befehls und ob man die Ausführungsrechte für diesen Befehl hat.
Optimizer (Optimierer): Anhand von Schätzungen, Statistiken und Algorithmen wird für nicht triviale Befehle ein Ausführungsplan erstellt. Dieser Ausführungsplan berücksichtigt ggf. im Cache vorhandene Ergebnisse.
Caches und Buffers (Zwischenspeicher): Daten und Ergebnisse können in Zwischenspeichern aufgehoben werden.8
Storage Engines: Die Motoren des Servers. Hier werden die Daten tatsächlich verarbeitet. Jede Engine ist dabei für bestimmte Aufgabenstellungen besonders gut geeignet. Der große Vorteil von MySQL und MariaDB ist, dass jeder mit einem besonderen Bedarf eine Engine bauen kann. Er muss nur die Schnittstellen beachten (siehe [MyS21e]) und kann dann seine Speziallösungen anbieten.
File System (Dateisystem): Je nach Betriebssystem werden hier Daten in unterschiedlichen Dateisystemen (NTFS, BTRFS, ETX4 etc.) abgelegt. Bis auf die Frage, ob das Dateisystem zwischen Groß- und Kleinschreibung unterscheidet, spielt dieses für die SQL-Programmierung keine Rolle.
Management Services & Utilities: Parallel dazu gibt es die vielen kleinen Helferlein, ohne die nichts geht: für das Sichern und Wiederherstellen von Daten, Datenreplikation, Administration und Konfiguration, Datenmigration undMetadaten.
Zur Geschichte von MySQL gibt es einen netten Absatz in Wikipedia (https://de.wikipedia.org/wiki/MySQL#Geschichte) und Dokumentation und Downloads finden Sie auf http://www.mysql.com. Die Homepage von MariaDB ist unter https://mariadb.org zu finden. Eine kurze, aber gute Übersicht bezüglich der aktuellen Unterschiede zwischen MariaDB und MySQL, finden Sie unter [Ahm22].
In den nachfolgenden Kapiteln werden wir gemeinsam eine Datenbank planen, installieren, einrichten, verändern und verwenden. Dabei werden die vielen Fragen beantwortet, die Sie nach dieser kurzen Einführung mit Sicherheit haben werden, also nur Geduld . . .
1.2.2PostgreSQLGeboren wurde PostgreSQL 1986 als Projekt an der Universität von Kalifornien, Berkeley. Professor Michael Stonebraker9 begann das Projekt als Nachfolgeprojekt der Ingres-Datenbank, welche ebenfalls noch heute verwendet wird. Daher leitet sich auch der Name her: post ingres. In den nächsten acht Jahren wurde Postgres von Prof. Stonebraker und seinen Studenten immer weiter entwickelt. Bis 1995 verstand Postgres allerdings kein SQL, sondern nur eine eigene Sprache namens POSTQUEL.Die beiden Doktoranden Andrew Yu und Jolly Chen haben Postgres um SQL erweitert und als Postgres95 veröffentlicht.
1996 wurde Postgres95 als Open-Source-Projekt der Netzgemeinde zur Verfügung gestellt und wird seitdem sehr stark von Unterstützern weiterentwickelt und gefördert. Ebenso wurde das Erscheinungsjahr aus dem Produktnamen entfernt und die Datenbank heißt seitdem PostgreSQL.
Weitere Informationen über die Geschichte von PostgreSQL und die aktuellen Features des Servers können Sie auf der Homepage des Projekts (https://www.postgresql.org) nachlesen. Von http://www.postgresql.org/download/ können Sie die aktuelle PostgreSQL-Version für Linux-Distributionen und Windows herunterladen. Eine sehr ausführliche Online-Dokumentation steht unter http://www.postgresql.org/docs/ zur Verfügung.
1.2.3Microsoft SQL ServerAnders als bei den anderen Datenbankservern kann ich hier keine Geschichten über Töchter oder Universitätslaufbahnen erzählen. Die Entwicklung des MS SQL Servers ist da schon etwas nüchterner ([Gar16]).
In Kooperation mit Sybase brachte Microsoft 1989 die erste Version seines Servers auf den Markt. Zielplattform war das Betriebssystem OS/2. Die Kooperation sah so aus, dass beide gemeinsam am Sybase Server arbeiteten und Sybase das Produkt unter seinem Namen auf UNIX-basierenden Systemen anbot und Microsoft auf OS/2. Spätestens seit 1992 speist sich der Quelltext beider Server-Produkte (Sybase 4.0 und MS SQL Server 4.2) gleichwertig aus beiden Firmen. Ab 1993 ist nicht mehr OS/2, sondern Windows NT die Zielplattform des MS SQL Servers. Mit der Portierung auf Windows NT wurden erhebliche Anpassungen notwendig, die nicht mehr für das Sybase-Produkt verwendet werden konnten; die beiden Systeme begannen sich voneinander zu entfernen. Besonders der Wunsch von Sybase, dass der Quelltext möglichst plattformneutral bleiben sollte, widersprach den strategischen Zielen Microsofts, die eine volle Unterstützung der damals wirklich bedeutsamen Neuerungen von Windows NT anstrebten.
Microsoft entschied, dass der SQL Server ein zentrales Produkt für die Windows NT Strategie werden sollte. Daher wurden von anderen Datenbankherstellern erfahrene Entwickler angeworben. Dieses geballte Know-how mündete 1998 in die Serverversion 7.0 mit dem Arbeitstitel Sphinx. Mit dieser völlig überarbeiteten Version wurde auch die Zusammenarbeit mit Sybase überflüssig und beide Produkte sind seitdem voneinander unabhängig. Es kamen Sprachelemente hinzu, die Sicherheit wurde verbessert, die Performance gesteigert, die Stabilität erhöht, andere Betriebssysteme werden unterstützt usw. Besonders das grafische Frontend und die hohe Integration in die Visual Studio Entwicklungsumgebung werden von vielen Entwicklern geschätzt.
Anders als MySQL/MariaDB oder PostgreSQL kommt der MS SQL Server aber nicht aus der Open-Source- oder Uni-Ecke. Er ist ein rein kommerzielles Produkt und hat daher in den entsprechenden Kreisen ein Imageproblem.
Der MS SQL Server kann in verschiedenen Varianten von https://www.microsoft.com/de-de/sql-server/sql-server-downloads bezogen werden; die Dokumentation liegt in https://docs.microsoft.com/de-de/sql/?view=sql-server-ver15.
1 Die Liste ist nicht vollständig. Ich werde mich aber in diesem Buch auf diese beschränken.
2 Je nach Hersteller oder Lesart finden Sie andere Aufgabensammlungen, aber mit dieser kommen wir schon sehr weit.
3 Es ist müßig, darüber zu streiten, ob es sich um einen Interpreter oder einen Compiler oder einen Jitter handelt. Warum? Weil es keinen interessiert ;-)
4 Abkürzung für: Größter anzunehmender Unfall
5 Abkürzung für: Application Programming Interface; engl. für Programmierschnittstelle
6 Abkürzung für: Java Database Connectivity: Programmierschnittstelle für JAVA
7 Abkürzung für: Open Database Connectivity: Eine offene standardisierte Schnittstelle. Sie wird von fast allen Datenbanksystemherstellern angeboten. Wer ODBC-Programme schreibt, kann leichter zwischen verschiedenen Datenbanksystemherstellern wechseln.
8 MySQL hat ab Version 8.0 den Cache abgeschafft ([MyS18c]); MariaDB verwendet ihn weiterhin ([Mar23b]).
9 Prof. Stonebraker ging später mit einem Fork von Postgres – Illustra – zu Informix, welche den Fork in den Universal Server integrierte. Auch diese Datenbank besteht heute noch.