Das Buch umfasst 480 Seiten. Das Inhaltsverzeichnis gibt einen Überblick über die behandelten Themen. Anschließend folgt die Liste der ausgesparten Themen.
Inhaltsverzeichnis
Vorwort | |
1 | Das Problem mit dem Problem |
1.1 | Sssickwl? |
1.2 | Die ersten Fragen |
1.2.1 | Voraussetzungen |
1.2.2 | Welches Datum haben wir heute? |
1.2.3 | Hello World |
1.3 | Abfrage von echten Tabellen |
1.3.1 | Anzeige von Tabelleninhalten – und mehr |
1.3.2 | Die erste Textaufgabe |
2 | Wer oder was und woher? (Navigation im Datenmodell) |
2.1 | Beispielschema |
2.2 | Welche Mitarbeiter haben wir? (Abfrage von Details aus einer Tabelle) |
2.2.1 | Die benötigten Tabellen ermitteln |
2.2.2 | Die erforderlichen Spalten auswählen |
2.3 | In welchen Abteilungen sind die Mitarbeiter? (Abfrage über zwei Tabellen) |
2.3.1 | Navigation im Datenmodell |
2.3.2 | Formulierung der Abfrage über zwei Tabellen (INNER JOIN) |
2.4 | Welche Abteilungen sind in welchen Regionen? |
2.4.1 | Verbundene Abfrage übervier Tabellen (INNER JOIN) |
2.4.2 | Sortieren der Ergebnisse |
2.5 | In welchen Regionen sind welche Abteilungen? |
2.5.1 | Kehrt, marsch! |
2.5.2 | In welchen Regionen, Ländern und Locations haben wir Abteilungen und in welchen nicht? |
2.6 | Wer arbeitet im Marketing? |
2.6.1 | Abfrage mit Filter (WHERE-Bedingung) |
2.6.2 | Möglichkeiten der Ergebnisfilterung |
2.6.3 | Verneinung von Bedingungen |
2.6.4 | NULL-Werte |
2.6.5 | Verknüpfung von Bedingungen |
2.6.6 | JOIN über WHERE-Bedingungen (ANSI-92-Syntax vs. alte Syntax) |
2.7 | In welchen Regionen sind wir nicht vertreten? |
2.8 | Eine Menge von Mengen – mit APPLY |
2.8.1 | CROSS APPLY |
2.8.2 | OUTER APPLY |
2.9 | Russische Geschäfte |
3 | Wie viel X pro Y? |
3.1 | Wie viel..? |
3.1.1 | Wie viele Mitarbeiter haben wir? |
3.1.2 | Wie viele Mitarbeiter haben ein variables Gehalt? |
3.1.3 | Wie viele Mitarbeiter haben die Abteilungen? |
3.2 | Wie viel X pro Y (unterteilt nach Z)? |
3.2.1 | Wie viele Mitarbeiter haben die Abteilungen. |
3.2.2 | … unterteilt nach Jobs? |
3.2.3 | Zwischensummen und Gesamtsumme |
3.2.4 | Was wäre, wenn..? |
3.2.5 | Welche Abteilungen haben mehr als fünf Mitarbeiter? |
3.3 | X pro Y im Verhältnis zur Gesamtmenge X |
3.3.1 | Das Durchschnittsgehalt welcher Abteilungen liegt über dem Gesamtdurchschnitt? |
4 | Mengenlehre |
4.1 | Hintergrund |
4.2 | Datenmodell |
4.3 | Wie viel (im Vergleich) |
4.3.1 | Wie viele Besucher waren auf der letzten Messe? |
4.3.2 | Wie viele Besucher waren auf der letzten Messe im Vergleich zur Vormesse? |
4.4 | Was im Vergleich |
4.4.1 | Welche Besucher der letzten Messe fehlten bei der Vormesse? |
4.4.2 | Welche Besucher waren auf beiden Messen? |
4.4.3 | Welche Besucher waren insgesamt auf beiden Chicken Breeding Fairs? |
4.5 | Spickzettel Mengenoperationen |
5 | Gestern – Heute – Morgen |
5.1 | Fachlicher Hintergrund |
5.2 | Datumsarithmetik |
5.2.1 | Heute – GETDATE() |
5.2.2 | Zeitspanne – DATEDIFF() |
5.2.3 | Zeitsprung – DATEADD() |
5.2.4 | Monatsende – EOMONTH() |
5.3 | Datumskonvertierung |
5.3.1 | Implizite Konvertierung |
5.3.2 | Explizierte Konvertierung |
6 | Wie viel Y pro X und Z(eitspanne) |
6.1 | Fachlicher Hintergrund |
6.2 | Datenmodell |
6.3 | Wie viele Rechnungen sind 30/60/90/>90 Tage überfällig? |
6.3.1 | Wie erkennen wir überfällige Rechnungen? |
6.3.2 | Wie errechnen wir die Zeitspanne? |
6.3.3 | Einteilung in die vorgegebenen Kategorien |
6.4 | Wie viel Umsatz pro Kunde und Jahr? |
6.4.1 | ROLLUP |
7 | Sternzeit |
7.1 | Datenmodell |
7.2 | Welche Farbe war die meistverkaufte pro Jahr? |
7.2.1 | Data Warehouse-Abfrage |
7.2.2 | Relationale Abfrage |
7.3 | Wie hat sich der Umsatz in der Quartalsbetrachtung entwickelt? |
7.3.1 | Data Warehouse-Abfrage |
7.3.2 | Relationale Abfrage |
7.4 | Umsatz, Quartalsbetrachtung, Holzprodukte |
7.4.1 | Data Warehouse-Abfrage |
7.4.2 | Relationale Abfrage |
8 | Wer kennt wen? |
8.1 | Datenmodell |
8.2 | Suche in der Baumstruktur |
8.2.1 | Wen kenne ich direkt? |
8.2.2 | Wen kenne ich über wie viele Ecken? |
8.2.3 | Wen kenne ich über Maverick? |
8.2.4 | Gibt es eine Verbindungzwischen Cornel und dem Kanuschlüssel? |
8.2.5 | Die kürzeste Verbindung zwischen Cornel und Rajesh? |
8.3 | Suche im Netzwerk |
8.3.1 | Gibt es Verbindungen zwischen Maverick und Averell? |
8.4 | Der kürzeste Pfad |
9 | Neue Daten braucht das Land |
9.1 | Einen neuen Mitarbeiter einstellen? |
9.2 | Gehen auch mehrere Datensätze gleichzeitig? |
9.3 | Wie kann ich Daten kopieren? |
9.4 | Wie kann ich massenhaft Daten importieren? |
9.5 | INSERT mit Tabellenausdrücken |
10 | Beständig ist nur die Veränderung |
10.1 | Wie kann ich den Namen ändern? |
10.2 | Wie kann ich Werte vertauschen? |
10.3 | Werte mittels komplexer Abfragen ermitteln |
10.4 | Wie kann ich ähnliche Unterabfragen im UPDATE vereinfachen? |
10.5 | UPDATEs auf Tabellenausdrücken? |
10.6 | Nur die ersten fünf ändern? |
10.7 | Kurze Operatoren |
11 | Abschied – kurz und schmerzlos |
11.1 | Daten aus einer Tabelle löschen |
11.2 | Löschen verboten? |
11.3 | Lösche meinen Join |
11.4 | Wie kann ich Duplikate löschen? |
11.5 | Wie kann ich eine Tabelle komplett leeren? |
11.6 | Häppchenweise löschen |
12 | Leistungskontrolle |
12.1 | Vorher-Nachher-Vergleich |
12.2 | Ergebnisse auffangen |
12.3 | Welche IDs haben frisch eingefügte Datensätze? |
12.4 | Kann ich damit eine Warteschlange bauen? |
12.5 | Kann ich mit OUTPUT ein Änderungsprotokoll führen? |
12.6 | Und löschen? |
12.7 | Mich interessiert aber nur die Anzahl |
13 | Daten zusammenführen |
13.1 | Wie kann ich Änderungen aus der einen in eine andere Tabelle nachziehen? |
13.2 | Wie kann ich zugleich fehlende Daten einfügen? |
13.3 | Wie kann ich zugleich die gelöschten Datensätze in der Kopie entfernen? |
13.4 | Kann ich nur eine Teilmenge als Quelle verwenden? |
13.5 | Wie kann ich die Datensätze in der Zieltabelle einschränken? |
13.6 | Kann ich auch die Anzahl beschränken? |
14 | Abläufe programmieren mit SQL |
14.1 | Wie kann ich mehrere SQL-Befehle zusammenfassen? |
14.2 | Kann ich auch irgendwie Werte zwischenspeichern? |
14.3 | Wie kann ich den Ablauf steuern? |
14.4 | Sind auch Schleifen möglich? |
14.5 | Wie kann ich den Batch vorzeitig abbrechen? |
14.6 | Wie kann ich einen Fehler werfen? |
14.6.1 | Fehler werfen mit THROW |
14.6.2 | Fehler mit RAISERROR werfen: der erste Versuch |
14.6.3 | Fehler mit RAISERROR werfen: der zweite Versuch |
14.6.4 | THROW mit gespeicherten Meldungstexten |
14.7 | Wie kann ich einen Fehler fangen? |
14.8 | Wie kann ich im CATCH gezielt reagieren? |
14.9 | Mit welchen typischen Fehlern sollte ich rechnen? |
14.10 | Kann ich solche Batches auch im SQL Server speichern? |
15 | Alle für einen und einer für alle! |
15.1 | Wirklich komplett zurücksetzen? |
15.2 | Was kann mit Transaktionen denn schiefgehen? |
15.3 | Wie passt das alles zusammen? |
15.4 | Wie kann ich Transaktionen schachteln? |
15.5 | Kann der SQL Server auch standardkonforme Transaktionen? |
15.6 | Empfehlungen zu ätzenden Transaktionen |
15.7 | Wie kann ich beeinflussen, welche Sperre eine Aktion auslöst? |
15.8 | Mit welchen Blockierungen muss ich rechnen? |
15.9 | Was passiert, wenn ein Deadlock auftritt? |
16 | Was sind Tabellen eigentlich? |
16.1 | Was sind Tabellen? |
16.2 | Tabellen versus Heaps (Clustered Index) |
16.3 | Schlüssel und andere Bedingungen |
16.4 | Wie kann ich Default-Werte festlegen? |
16.5 | Kann ich selber Datentypen anlegen? |
16.6 | Wie kann ich IDs automatisch vergeben lassen? |
17 | Tabellendesign |
17.1 | Was gibt es beim Tabellendesign zu beachten? |
17.1.1 | Erste Normalform: Eine Spalte enthält nur einsegmentige Werte |
17.1.2 | Zweite Normalform: Alle Nichtschlüssel gehören zum gleichen Thema |
17.1.3 | Dritte Normalform: Nichtschlüssel sind nur direkt vom Schlüssel abhängig |
17.1.4 | Wiederholgruppen |
17.1.5 | Zuordnungstabellen |
17.1.6 | Spezialisierung und Verallgemeinerung |
17.2 | Performance-Aspekte beim Datenbankdesign |
17.3 | Welche Schlüssel sollte ich verwenden? |
18 | Zwischenergebnisse temporär speichern |
18.1 | Wie nutze ich Tabellenvariablen? |
18.2 | Wie nutze ich temporäre Tabellen? |
18.3 | Wie kann ich Views nutzen? |
19 | Programmobjekte |
19.1 | Kann ich gespeicherte Prozeduren auch im SELECT verwenden? |
19.2 | Gibt es auch schnelle Funktionen? |
19.3 | Was mache ich, wenn die Funktion für ein einziges SELECT zu komplex ist? |
19.4 | Ergebnisse von gespeicherten Prozeduren auffangen |
19.5 | Können Prozeduren auch automatisch starten? |
19.6 | Coding mit .NET |
Stichwortverzeichnis |
Welche Themen werden nicht behandelt?
Das Gebiet rund um T-SQL ist sehr groß. Daher konnten wir einigen Themen nicht den Raum geben, den sie verdienen. Einige Themen haben wir komplett ausgeklammert, höchstens mal erwähnt. Es sind nicht die typischen Einsteigerthemen, sondern empfehlen sich für deutlich Fortgeschrittene:
- Ausführung von dynamischem SQL
- GOTO – nicht, weil es dafür keine sinnvollen Anwendungsmöglichkeiten gibt, sondern weil es den Rahmen des Buches sprengen würde sinnvolle und weniger sinnvolle Anwendungsfälle gegenüber zu stellen. Das relationale Modell kennt keine Schleifen oder Sprünge, daher ist man in der Regel mit mengenorientierten Statements besser bedient.
- Cursor, dito
- CLR (.NET)
- XML
- Performance-Tuning, Zugriffspläne
- FILESTREAM
- Spatial Features (Geometrie und Geographie)
- Fulltext