Relationale Datenbanken und das relationale Modell
AnfängerEinheit 1 von 6 in Kurs: SQL – Datenbanken abfragen mit SELECT, JOIN und GROUP BY
Was du lernst
- Beschreiben, warum Organisationen gemeinsam genutzte Daten in relationalen Datenbanken speichern, was ein Datenbankmanagementsystem leistet und wie man mit SQL damit arbeitet.
- Erklären, warum Organisationen Datenbanken einsetzenDaten, eine Datenbank und ein Datenbankmanagementsystem unterscheiden und erklären, was eine relationale Datenbank besser kann als eine gemeinsam genutzte Tabellenkalkulation oder lose Dateien.
- Datenbanksysteme und die Rolle von SQL kennenVerbreitete relationale Datenbanksysteme nennen, beschreiben, wie sich Anwendungen mit ihnen verbinden, und erklären, was SQL ist und wie seine Anweisungen gruppiert sind.
- Erklären, warum Organisationen Datenbanken einsetzen
- Daten mithilfe der Begriffe Tabelle, Zeile und Spalte richtig lesen und die Regeln erklären, die eine Tabelle zur Relation machen.
- Die Bestandteile einer Tabelle beschreibenTabellen, Zeilen, Spalten und Werte in Beispieldaten erkennen und die Alltagsbegriffe den formalen relationalen Bezeichnungen zuordnen.
- Die Regeln erklären, die eine Tabelle zur Relation machenDie Regeln des relationalen Modells zu Zeilen, Spalten und Werten anwenden und erkennen, wo SQL-Tabellen und Tabellenkalkulationen sich anders verhalten.
- Die Bestandteile einer Tabelle beschreiben
- Jeder Spalte einen passenden Datentyp zuordnen, die häufigen Typfehler bei Geldbeträgen, Codes und Datumswerten vermeiden und richtig mit NULL umgehen.
- Die wichtigsten SQL-Datentypen kennenDie gängigen numerischen, Text-, Datums- und booleschen Typen erkennen, ihre Angaben zu Größe und Genauigkeit lesen und wissen, wo sich Datenbanksysteme unterscheiden.
- Einen passenden Datentyp für reale Daten wählenPassende Typen für Geldbeträge, Stückzahlen, Codes, Datumswerte und Namen auswählen, indem du dich fragst, wie die Werte verwendet werden, und die Fehler vermeiden, die falsche Typen verursachen.
- Richtig mit NULL umgehenErklären, was NULL bedeutet, NULL von der Zahl Null und von leerem Text unterscheiden und vorhersagen, wie sich NULL in Vergleichen, Berechnungen und Integritätsbedingungen verhält.
- Die wichtigsten SQL-Datentypen kennen
- Mit Primärschlüsseln jede Zeile identifizieren, mit Fremdschlüsseln Tabellen verknüpfen und die dadurch entstehenden Eins-zu-viele-, Eins-zu-eins- und Viele-zu-viele-Beziehungen erkennen.
- Schlüsselkandidaten und den Primärschlüssel bestimmenEntscheiden, welche Spalten oder Spaltenkombinationen jede Zeile eindeutig identifizieren, und die Regeln erklären, die ein Primärschlüssel erfüllen muss.
- Zwischen natürlichen Schlüsseln und Surrogatschlüsseln wählenKennungen aus der realen Welt mit systemgenerierten Kennungen vergleichen, beurteilen, welche sich als Primärschlüssel eignen, und natürliche Kennungen mit UNIQUE-Bedingungen schützen.
- Tabellen über Fremdschlüssel verknüpfenErklären, wie ein Fremdschlüssel auf eine Zeile in einer anderen Tabelle verweist, was referenzielle Integrität schützt und was passiert, wenn referenzierte Zeilen geändert oder gelöscht werden.
- Eins-zu-viele-, Eins-zu-eins- und Viele-zu-viele-Beziehungen erkennenBestimmen, wie viele Zeilen auf jeder Seite einer Verknüpfung miteinander in Beziehung stehen können, und zeigen, wie Fremdschlüssel und Zwischentabellen jede Art von Beziehung darstellen.
- Schlüsselkandidaten und den Primärschlüssel bestimmen
- Ein Schema lesen, das als Tabellendefinitionen geschrieben oder als Diagramm gezeichnet ist, und es zusammen mit Beispieldaten nutzen, um herauszufinden, wo Fakten gespeichert sind und wie die Tabellen miteinander verknüpft sind.
- Ein Schema und seine Tabellendefinitionen lesenEin Schema von den Daten unterscheiden, die es beschreibt, Schemanotation und CREATE-TABLE-Anweisungen lesen und die darin deklarierten Integritätsbedingungen deuten.
- Ein Schemadiagramm lesenDie Kästen, Schlüsselmarkierungen, Verbindungslinien und Krähenfußsymbole eines Schemadiagramms deuten und jede dargestellte Beziehung in Worten ausdrücken.
- Fragen mithilfe eines Schemas und von Beispieldaten beantwortenHerausfinden, wo jede Information gespeichert ist, Schlüsseln von Hand von Tabelle zu Tabelle folgen und anhand der Integritätsbedingungen des Schemas entscheiden, welche Daten zulässig sind.
- Ein Schema und seine Tabellendefinitionen lesen
Relationale Datenbanken einfach erklärt
1Was eine Datenbank leistet
Ein Laden kann mit einer Tabellenkalkulation anfangen, doch gemeinsam genutzte Daten werfen bald schwierigere Fragen auf: Welche Kundendaten sind aktuell, wer darf sie ändern, und was passiert, wenn eine Zahlung auf halbem Weg abbricht? Ein Datenbanksystem gibt diesen Fragen ein gemeinsames Zuhause. Trenne die gespeicherten Fakten von der Software, die sie verwaltet, und sieh dir dann an, wie Anwendungen mit SQL Daten abfragen und Änderungen vornehmen. Dieselben Grundgedanken tragen eine kleine Smartphone-App ebenso wie das Berichtssystem eines großen Unternehmens.
1.1 Gemeinsame Fakten und verlässliche Änderungen
Ein Kundenname, ein Bestelldatum und ein Preis sind Daten: festgehaltene Fakten. Eine Datenbank ist eine organisierte Sammlung zusammengehöriger Daten. Ein Datenbankmanagementsystem, kurz DBMS, ist die Software, die diese Sammlung speichert und verwaltet. PostgreSQL ist ein DBMS; die Datenbank store eines Ladens ist eine Sammlung, die PostgreSQL verwaltet.
Jede Information dort speichern, wo sie hingehört
Angenommen, eine Tabellenkalkulation wiederholt die Telefonnummer von Maria Garcia bei allen 14 ihrer Verkäufe. Ändert sich die Nummer, sind 14 Bearbeitungen nötig. Eine übersehene Zelle hinterlässt widersprüchliche Einträge. In einer relationalen Datenbank enthält customers die Angaben zu Maria nur einmal, unter customer_id 1. Jeder Verkauf speichert diese Kennung. Aktualisierst du ihre Telefonnummer in einer einzigen Kundenzeile, finden spätere Abfragen genau eine aktuelle Nummer.
Eine relationale Datenbank ordnet Fakten in Tabellen. „Relational“ kommt von Relation, dem mathematischen Namen für eine Tabelle. E. F. Codd stellte das Modell 1970 vor. Seine zentrale Trennung ist nützlich: Nutzer beschreiben die gewünschten Daten über Tabellen und Werte; das DBMS kümmert sich darum, wie diese Daten auf der Festplatte gefunden werden.
Regeln und gemeinsamer Zugriff
Eine Tabelle hat benannte Spalten, Datentypen und Integritätsbedingungen. Eine Integritätsbedingung ist eine Regel, die das DBMS prüft, etwa „eine Bestellung muss auf einen existierenden Kunden verweisen“. Diese Prüfungen schützen gemeinsam genutzte Daten, wenn mehrere Anwendungen dieselbe Datenbank verwenden. Wie streng Typen durchgesetzt werden, ist unterschiedlich: PostgreSQL weist Text wie 'twelve' in einer numerischen Preisspalte zurück, während gewöhnliche SQLite-Tabellen flexible Typen haben.
Ein DBMS verwaltet außerdem gleichzeitige Nutzer, Berechtigungen, Datensicherungen und Wiederherstellung. Zwei Mitarbeiter können an gemeinsamen Daten arbeiten, ohne getrennte Kopien einer Tabellenkalkulation auszutauschen. Berechtigungen können einem Berichtsnutzer erlauben, Verkäufe zu lesen, und zugleich einschränken, wer sie ändern darf. Ein Verfahren für Sicherung und Wiederherstellung hilft, Daten nach einem Ausfall wiederherzustellen.
Eine Gruppe von Änderungen zusammenhalten
Eine Transaktion behandelt mehrere Änderungen als eine Einheit: Entweder werden alle gespeichert oder keine. Um 200 $ zwischen Konten zu übertragen, muss der Betrag vom Girokonto abgezogen und dem Sparkonto gutgeschrieben werden. Unterbricht ein Ausfall die Überweisung, bevor sie abgeschlossen ist, kann das DBMS die unvollständige Transaktion rückgängig machen. Würde nur die Abbuchung gespeichert, bliebe ein falscher Kontostand zurück.
Eine Tabellenkalkulation bleibt nützlich für kleine Berechnungen und flexible Layouts. Eine Datenbank bietet eine festgelegte Struktur für gemeinsam genutzte Datensätze und Regeln. Ein Excel-Tabellenblatt ist fest auf 1.048.576 Zeilen begrenzt; Datenbanken verwalten routinemäßig viel größere Datenbestände, begrenzt durch Speicher, Hardware und die Grenzen des jeweiligen Produkts.
Unterschiedliche Daten, unterschiedliche Aufgaben
Strukturierte Daten passen in benannte Spalten, die jede Zeile hat. Semistrukturierte Daten wie JSON-Dokumente können in verschiedenen Datensätzen unterschiedliche Felder haben. Unstrukturierte Daten wie Audiodateien oder frei formulierte E-Mails haben kein festes tabellarisches Layout. Organisationen kombinieren relationale Datenbanken oft mit Dokumentdatenbanken, Schlüssel-Wert-Datenbanken oder Dateispeichern.
Auch die Art der Arbeitslast spielt eine Rolle. Ein transaktionsorientiertes System, auch OLTP genannt, erfasst alltägliche Vorgänge über viele kleine Lese- und Schreibzugriffe: eine Bestellung, eine Zahlung, eine Adressänderung. Ein analytisches System, kurz OLAP, liest viele gespeicherte Datensätze, um Fragen zu beantworten wie „Wie unterschieden sich die monatlichen Umsätze nach Region?“ Beide können relationale Tabellen und Schlüssel nutzen.
Wichtige Erkenntnisse
- Eine Datenbank enthält zusammengehörige Daten; ein DBMS verwaltet sie.
- Relationale Daten sind in Tabellen organisiert, und das DBMS prüft ihre Regeln.
- Eine Transaktion speichert eine Gruppe von Änderungen gemeinsam oder macht sie gemeinsam rückgängig.
- Gemeinsam genutzte Kundendaten lassen sich an einer Stelle aktualisieren und über eine Kennung finden.
- Transaktionsorientierte Arbeit erfasst Vorgänge; analytische Arbeit fasst gespeicherte Daten zusammen.
1.2 SQL, Datenbankprodukte und Anwendungen
SQL, kurz für Structured Query Language, ist eine Sprache. PostgreSQL, MySQL, SQLite, Microsoft SQL Server und Oracle Database sind Produkte, die diese Sprache verwenden. SQL Server ist ein DBMS, kein anderer Name für SQL selbst.
Wie eine Anwendung an die Daten kommt
In einem Client-Server-System verwaltet ein Serverprogramm die Datenbank. Ein Client, etwa eine Website, ein Berichtswerkzeug oder ein Abfrageeditor, sendet Anfragen an diesen Server. PostgreSQL, MySQL, SQL Server und Oracle arbeiten üblicherweise so. Mit Werkzeugen wie psql, pgAdmin, DBeaver und SQL Server Management Studio können Menschen Datenbanken untersuchen und Anfragen senden.
Eine eingebettete Engine läuft innerhalb einer Anwendung. SQLite nutzt eine Bibliothek und eine gewöhnliche Datenbankdatei wie store.db, ohne separaten Datenbankserver. SQLite ist in Smartphones, Browsern und Desktop-Anwendungen verbreitet. Bei einem verwalteten Cloud-Dienst wie Azure SQL Database, Amazon RDS oder Google Cloud SQL betreibt ein Anbieter die Datenbankserver. „Verwaltet“ beschreibt, wer den Dienst betreibt; Tabellen und Schlüssel werden dadurch nicht durch ein anderes Modell ersetzt.
Eine DBMS-Installation kann mehrere Datenbanken verwalten, etwa store und payroll. Eine Verbindung wählt die zu verwendende Datenbank aus, sofern die Berechtigungen das erlauben.
Sag, welches Ergebnis du willst
SQL ist deklarativ: Es beschreibt das gewünschte Ergebnis, während das DBMS entscheidet, wie es dieses Ergebnis erhält. Lies diese Anweisung:
SELECT first_name, city
FROM customers
WHERE state = 'TX';
Sie fragt nach Vornamen und Städten aus den Kundenzeilen, deren Bundesstaat TX ist. Sie sagt nichts darüber, welche Seite auf der Festplatte zuerst gelesen wird. Großgeschriebene Schlüsselwörter machen die Anweisung leichter überschaubar; select und SELECT bedeuten dasselbe. Ein Semikolon beendet normalerweise eine Anweisung.
Die Aufgabe einer Anweisung erkennen
| Gruppe | Zweck | Beispiele |
|---|---|---|
| Datendefinition, DDL | Struktur definieren oder ändern | CREATE TABLE, ALTER TABLE, DROP TABLE |
| Datenmanipulation, DML | Zeilen lesen oder ändern | SELECT, INSERT, UPDATE, DELETE |
| Datenkontrolle, DCL | Berechtigungen verwalten | GRANT, REVOKE |
| Transaktionssteuerung | Eine Transaktion speichern oder rückgängig machen | COMMIT, ROLLBACK |
Manche Bücher ordnen SELECT einer eigenen Gruppe zu, der Datenabfragesprache. Entscheidend ist, was die Anweisung tatsächlich tut: Fügst du eine Spalte hinzu, änderst du die Struktur; fügst du einen Kunden hinzu, änderst du Daten.
SQL wurde 1986 ein ANSI-Standard und ist international als ISO/IEC 9075 genormt. Die Produkte ergänzen eigene Dialekte. Eine Begrenzung auf zehn Zeilen lautet LIMIT 10 in SQLite, PostgreSQL und MySQL, TOP 10 in SQL Server oder FETCH FIRST 10 ROWS ONLY in Standard-SQL und Oracle.
Text und weitere Datenbankobjekte lesen
Textliterale stehen in einfachen Anführungszeichen: 'TX'. Standard-SQL verwendet doppelte Anführungszeichen für Bezeichner wie Spaltennamen. Ein Apostroph innerhalb eines Texts wird verdoppelt: 'O''Brien' steht für O'Brien.
Eine Sicht ist eine gespeicherte Abfrage, die wie eine Tabelle verwendet wird; eine gewöhnliche Sicht speichert keine eigenen Zeilen. Ein Index ist eine Nachschlagestruktur, die helfen kann, Zeilen schnell zu finden. Die meisten Systeme indizieren Primärschlüssel automatisch. Gespeicherte Prozeduren und Funktionen sind gespeicherter Code, der sich über seinen Namen ausführen lässt.
Wichtige Erkenntnisse
- SQL beschreibt ein gewünschtes Ergebnis; das DBMS entscheidet, wie es dieses Ergebnis erhält.
- Client-Server-Systeme nehmen Anfragen über einen Server entgegen; SQLite ist in eine Anwendung eingebettet.
- DDL ändert die Struktur, DML liest oder ändert Zeilen.
- Einfache Anführungszeichen kennzeichnen Text; ein Apostroph innerhalb des Texts wird verdoppelt.
- Eine Sicht speichert eine Abfrage; ein Index ermöglicht schnelleres Nachschlagen.
- SQL-Dialekte teilen die relationalen Grundgedanken, unterscheiden sich aber in Teilen der Syntax.
2Eine Tabelle richtig lesen
Eine Tabelle gibt jeder Art von Datensatz eine klare Form: Zeilen beschreiben einzelne Dinge, Spalten deren Eigenschaften. Lies zuerst die Form, bevor du einen Wert deutest. Unterscheide dann die logischen Regeln einer Tabelle vom Layout einer Tabellenkalkulation: Die Position identifiziert keinen Datensatz, eine Liste von Telefonnummern ist mehr als ein Wert, und eine Summenzeile bedeutet etwas anderes als ein Verkauf. Diese Unterscheidungen erleichtern die spätere Arbeit mit Schlüsseln und Schemas deutlich.
2.1 Zeilen, Spalten und Werte
Eine Tabelle speichert Fakten über eine Art von Dingen. Jede Zeile in customers beschreibt einen Kunden; jede Spalte enthält eine Eigenschaft. Am Schnittpunkt von Zeile und Spalte steht ein Wert.
Einen Datensatz quer lesen
Hier sind ausgewählte Kundenspalten:
customer_id | first_name | last_name | city | state | zip_code |
|---|---|---|---|---|---|
| 1 | Maria | Garcia | Austin | TX | 78701 |
| 2 | James | Wilson | Denver | CO | 80202 |
| 3 | Aisha | Johnson | Boston | MA | 02108 |
| 4 | Wei | Chen | Seattle | WA | 98101 |
Suche customer_id 4 und lies dann city: Die Stadt von Wei ist Seattle. Um herauszufinden, wer in Denver wohnt, liest du den Namen in der Zeile mit Denver: James Wilson. Eine benachbarte Zeile beschreibt einen anderen Kunden.
Die vollständige Tabelle hat acht Spalten: customer_id, first_name, last_name, email, phone, city, state und zip_code. Die Telefonnummer von James ist NULL: Der Wert fehlt, aber seine Zeile hat trotzdem die Spalte für die Telefonnummer.
Die Begriffe zuordnen
| Alltagsbegriff | Formaler relationaler Begriff | Weiterer üblicher Begriff |
|---|---|---|
| Tabelle | Relation | keiner |
| Zeile | Tupel | Datensatz |
| Spalte | Attribut | Feld |
Ein Tupel ist eine ganze Zeile, nicht eine einzelne Zelle. Ein Attribut benennt eine Eigenschaft, die alle Zeilen haben. „Datensatz 4“ kann eine Kennung oder eine Anzeigeposition meinen; prüfe, was gemeint ist, denn Positionen können sich ändern.
Die Form abzählen
Der Grad zählt die Spalten, die Kardinalität einer Tabelle die Zeilen. Die vollständige Tabelle hat den Grad 8 und die Kardinalität 4. Die Darstellung oben zeigt sechs Spalten, ohne den Grad der Tabelle zu ändern.
Kommt ein Kunde hinzu, steigt die Kardinalität auf 5; der Grad bleibt 8. Kommt birth_date hinzu, steigt der Grad auf 9, und jede Zeile erhält einen Platz für diesen Wert, auch wenn er fehlt. Ein neuer Kunde fügt eine Zeile hinzu, keine Spalte.
Die Kardinalität einer Beziehung, etwa eins zu viele, beschreibt erlaubte Verknüpfungen, nicht die Zeilenanzahl einer Tabelle.
Qualifizierte Namen lesen
Spaltennamen sind innerhalb einer Tabelle eindeutig. orders.customer_id und customers.customer_id unterscheiden gleichnamige Spalten in verschiedenen Tabellen: Der Punkt trennt Tabellen- und Spaltennamen.
snake_case verwendet kleingeschriebene Wörter, die durch Unterstriche getrennt sind, wie in zip_code. Namen mit Leerzeichen müssen in SQL in Anführungszeichen stehen. Tabellennamen im Singular wie im Plural können funktionieren; verwende eine einheitliche Konvention.
Wichtige Erkenntnisse
- Eine Zeile beschreibt ein einzelnes Exemplar, eine Spalte eine Eigenschaft.
- Relation, Tupel und Attribut bedeuten Tabelle, Zeile und Spalte.
- Der Grad zählt die Spalten; die Kardinalität einer Tabelle zählt die Zeilen.
- Ein mit dem Tabellennamen qualifizierter Name zeigt, zu welcher Tabelle eine Spalte gehört.
2.2 Die Regeln hinter dem Raster
Eine relationale Tabelle hat eine logische Struktur, die über ihr rechteckiges Aussehen hinausgeht. Im formalen Modell ist sie eine Menge von Zeilen. Mengen enthalten keine doppelten Elemente und haben keine Reihenfolge. Spalten werden über ihren Namen identifiziert; verschiebst du eine Spalte in einer Anzeige, ändert sich also nicht die Information, für die sie steht.
Die Identität ergibt sich nicht aus der Position
Ein DBMS kann Zeilen nach Änderungen, Löschungen oder einer geänderten Art, den Speicher zu lesen, in anderer Reihenfolge zurückgeben. „Die dritte Zeile“ ist keine dauerhafte Möglichkeit, einen Kunden zu identifizieren. customer_id 3 identifiziert Aisha auch dann, wenn ihre Zeile als erste erscheint. Braucht eine Abfrage eine bestimmte Reihenfolge, fordert sie diese mit ORDER BY an.
SQL-Tabellen unterscheiden sich von formalen Relationen: Ohne Primärschlüssel oder eine andere passende Eindeutigkeitsbedingung können sie identische Zeilen enthalten. Zwei Kopien von ('Coffee mug', 12.50) bieten in diesen Spalten keinen Wert, der sie unterscheidet. Ein Primärschlüssel gibt jeder Zeile eine eindeutige Kennung und verhindert vollständig doppelte Zeilen.
Eine Spalte, eine Domäne
Eine Domäne ist die Menge der Werte, die in einer Spalte zulässig sind. Eine Stückzahl hat einen Ganzzahltyp und braucht eventuell zusätzlich eine Regel, dass sie positiv sein muss. Ein Kürzel eines Bundesstaats ist Text, aber nicht jeder Textwert ist ein gültiges Kürzel. Datentypen und Integritätsbedingungen beschreiben dem DBMS die zulässigen Werte.
Alle Zeilen haben dieselben Spalten. Eine einzelne Bestellung kann keine zusätzliche Spalte für eine Geschenknotiz nur für sich bekommen. Die Tabelle kann für jede Bestellung eine Spalte gift_note haben, mit NULL dort, wo keine Notiz erfasst wurde. Auch optionale Angaben haben einen festgelegten Platz.
Einzelne Werte getrennt halten
Ein atomarer Wert ist ein einzelner Wert im Sinne des Zwecks der Spalte. Eine Zelle für die Telefonnummer mit dem Inhalt „512-555-0147, 512-555-0199“ enthält eine Liste mit zwei Nummern. Nur eine der Nummern zu finden, zu prüfen oder zu entfernen wird umständlich. Eine Tabelle customer_phones kann jeder Telefonnummer eine eigene Zeile geben, wobei customer_id zeigt, wem die Nummer gehört.
Atomar bedeutet nicht, dass jeder Textwert in seine kleinsten Teile zerlegt werden muss. Ein Städtename kann aus mehreren Wörtern bestehen und trotzdem ein einziger Stadtwert sein. Entscheidend ist, ob die Zelle eine einzelne Information der Art speichert, für die die Spalte steht, oder eine Sammlung, die getrennt behandelt werden sollte.
Einen Export aus einer Tabellenkalkulation kritisch lesen
Ein Blatt mit Verkäufen kann eine auf halber Höhe wiederholte Kopfzeile, eine unterste Zeile mit der Beschriftung „SUMME“ und einen als „12,50 (Angebot)“ geschriebenen Preis enthalten. Für Menschen sind das nützliche Gestaltungsentscheidungen, aber sie mischen verschiedene Arten von Inhalten in denselben Spalten.
So liest du das Blatt als relationale Tabelle:
- Behandle die Spaltennamen als Kopfzeile, nicht als Verkaufsdatensätze.
- Lass jede Datenzeile von genau einem Verkauf handeln; berechne die Summe aus diesen Zeilen.
- Speichere den numerischen Preis getrennt von einer Anmerkung zum Verkauf.
- Gib jedem Verkauf einen Schlüssel, damit seine Zeile identifiziert werden kann.
Eine Summenzeile zwischen den Verkäufen könnte als weiterer Verkauf gezählt oder ein zweites Mal zur Summe addiert werden. Eine Anmerkung, die in einem numerischen Preis steckt, verhindert gewöhnliche Rechenoperationen.
Logische Tabellen und physische Speicherung
Eine Tabelle ist das logische Bild der Daten für den Nutzer. Das DBMS kann ihre Daten in Dateien, Seiten und Indizes speichern, die für einen effizienten Zugriff angeordnet sind. Datenunabhängigkeit bedeutet, dass sich bei Änderungen an dieser physischen Anordnung weder die Tabellennamen noch die Bedeutung der Spalten noch die Anfragen der Anwendungen ändern müssen.
Wichtige Erkenntnisse
- Eine formale Relation hat verschiedene, ungeordnete Zeilen; SQL braucht Integritätsbedingungen, um Duplikate zu verhindern.
- Eine bestimmte Zeilenreihenfolge muss mit
ORDER BYangefordert werden. - Die Domäne einer Spalte beschreibt die für sie zulässigen Werte.
- Jede Zelle enthält einen einzigen Wert im Sinne des Zwecks ihrer Spalte.
- Jede Zeile hat dieselben Spalten, auch Plätze für fehlende Werte.
3Typen wählen und fehlende Daten deuten
Der Typ einer Spalte bestimmt, was gespeichert werden kann, wie Werte sortiert werden und welche Berechnungen sinnvoll sind. Ziffern können eine Anzahl oder einen Code darstellen; für diese Verwendungen braucht man unterschiedliche Typen. Geldbeträge müssen exakt gespeichert werden, Messwerte dagegen können oft Näherungswerte sein. Fehlende Fakten werden eigens als NULL behandelt. Lerne diese Entscheidungen zusammen mit den wichtigen Unterschieden zwischen den Produkten kennen, vor allem der flexiblen Speicherung in SQLite und dem Umgang von SQL mit Vergleichen, deren Ergebnis unbekannt ist.
3.1 Die wichtigsten SQL-Datentypen
Ein Datentyp sagt einem DBMS, welche Art von Wert eine Spalte enthält und wie damit gearbeitet wird. Zahlen addieren, Texte vergleichen und Datumswerte ordnen sind unterschiedliche Operationen. Ein bekannter Typname kann sich außerdem je nach Datenbankprodukt unterschiedlich verhalten.
Zahlen: ganz, exakt und näherungsweise
| Art | Gängige Typen | Geeignete Verwendung |
|---|---|---|
| Ganze Zahlen | INTEGER, SMALLINT, BIGINT | Anzahlen, Stückzahlen und ganzzahlige Kennungen |
| Exakte Dezimalzahlen | DECIMAL(p, s), NUMERIC(p, s) | Geldbeträge und andere exakte Dezimalbeträge |
| Näherungswerte | REAL, FLOAT, DOUBLE PRECISION | Messwerte, bei denen Rundungsdifferenzen akzeptabel sind |
In PostgreSQL, MySQL und SQL Server reicht INTEGER von −2.147.483.648 bis 2.147.483.647. BIGINT reicht bis 9.223.372.036.854.775.807; auch die Ganzzahlspeicherung von SQLite kann diesen Bereich erreichen.
Bei Dezimalzahlen ist die Genauigkeit die Gesamtzahl der Ziffern und die Dezimalstellenanzahl die Anzahl der Nachkommastellen. DECIMAL(8, 2) lässt sechs Ziffern vor dem Komma: Der Höchstwert ist 999.999,99. Der Preis 12,50 passt hinein, 1.234.567,00 nicht. PostgreSQL, MySQL, SQL Server und Oracle speichern Dezimalzahlen exakt. SQLite akzeptiert diese Deklaration, erzwingt aber weder Genauigkeit noch Dezimalstellenanzahl und kann Nachkommawerte als binäre Gleitkommazahlen speichern.
Gleitkommazahlen stellen viele Dezimalbrüche nur näherungsweise dar. In doppelter Genauigkeit ergibt die Addition von 0,1 und 0,2 den Wert 0,30000000000000004. SQLite behandelt diese Dezimalliterale als Gleitkommazahlen. PostgreSQL behandelt Dezimalliterale ohne Typangabe als exakte numerische Werte, sodass dieselbe geschriebene Rechnung dort exakt sein kann; ausdrücklich in doppelter Genauigkeit angegebene Werte zeigen die Näherung.
Text, Datumswerte und Flags
CHAR(n) ist Text fester Länge; PostgreSQL und SQL Server füllen kürzere Werte mit Leerzeichen auf. VARCHAR(n) erlaubt unterschiedliche Längen bis zu einer Obergrenze. SQLite ignoriert beide Längenangaben und füllt nicht auf. TEXT speichert lange Texte in SQLite, PostgreSQL und MySQL. SQL Server verwendet dafür VARCHAR(MAX) oder NVARCHAR(MAX); der ältere SQL-Server-Typ TEXT ist abgekündigt.
Ein DATE speichert ein Kalenderdatum, ein TIME eine Uhrzeit und ein TIMESTAMP in Standard-SQL Datum und Uhrzeit. Schreibe Datumswerte in der Form Jahr-Monat-Tag, etwa '2026-03-02', damit der 2. März nicht mit dem 3. Februar verwechselt wird. Typisierte Datumswerte haben ein internes Speicherformat; die Anwendung legt ihr Anzeigeformat fest. SQLite hat keinen eigenen Datumstyp und speichert meist ISO-Datumstext. SQL Server verwendet DATETIME2 für Datum und Uhrzeit: Dort bedeutet TIMESTAMP ROWVERSION, einen binären Versionszähler.
Ein BOOLEAN steht für TRUE oder FALSE oder für NULL, wenn der Wert fehlt. PostgreSQL hat einen booleschen Typ; SQL Server verwendet BIT, MySQL behandelt BOOLEAN als kleine Ganzzahl, und SQLite speichert die Flags als 1 und 0. Binäre Typen wie BLOB oder BYTEA in PostgreSQL speichern Bytes, etwa kleine Bilder. Größere Dateien werden oft separat gespeichert, und eine Tabelle enthält nur einen Pfad oder eine URL.
Typaffinität in SQLite
In gewöhnlichen SQLite-Tabellen ist ein deklarierter Typ eine Präferenz, die Typaffinität heißt. Eine INTEGER-Spalte wandelt '42' in die Zahl 42 um, kann 'abc' aber als Text behalten. Eine STRICT-Tabelle in SQLite weist Text zurück, der sich nicht in eine gültige Ganzzahl umwandeln lässt.
Wichtige Erkenntnisse
- Ganzzahlen speichern ganze Zahlen; exakte Dezimalzahlen und Gleitkommazahlen dienen unterschiedlichen Zwecken.
- Die Genauigkeit zählt alle Ziffern, die Dezimalstellenanzahl die Nachkommastellen.
- ISO-Datumstext verwendet die Reihenfolge Jahr-Monat-Tag.
- Textlängen, boolesche Speicherung und Datumstypen unterscheiden sich zwischen den Dialekten.
- Die Typaffinität in SQLite ist flexibel;
STRICT-Tabellen erzwingen ihre unterstützten Typen. TIMESTAMPin SQL Server ist eine Zeilenversion, kein Datum mit Uhrzeit.
3.2 Den Typ nach der Aufgabe des Werts wählen
Beginne damit, was ein Wert bedeutet und wie er verwendet wird. Eine Postleitzahl (ZIP-Code) enthält Ziffern, aber niemand addiert Postleitzahlen, um eine aussagekräftige Summe zu erhalten. Eine Stückzahl enthält ebenfalls Ziffern, und Stückzahlen zu addieren ist nützlich. Das Aussehen allein ist ein schlechter Wegweiser für den Typ.
Fünf Fragen stellen
- Was sind typische Werte, und welche Extremwerte müssen hineinpassen?
- Wird mit den Werten gerechnet?
- Müssen sie exakt sein, oder ist eine Näherung akzeptabel?
- Wie müssen sie sortiert und verglichen werden?
- Welche Größe passt zu realistischen künftigen Werten?
Geldbeträge und Messwerte
Geldbeträge müssen exakt sein. In PostgreSQL, MySQL und SQL Server kann ein Preis den Typ DECIMAL(8, 2) verwenden. Drei Artikel zu je 12,50 $ kosten genau 37,50 $. Binäre Gleitkommaspeicherung kann nach wiederholten Additionen winzige Fehler hinterlassen, sodass exakte Vergleiche unzuverlässig werden. In SQLite sorgt die Deklaration DECIMAL nicht für exakte Dezimalspeicherung; verwende für exakte Beträge ganzzahlige Centbeträge, sodass 12,50 $ als 1250 gespeichert wird.
Ein Messwert wie das Gewicht kann REAL verwenden, wenn kleine Rundungsdifferenzen akzeptabel sind. Lege die Einheit als Teil der Bedeutung der Spalte fest: weight_lb macht Pfund (lb) im Namen sichtbar. Ein numerischer Typ allein hält diese Einheit nicht fest.
Auch die Währung braucht eine Bedeutung. Mischt eine Tabelle Währungen, füge currency_code hinzu, etwa mit USD, EUR oder JPY. Die Anzahl der Nachkommastellen hängt von der Währung ab, und Beträge in verschiedenen Währungen müssen umgerechnet werden, bevor man sie addieren kann.
Codes und Namen sind Text
Verwende Text für Postleitzahlen, Telefonnummern, Kontonummern und Artikelnummern. Die Bostoner Postleitzahl '02108' verliert ihre führende Null, wenn sie in eine Ganzzahl umgewandelt wird. VARCHAR(10) kann auch ZIP+4 aufnehmen, etwa '02108-1234'. Telefonnummern können ein Pluszeichen, Leerzeichen und Bindestriche enthalten. Diese Zeichen gehören zur Darstellung einer Kennung und sind keine Rechenzeichen.
Plane Platz für echte Namen und Adressen ein. „Christopher Montgomery“ hat 22 Zeichen, daher ist VARCHAR(10) zu kurz. PostgreSQL und SQL Server weisen den Wert zurück; MySQL weist ihn im strikten Modus zurück und schneidet ihn andernfalls eventuell ab. SQLite speichert ihn, weil deklarierte Textlängen ignoriert werden. Ein großzügiges Feld variabler Länge vermeidet, dass gewöhnliche Namen abgewiesen werden, ohne für jede Zeile die maximale Länge zu reservieren.
Die Sortierung entlarvt eine falsche Wahl
Beim Sortieren von Text werden Zeichen verglichen. Als Text gespeicherte Zahlen können in der Reihenfolge '1', '10', '2', '25', '3' erscheinen. Eine numerische Spalte sortiert diese Werte numerisch. Wählst du für jedes Feld Text, verlagerst du Prüf- und Umwandlungsarbeit auf spätere Berechnungen.
Bei Datumswerten gibt es eine ähnliche Falle. Datumstext im US-Stil setzt '12/01/2025' in Textreihenfolge hinter '03/02/2026', obwohl Dezember 2025 früher liegt. Verwende einen Datumstyp oder in SQLite einheitlich formatierten ISO-Text, damit die Kalenderreihenfolge erhalten bleibt.
Die Typen eines Produkts zusammen lesen
Ein Produkt kann product_id INTEGER, sku VARCHAR(20), name VARCHAR(100), price DECIMAL(8, 2), weight_lb REAL, in_stock BOOLEAN und added_on DATE verwenden. Jeder Typ folgt einer Aufgabe: Identifikation, Speicherung eines Codes, ein Name, ein exakter Geldbetrag, ein Messwert, ein Flag oder ein Datum. In SQLite speicherst du den Preis als ganzzahligen Centbetrag und das Datum als ISO-Text.
Wichtige Erkenntnisse
- Wähle Typen nach Bedeutung, Rechnen, Exaktheit, Reihenfolge und realistischer Größe.
- Speichere Codes als Text, damit führende Nullen und Satzzeichen erhalten bleiben.
- Speichere Geldbeträge als exakte Dezimalzahlen, wo das unterstützt wird, und in SQLite als ganzzahlige Centbeträge.
- Ein numerischer Betrag braucht eine Währung, ein Messwert eine Einheit.
- Als Text gespeicherte Werte werden wie Text sortiert, auch wenn alle Zeichen Ziffern sind.
3.3 NULL und unbekannte Ergebnisse
NULL kennzeichnet einen fehlenden Wert. NULL unterscheidet sich von der Zahl Null, vom leeren Text '' und vom Text 'NULL'. Ein bekannter Rabatt von 0 bedeutet keinen Rabatt; ein Rabatt mit NULL bedeutet, dass der Betrag nicht erfasst ist. Eine NULL-fähige Spalte lässt fehlende Daten zu, während NOT NULL einen Wert verlangt.
Fehlen hat mehr als eine Bedeutung
Für James Wilson ist keine Telefonnummer erfasst. Bestellung 102 hat kein Versanddatum, weil sie noch nicht versandt wurde. Ein Firmenkunde hat womöglich keinen zutreffenden Nachnamen. Alle Fälle lassen sich mit NULL darstellen, aber NULL hält nicht fest, welcher Grund zutrifft. Ein Datenkatalog sollte die Bedeutung jeder Spalte angeben.
Leerer Text ist in PostgreSQL und SQLite ein vorhandener Textwert. Oracle behandelt leeren Text derzeit als NULL. Abfragewerkzeuge zeigen beides womöglich als scheinbar leere Zelle an; am Aussehen allein lassen sie sich also nicht unterscheiden.
Vergleiche können unbekannt sein
SQL-Vergleiche haben drei mögliche Ergebnisse: TRUE, FALSE und UNKNOWN. Ein Vergleich, an dem NULL beteiligt ist, auch NULL = NULL, ergibt UNKNOWN. Von zwei fehlenden Fakten ist nicht bekannt, dass sie denselben Wert haben.
Eine WHERE-Klausel behält nur Ergebnisse, die TRUE sind. Lies diese Bedingungen:
phone IS NULLfindet fehlende Telefonnummern.phone IS NOT NULLfindet erfasste Telefonnummern.phone = NULLergibt UNKNOWN und findet keine Zeilen.
Einen Vergleich zu verneinen bringt einen fehlenden Wert nicht zurück. Nimm zu den vier Kunden des Shops Daniel Brown hinzu, dessen Bundesstaat NULL ist. Die Bedingung state <> 'TX' behält CO, MA und WA: drei Zeilen. Daniel wird ausgeschlossen, weil der Vergleich seines Bundesstaats UNKNOWN ergibt. Sollen fehlende Bundesstaaten ebenfalls dabei sein, lautet die Bedingung state <> 'TX' OR state IS NULL.
Bedingungen sorgfältig verknüpfen
Stell dir UNKNOWN als „könnte TRUE oder FALSE sein“ vor. Ein Ergebnis steht nur fest, wenn beide Möglichkeiten zum selben Ausgang führen.
| Ausdruck | Ergebnis | Grund |
|---|---|---|
| TRUE AND UNKNOWN | UNKNOWN | Der zweite Teil entscheidet, ob beide wahr sind. |
| FALSE AND UNKNOWN | FALSE | Ein falscher Teil macht AND bereits falsch. |
| TRUE OR UNKNOWN | TRUE | Ein wahrer Teil erfüllt OR bereits. |
| FALSE OR UNKNOWN | UNKNOWN | Der zweite Teil entscheidet über OR. |
| NOT UNKNOWN | UNKNOWN | Die Verneinung kann die fehlende Information nicht liefern. |
Berechnungen und Zusammenfassungen
Gewöhnliche Arithmetik mit NULL ergibt NULL: 5 + NULL ist NULL. Ein Positionspreis multipliziert mit einer fehlenden Stückzahl fehlt ebenfalls und ergibt nicht etwa den Wert Null. Verkettest du Text mit || und NULL, ergibt das in PostgreSQL und SQLite NULL; die Verkettung in Oracle behandelt NULL als leeren Text.
Zusammenfassende Funktionen überspringen NULL-Eingaben in der Regel. Bei fünf Kunden, darunter James und Daniel ohne Telefonnummer, zählt COUNT(*) alle fünf Zeilen. COUNT(phone) zählt die drei erfassten Telefonnummern. Der Durchschnitt von 4, NULL und 2 ist 3, weil die beiden bekannten Zahlen durch zwei geteilt werden; würde man NULL als Null behandeln, ergäbe sich fälschlich 2.
Verwende NOT NULL für Angaben, die vorhanden sein müssen, etwa ein Bestelldatum. Es erzwingt weder eine positive Zahl noch einen nicht leeren Text: Das sind eigene Regeln. Primärschlüssel verlangen eine Identität ohne NULL; gewöhnliche SQLite-Tabellen haben bei manchen Primärschlüsseldeklarationen eine historische Ausnahme, deshalb ist ein ausdrückliches NOT NULL dort wichtig.
Wichtige Erkenntnisse
- NULL kennzeichnet fehlende Information; 0 und leerer Text haben andere Bedeutungen.
- Prüfe fehlende Werte mit
IS NULLoderIS NOT NULL. - Vergleiche, an denen NULL beteiligt ist, ergeben UNKNOWN;
WHEREbehält nur TRUE. - AND, OR und NOT müssen UNKNOWN berücksichtigen.
- Gewöhnliche Arithmetik mit NULL ergibt NULL.
COUNT(*)zählt Zeilen;COUNT(column)zählt Einträge, die nicht NULL sind.- Dokumentiere für jede Spalte, warum NULL dort zulässig ist.
4Datensätze identifizieren und verknüpfen
Schlüssel beantworten zwei verschiedene Fragen: „Welche Zeile ist das?“ und „Auf welche zugehörige Zeile verweist sie?“ Ein Primärschlüssel gibt einer Tabelle eine Hauptkennung, ein Fremdschlüssel trägt einen Verweis. Prüfe mögliche Kennungen an künftigen Daten, nicht nur an einer kleinen Stichprobe. Lies Verknüpfungen dann in beide Richtungen und achte darauf, ob eine Verknüpfung optional ist. Zusammengesetzte Schlüssel und Zwischentabellen übertragen dieselben Ideen auf Datensätze, die durch Kombinationen identifiziert werden, und auf Viele-zu-viele-Beziehungen.
4.1 Schlüsselkandidaten und Primärschlüssel
Ein Schlüssel identifiziert eine Zeile über ihre Werte. Namen können sich wiederholen; Kundenkennungen unterscheiden Datensätze, sodass man sie lesen, ändern oder verknüpfen kann.
Eindeutigkeit und Minimalität prüfen
Ein Superschlüssel ist eine Spalte oder Spaltenkombination, die eine Zeile eindeutig identifiziert. Ein Schlüsselkandidat ist ein minimaler Superschlüssel: Entfernt man eine beliebige Spalte, geht diese Garantie verloren. Wähle einen Kandidaten als Primärschlüssel; die übrigen sind Alternativschlüssel.
Angenommen, employee_id, ssn und email sind jeweils Pflichtangaben und eindeutig. Dann ist jede dieser Spalten ein Schlüsselkandidat. (employee_id, department) ist ein Superschlüssel, aber kein Kandidat: employee_id allein identifiziert den Mitarbeiter. Ein wiederholter Nachname besteht den Eindeutigkeitstest nicht.
| Begriff | Test |
|---|---|
| Superschlüssel | Identifiziert die Kombination eine Zeile? |
| Schlüsselkandidat | Ist er eindeutig, ohne unnötige Spalte? |
| Primärschlüssel | Welcher Kandidat ist die Hauptkennung? |
| Alternativschlüssel | Welcher andere Kandidat steht noch zur Verfügung? |
Vier Kunden mit verschiedenen Nachnamen begründen keinen Schlüssel: Ein fünfter kann denselben Namen haben. Die Eindeutigkeit muss für alle zulässigen künftigen Daten gelten. Eine Wiederholung widerlegt einen vorgeschlagenen Schlüssel; eine Stichprobe ohne Wiederholungen braucht trotzdem eine stützende Geschäftsregel.
Die Deklaration lesen
Eine Tabelle hat höchstens einen Primärschlüssel. Seine Werte sind eindeutig, und seine Spalten dürfen nicht NULL sein. Stabile Werte vermeiden wiederholte Änderungen an Verweisen. Achte auf PRIMARY KEY: Weder der Name einer Spalte noch ihre Position deklariert den Primärschlüssel.
Existiert Kunde 1, wird ein weiterer Kunde mit dem Schlüssel 1 abgewiesen. Ein weggelassener Schlüssel braucht einen Standardwert oder einen generierten Wert. INTEGER PRIMARY KEY in SQLite erzeugt eine Ganzzahl, wenn der Wert weggelassen oder als NULL angegeben wird. Einige andere Primärschlüsseldeklarationen in gewöhnlichen SQLite-Tabellen lassen aus historischen Gründen NULL zu; ein ausdrückliches NOT NULL, eine STRICT-Tabelle oder die Form mit ganzzahligem Primärschlüssel schließt diese Lücke.
Einen zusammengesetzten Schlüssel lesen
In enrollments(student_id, course_id, term, grade) kann ein Student mehrere Kurse belegen und einen davon in einem anderen Semester wiederholen. (student_id, course_id, term) identifiziert eine Einschreibung: ein zusammengesetzter Primärschlüssel, nicht drei getrennte Primärschlüssel.
Einzelne Bestandteile dürfen sich wiederholen, die vollständige Kombination nicht. Die meisten DBMS legen zum Nachschlagen einen Index für den Primärschlüssel an, aber der Schlüssel garantiert keine Reihenfolge der Abfrageausgabe.
Wichtige Erkenntnisse
- Ein Schlüsselkandidat ist ein minimaler Superschlüssel.
- Ein Kandidat ist der Primärschlüssel; die übrigen sind Alternativschlüssel.
- Die Eindeutigkeit eines Schlüssels muss für zulässige künftige Daten gelten.
- Ein Primärschlüssel ist eindeutig, nie NULL und kann mehrere Spalten umfassen.
- Die Deklaration legt den Schlüssel fest, nicht sein Name oder seine Position.
4.2 Natürliche und generierte Kennungen
Ein natürlicher Schlüssel stammt aus Daten der realen Welt, etwa die FIN (VIN) eines Fahrzeugs, die ISBN einer Buchausgabe oder das Kürzel eines Bundesstaats. Ein Surrogatschlüssel existiert nur, um eine Zeile zu identifizieren, oft als generierte Ganzzahl oder UUID.
Eine dauerhafte Kennung wählen
Bevorzuge eindeutige, stets vorhandene, stabile, kompakte Werte, die man unbedenklich weitergeben kann. Namen wiederholen sich; Telefonnummern und E-Mail-Adressen ändern sich oder werden geteilt. Sozialversicherungsnummern sind sensibel und für manche Kunden nicht verfügbar; verwendet man sie in verweisenden Tabellen, verbreitet sich diese Information.
Mit einer generierten customer_id behält Maria die Kennung 1, auch wenn sich ihre Kontaktdaten ändern. Ein natürlicher Schlüssel state_code wie TX kann gut funktionieren, weil er kompakt, standardisiert und in Adressdatensätzen nützlich ist.
Geschäftliche Kennungen eigens schützen
Dieselbe Person kann sich zweimal registrieren und zwei Surrogat-IDs erhalten. Die IDs unterscheiden Zeilen; doppelte Personen erkennen sie nicht.
Muss die E-Mail-Adresse jedes Konto identifizieren, verwende NOT NULL UNIQUE. UNIQUE allein erlaubt in PostgreSQL, SQLite und MySQL mehrere NULL-Werte. SQL Server erlaubt bei einer UNIQUE-Bedingung auf einer einzelnen Spalte normalerweise genau einen NULL-Wert. Vorhandensein und Eindeutigkeit sind getrennte Regeln.
Die verpflichtende, eindeutige E-Mail-Adresse ist ein Alternativschlüssel. Ändert sie sich, bleibt die Surrogat-Kundennummer in bestehenden Bestellungen unverändert. Ändert sich ein referenzierter Primärschlüssel, müssen auch die Verweise in den Kindtabellen konsistent bleiben.
Syntax für generierte Schlüssel erkennen
| System | Übliche Form für generierte Ganzzahlen |
|---|---|
| Standard-SQL, PostgreSQL, Oracle | GENERATED ALWAYS AS IDENTITY |
| MySQL | AUTO_INCREMENT |
| SQL Server | IDENTITY(1,1) |
| SQLite | INTEGER PRIMARY KEY |
PostgreSQL kennt außerdem die ältere Form SERIAL. Löschungen, fehlgeschlagene Einfügungen und abgebrochene Vorgänge können Lücken hinterlassen. Die IDs 1, 2 und 4 kennzeichnen drei Zeilen, nicht vier. Wer neu nummeriert, um Lücken zu schließen, kann Verweise zerstören.
UUIDs erkennen
Eine UUID ist eine 128-Bit-Kennung, die meist als 36 Zeichen mit Bindestrichen geschrieben wird: 7c9e6679-7425-40de-944b-e07fc1f90ae7. Computer können sie unabhängig voneinander mit sehr geringem Kollisionsrisiko erzeugen; das ist nützlich, wenn Datensätze von mehreren Orten zusammengeführt werden.
UUIDs brauchen mehr Platz und sind schwerer zu lesen als kleine Ganzzahlen. Wähle danach, wie Datensätze erzeugt und referenziert werden. Beide Arten von Schlüsseln sind Etiketten: Ihr Höchstwert ist keine Zeilenanzahl, und ihre Reihenfolge muss nicht die zeitliche Abfolge von Ereignissen zeigen.
Wichtige Erkenntnisse
- Natürliche Schlüssel stammen von Kennungen aus der realen Welt; Surrogatschlüssel existieren zur Identifikation von Zeilen.
- Bevorzuge Primärschlüssel, die stabil, kompakt, stets vorhanden und unbedenklich weiterzugeben sind.
- Ein Surrogatschlüssel verhindert keine doppelten Datensätze für dasselbe Objekt der realen Welt.
NOT NULL UNIQUEkann eine verpflichtende alternative Kennung schützen.- Lücken in generierten IDs sind normal; IDs sind Etiketten, keine Zählungen.
- UUIDs lassen sich unabhängig voneinander mit sehr geringem Kollisionsrisiko erzeugen.
4.3 Fremdschlüssel und gültige Verweise
Ein Fremdschlüssel ist eine Spalte oder Spaltengruppe, die auf einen Primärschlüssel oder einen anderen geeigneten eindeutigen Schlüssel verweist. Die Tabelle mit dem Verweis ist die Kindtabelle; die Tabelle, auf die sie zeigt, ist die Elterntabelle. Ein Fremdschlüssel, der nicht NULL ist, muss zu einem existierenden Elternschlüssel passen, wenn die Integritätsbedingung durchgesetzt wird.
Einem Wert über Tabellen hinweg folgen
order_id | customer_id | order_date | shipped_date |
|---|---|---|---|
| 101 | 1 | 2026-03-02 | 2026-03-04 |
| 102 | 2 | 2026-03-05 | NULL |
| 103 | 1 | 2026-03-09 | 2026-03-10 |
orders.customer_id verweist auf customers.customer_id. Bestellung 102 zeigt auf Kunde 2, James Wilson. Die Bestellungen 101 und 103 zeigen beide auf Kunde 1, Maria Garcia. Im Fremdschlüssel sind Wiederholungen erlaubt; der referenzierte Elternschlüssel ist eindeutig.
Diese Regel heißt referenzielle Integrität. Eine Bestellung für Kunde 99 wird abgewiesen, wenn Kunde 99 nicht existiert. Andernfalls wäre sie verwaist: eine Kindzeile ohne passende Elternzeile. Ein Name allein erzeugt keine Integritätsbedingung. Ein Fremdschlüssel namens placed_by kann trotzdem auf customer_id verweisen; die Verknüpfung entsteht durch den deklarierten Verweis, wobei die Schlüsselspalten zueinander passende Typen haben.
Optional oder verpflichtend
Eine NULL-fähige coupon_id kann NULL sein, wenn eine Bestellung keinen Gutschein hat. Eine als NOT NULL deklarierte customer_id verlangt, dass jede Bestellung einen Kundenverweis hat, und der Fremdschlüssel verlangt, dass dieser Kunde existiert. Beide Integritätsbedingungen wirken zusammen: Die eine verlangt einen Wert, die andere prüft den Verweis.
Fremdschlüssel müssen keine Tabellengrenzen überschreiten. In employees(employee_id, name, manager_id) kann manager_id auf employee_id in derselben Tabelle verweisen. Bei der Person an der Spitze des Unternehmens kann der Verweis auf die Führungskraft NULL sein.
Änderungen an Elternzeilen brauchen eine Regel
| Aktion | Wirkung, wenn eine referenzierte Elternzeile gelöscht wird |
|---|---|
NO ACTION oder RESTRICT | Lehnt das Löschen ab, solange Verweise bestehen, abhängig vom Prüfzeitpunkt der Integritätsbedingung |
CASCADE | Löscht die verweisenden Kindzeilen mit |
SET NULL | Behält die Kindzeilen und leert ihren Verweis; die Spalte muss NULL zulassen |
Mit der Standardaktion kann Kunde 1 nicht gelöscht werden, solange die Bestellungen 101 und 103 noch auf diese Kundin verweisen. Eine Kaskade von einer Bestellung auf ihre Positionen kann sinnvoll sein, weil diese Positionen zu genau dieser Bestellung gehören. ON UPDATE legt das entsprechende Verhalten fest, wenn sich ein Elternschlüssel ändert. Kaskadierung bedeutet nicht, dass das Löschen einer Kindzeile ihre Elternzeile löscht.
Zusammengesetzte Verweise und Durchsetzung
Wird eine Bestellposition durch (order_id, product_id) identifiziert, braucht eine Lieferung, die auf diese Position verweist, beide Spalten. Die Kombination muss zu einer existierenden Position passen. Bestellung und Produkt getrennt abzugleichen reicht nicht: Dieses Produkt kam in dieser Bestellung vielleicht nie vor. Ein verpflichtender zusammengesetzter Verweis deklariert alle seine Spalten als NOT NULL.
PostgreSQL, SQL Server, Oracle und MySQL mit seiner üblichen Engine InnoDB setzen deklarierte Fremdschlüssel durch. In SQLite musst du die Fremdschlüsselprüfung für jede Verbindung mit PRAGMA foreign_keys = ON; aktivieren und kontrollieren, bevor du dich darauf verlässt. Eine deklarierte, aber deaktivierte Integritätsbedingung kann die Zeilen nicht schützen. Fremdschlüssel führen Abfrageergebnisse auch nicht von selbst zusammen; eine Abfrage muss der Verknüpfung ausdrücklich folgen, meist über einen Join.
Wichtige Erkenntnisse
- Ein Fremdschlüsselwert, der nicht NULL ist, muss zu einem existierenden referenzierten Schlüssel passen.
- Fremdschlüsselwerte können sich wiederholen; die Werte des Elternschlüssels sind eindeutig.
NOT NULLmacht die Verknüpfung verpflichtend.- Referenzielle Aktionen steuern, was mit Kindzeilen geschieht, wenn sich eine Elternzeile ändert.
- Ein zusammengesetzter Verweis muss zur vollständigen Kombination des Elternschlüssels passen.
- Die Fremdschlüsselprüfung in SQLite muss für jede Verbindung aktiviert werden.
4.4 Die Kardinalität einer Beziehung in beide Richtungen lesen
Um eine Beziehung zu bestimmen, stell zwei Fragen: „Wie viele Zeilen dort können mit einer Zeile hier verknüpft sein?“ und dann die umgekehrte Frage. Berücksichtige das Minimum ebenso wie das Maximum. Die heutige Stichprobe zeigt, was passiert ist; die Integritätsbedingungen beschreiben, was erlaubt ist.
Ein Kunde, viele Bestellungen
Ein Kunde kann keine oder mehrere Bestellungen aufgeben. Jede Bestellung des Shops gehört zu genau einem Kunden, weil orders.customer_id ein Fremdschlüssel ist, der nicht NULL sein darf. Das ist eine Eins-zu-viele-Beziehung. Der Fremdschlüssel gehört in orders, auf die „Viele“-Seite: Jede Bestellung speichert einen Kundenverweis.
Maria hat die Bestellungen 101 und 103; James hat Bestellung 102. Aisha und Wei haben keine. Dass sie in orders nicht vorkommen, ist zulässig. Ein Fremdschlüssel verlangt zu jeder Kindzeile eine Elternzeile, aber nicht, dass jede Elternzeile eine Kindzeile hat.
Eins zu eins braucht zusätzlich Eindeutigkeit
In user_profiles(user_id, bio, photo_url) sei user_id zugleich Primärschlüssel und Fremdschlüssel auf users. Jedes Profil verweist auf einen Nutzer, und ein Nutzer kann höchstens ein Profil haben, weil sich der Profilschlüssel nicht wiederholen kann. Ein Nutzer hat vielleicht noch kein Profil.
Ein Fremdschlüssel ohne Eindeutigkeit würde mehrere Profile für denselben Nutzer erlauben und ergäbe eins zu viele. Die Eindeutigkeitsbedingung ändert das Maximum. Solche getrennten Profiltabellen können optionale oder sensible Angaben vom Hauptdatensatz des Nutzers getrennt halten.
Viele zu viele nutzt eine Tabelle aus Paaren
Eine Bestellung kann mehrere Produkte enthalten, und ein Produkt kann in mehreren Bestellungen vorkommen. Eine Zwischentabelle, auch Brücken-, Verknüpfungs- oder Assoziationstabelle genannt, erfasst jede Paarung:
order_id | product_id | quantity | unit_price |
|---|---|---|---|
| 101 | 11 | 2 | 12,50 |
| 101 | 12 | 1 | 8,99 |
| 102 | 13 | 1 | 34,00 |
| 103 | 11 | 4 | 12,50 |
order_id verweist auf orders; product_id verweist auf products. Der zusammengesetzte Primärschlüssel (order_id, product_id) erlaubt dasselbe Produkt in verschiedenen Bestellungen, verhindert aber, dass dasselbe Paar zweimal vorkommt. Zwei Eins-zu-viele-Verknüpfungen setzen die Viele-zu-viele-Beziehung um.
quantity und unit_price gehören zur Paarung. Sie beschreiben, wie viel von diesem Produkt in dieser Bestellung verkauft wurde und welcher Preis damals verlangt wurde. Ein aktueller Produktpreis kann sich später ändern; er darf den historisch verlangten Betrag nicht überschreiben.
Für Bestellung 101 sind die beiden Positionsbeträge zwei Becher zu je 12,50 $, also 25,00 $, und ein Ladegerät zu 8,99 $. Zusammen kosten sie 33,99 $. Die Stückzahl gibt an, wie viele Becher gekauft wurden; zwei doppelte Becherpositionen zu speichern würde dem gewählten Schlüssel dieser Tabelle widersprechen.
Listen und feste Plätze vermeiden
Eine Zelle product_ids mit dem Textwert '11,12' versteckt mehrere Verweise in einem einzigen Textwert. Spalten wie product1, product2 und product3 legen eine feste Obergrenze fest und lassen ungenutzte Plätze zurück. Eine Zwischentabelle fügt für jede weitere Paarung eine Zeile hinzu und lässt das DBMS jeden Verweis einzeln prüfen.
Eine selbstreferenzierende Beziehung nutzt dasselbe Muster innerhalb einer Tabelle: Viele Mitarbeiter können über manager_id auf dieselbe Führungskraft verweisen. Die Führungskraft ist ebenfalls eine Mitarbeiterzeile. Lies jede Verknüpfung als Rolle, damit die Identität des Mitarbeiters und der Verweis auf die Führungskraft getrennt bleiben.
Wichtige Erkenntnisse
- Lies in jeder Richtung das zulässige Minimum und Maximum.
- Bei eins zu viele steht der Fremdschlüssel auf der „Viele“-Seite.
- Ein eindeutiger Fremdschlüssel begrenzt eine Beziehung auf höchstens eine Kindzeile pro Elternzeile.
- Eine Zwischentabelle stellt Viele-zu-viele-Verknüpfungen durch Zeilen aus Paaren dar.
- Angaben wie Stückzahl und Verkaufspreis können zu einer Paarung gehören.
- Eine Selbstreferenz verknüpft Rollen innerhalb einer Tabelle.
5Ein Schema lesen und seinen Verknüpfungen folgen
Ein Schema hält die Struktur fest, die Tabellen ihre Bedeutung gibt: Spaltentypen, Kennungen, Verweise und Integritätsbedingungen. Ein Diagramm macht diese Verknüpfungen sichtbar, während eine Tabellendefinition die Regeln genau angibt. Nutze beide Formen, um den Weg von einer Frage zu ihrer Antwort zu finden, und lies die Werte dann aus den tatsächlichen Zeilen ab. Halte Struktur und aktuelle Daten auseinander: Zu wissen, dass Bestellungen auf Kunden verweisen, sagt dir nicht, welche Kunden heute bestellt haben.
5.1 Struktur, aktuelle Daten und Integritätsbedingungen
Ein Schema beschreibt Tabellen, Spalten, Datentypen und Integritätsbedingungen. Eine Ausprägung sind die zu einem bestimmten Zeitpunkt gespeicherten Daten. Kommt eine Bestellung hinzu, ändert sich die Ausprägung; kommt eine neue Spalte hinzu, ändert sich das Schema. Das Schema sagt, was gespeichert werden kann, die Zeilen sagen, was jetzt gespeichert ist.
Eine Kurzbeschreibung lesen
customers(customer_id, first_name, last_name, email, phone, city, state, zip_code) nennt eine Tabelle und ihre Spalten. In Notizen werden Primärschlüssel manchmal unterstrichen oder mit PK markiert und Verweise mit FK. So nennt zum Beispiel orders(order_id PK, customer_id FK → customers, order_date, shipped_date) den Hauptschlüssel und die Verknüpfung zum Kunden.
Eine vollständige Tabellendefinition lesen
CREATE TABLE orders (
order_id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL REFERENCES customers (customer_id),
order_date DATE NOT NULL,
shipped_date DATE
);
Lies eine Spalte nach der anderen. order_id ist der ganzzahlige Primärschlüssel. customer_id ist eine Pflichtangabe und muss auf einen Kunden verweisen. order_date ist eine Pflichtangabe. shipped_date darf NULL sein. Diese Definition beschreibt die zulässige Struktur, keine Liste existierender Bestellungen.
Integritätsbedingungen beantworten unterschiedliche Fragen:
| Integritätsbedingung | Was sie prüft |
|---|---|
PRIMARY KEY | Eine eindeutige Zeilenkennung, eventuell zusammengesetzt |
NOT NULL | Ein Wert ist vorhanden |
UNIQUE | Wiederholte Werte, die nicht NULL sind, sind verboten; der Umgang mit NULL ist unterschiedlich |
REFERENCES | Ein Verweis passt zu einem Elternschlüssel |
CHECK | Eine Bedingung darf nicht FALSE sein |
DEFAULT | Liefert einen Wert, wenn keiner angegeben ist |
Ein Standardwert ersetzt keinen angegebenen ungültigen Wert. Hat status die Angabe DEFAULT 'pending' und lässt du den Status weg, wird 'pending' eingetragen; ein angegebener Wert muss trotzdem die übrigen Regeln der Spalte erfüllen.
Regeln für eine Bestellposition kombinieren
CREATE TABLE order_items (
order_id INTEGER NOT NULL REFERENCES orders (order_id),
product_id INTEGER NOT NULL REFERENCES products (product_id),
quantity INTEGER NOT NULL CHECK (quantity > 0),
unit_price DECIMAL(8, 2) NOT NULL,
PRIMARY KEY (order_id, product_id)
);
Der Primärschlüssel am Ende umfasst zwei Spalten. Eine zweite Position für dieselbe Bestellung und dasselbe Produkt scheitert. Die Stückzahl 0 scheitert an der Prüfung. Eine fehlende Stückzahl scheitert an NOT NULL: Die Prüfung allein würde NULL zulassen, weil NULL > 0 UNKNOWN ergibt und nicht FALSE. Ein ausdrückliches NOT NULL auf beiden Schlüsselteilen vermeidet außerdem die historische Ausnahme von SQLite für zusammengesetzte Schlüssel mit NULL. Verwende in SQLite ganzzahlige Centbeträge für einen exakten unit_price; die Dezimaldeklaration allein sorgt nicht für exakte Speicherung.
Das Schema und seine Bedeutungen finden
In der SQLite-Shell zeigt .schema orders die Definition an; in psql von PostgreSQL beschreibt \d orders die Tabelle. Die Sichten INFORMATION_SCHEMA listen in PostgreSQL, MySQL und SQL Server strukturelle Metadaten auf. SQLite listet Objekte in sqlite_schema auf, und grafische Werkzeuge zeigen Tabellen und Spalten in einem Baum.
„Schema“ bezeichnet in Systemen wie PostgreSQL und SQL Server außerdem einen Namensraum. sales.orders bezeichnet die Tabelle orders im Schema sales. Ein Datenkatalog liefert Bedeutungen, die die Struktur nicht ausdrücken kann, etwa die Währung der Preise oder ob ein fehlendes Versanddatum „nicht versandt“ bedeutet. Um Zeilen zu sehen, liest eine Abfrage wie SELECT * FROM orders; die aktuelle Ausprägung.
Wichtige Erkenntnisse
- Ein Schema ist Struktur; eine Ausprägung sind die Daten zu einem Zeitpunkt.
- Lies den Typ einer Spalte zusammen mit all ihren Integritätsbedingungen.
- Eine verpflichtende positive Zahl braucht sowohl
NOT NULLals auch eine Prüfung auf positive Werte. - Ein zusammengesetzter Primärschlüssel wird über die ganze Kombination deklariert.
- Ein Datenkatalog hält Bedeutungen und Einheiten fest, die über das Schema hinausgehen.
5.2 Die Enden einer Linie im Schemadiagramm lesen
Ein Schemadiagramm zeichnet jede Tabelle als Kasten. Der Titel nennt die Tabelle; der Inhalt listet die Spalten und oft ihre Typen auf. PK markiert Primärschlüssel, FK markiert Fremdschlüssel. Beziehungslinien zeigen, welcher Fremdschlüssel auf welchen Elternschlüssel verweist.
Zuerst die Art der Linie bestimmen
Manche Diagramme verwenden einen Pfeil vom Fremdschlüssel zum referenzierten Schlüssel. Ein Pfeil von orders.customer_id zu customers.customer_id beschreibt die Richtung des Verweises. Andere Werkzeuge beschreiben mit Endsymbolen, wie viele Zeilen verknüpft sein können. Sieh in der Legende des Diagramms nach: Die Richtung eines Pfeils und die Kardinalität einer Beziehung sind unterschiedliche Informationen.
Krähenfußsymbole lesen
In der Krähenfußnotation bedeutet ein Strich eins, ein Kreis null und ein Fuß mit drei Zinken viele. Jedes Linienende gibt ein Minimum und ein Maximum an. Das Symbol, das der Tabelle am nächsten ist, gibt das Maximum an, das andere das Minimum.
| Endsymbole | Zulässige Anzahl von Zeilen an diesem Ende |
|---|---|
| Strich und Strich | Genau eins |
| Kreis und Strich | Null oder eins |
| Strich und Krähenfuß | Eins oder mehr |
| Kreis und Krähenfuß | Null oder mehr |
Wenn du von einer Tabelle aus liest, schau auf die Symbole neben der anderen Tabelle. Diese Symbole beschreiben, wie viele Zeilen dort zu deiner einen Ausgangszeile passen können.
Kunden und Bestellungen durchgehen
Die Linie im Shop hat neben customers die Symbole für genau eins und neben orders die Symbole für null oder mehr.
- Beginne mit einem Kunden. Schau auf das Ende bei den Bestellungen: Der Kunde kann keine oder mehrere Bestellungen haben.
- Beginne mit einer Bestellung. Schau auf das Ende bei den Kunden: Die Bestellung gehört zu genau einem Kunden.
- Prüfe die Definition: Der Fremdschlüssel, der nicht NULL sein darf, steht in
orders; diese Tabelle ist also die „Viele“-Seite, und jede Bestellung braucht einen gültigen Kunden.
Der Krähenfuß steht neben der Tabelle mit dem sich wiederholenden Fremdschlüssel. Liest du das nahe Ende, während du von derselben Tabelle ausgehst, kehrst du die Bedeutung um. Ein NULL-fähiger Kundenverweis würde das Ende bei den Kunden zu null oder eins ändern; er würde nicht jeden Kunden auf eine Bestellung beschränken.
Eine Zwischentabelle erkennen
Der Shop hat Eins-zu-viele-Verknüpfungen von orders zu order_items und von products zu order_items. Beide „Viele“-Enden treffen sich bei order_items. Die beiden Fremdschlüssel dieser Tabelle bilden ihren Primärschlüssel. Durch diese Struktur kann eine Bestellung mehrere Produkte enthalten und ein Produkt in mehreren Bestellungen vorkommen.
Das Diagramm beschreibt zulässige Verbindungen, nicht die heutigen Anzahlen. Es erlaubt, dass Maria mehrere Bestellungen hat und Aisha keine. Wie viele jede tatsächlich hat, erfährst du aus den Zeilen. Ein Minimum von eins von der Eltern- zur Kindseite kann eine zusätzliche Geschäftsregel ausdrücken; ein Fremdschlüssel allein verlangt nicht, dass eine Elternzeile Kindzeilen hat.
Verwandte Diagrammarten erkennen
Ein Entity-Relationship-Diagramm, das beim Entwurf entsteht, kann geschäftliche Entitäten zeigen, bevor Tabellen existieren. Diagramme nach Chen verwenden Ovale für Attribute und Rauten für Beziehungen. Ein Schemadiagramm zeigt die tatsächlichen Tabellen und ihre deklarierten Schlüssel. Beide helfen, Strukturen zu vermitteln, aber ihre Symbole müssen nach der jeweils eigenen Legende gelesen werden.
Wichtige Erkenntnisse
- Ein Schemadiagramm zeigt Tabellen und deklarierte Schlüsselverknüpfungen.
- Lies an jedem Linienende mithilfe der Legende Minimum und Maximum ab.
- Das entfernte Ende beschreibt die Zeilen, die mit einer Ausgangszeile verknüpft sind.
- Das „Viele“-Ende einer Eins-zu-viele-Verknüpfung trägt den sich wiederholenden Fremdschlüssel.
- Treffen sich zwei „Viele“-Enden an einer Tabelle, kann das auf eine Zwischentabelle hinweisen.
- Ein Diagramm zeigt zulässige Verbindungen; die Zeilen zeigen die tatsächlichen Anzahlen.
5.3 Fakten finden, indem du Schlüsseln folgst
Finde jede gefragte Information und folge den Schlüsseln, die sie mit dem Ausgangsdatensatz verbinden. Namen können sich wiederholen oder ändern; gleiche stattdessen Schlüsselwerte ab.
Den Kunden einer Bestellung finden
„Wo wohnt der Kunde, der Bestellung 102 aufgegeben hat?“ folgt diesem Weg:
- Finde Bestellung 102 über
orders.order_id. - Lies ihre
customer_idab: 2. - Finde Kunde 2 über
customers.customer_id. - Lies
customers.cityab: Denver.
Die Bestellnummer 102 ist nicht die Kundenkennung. SQL-Joins automatisieren diese Schlüsselabgleiche; Anzeigepositionen verbinden die Datensätze nicht.
Produkte und eine historische Summe finden
Zu Bestellung 101 gehören diese Zeilen in order_items. Folge jeder product_id zu products, um den Namen zu finden:
product_id | quantity | unit_price | Produktname |
|---|---|---|---|
| 11 | 2 | 12,50 | Coffee mug |
| 12 | 1 | 8,99 | Phone charger |
Verwende den erfassten Positionspreis für den verlangten Betrag:
- Zwei Becher zu je 12,50 $ kosten 25,00 $.
- Ein Ladegerät zu 8,99 $ kostet 8,99 $.
- Summe: 33,99 $.
Der heutige Produktpreis könnte die Kosten einer alten Bestellung falsch wiedergeben. Bestellung 102 enthält eine Lampe zu 34,00 $; Bestellung 103 enthält vier Becher zu je 12,50 $, zusammen 50,00 $.
Fehlende Werte und Regeln deuten
Das Versanddatum von Bestellung 102 ist NULL, hier dokumentiert als „nicht versandt“. Prüfe es mit IS NULL, nicht mit einem Gleichheitsvergleich mit NULL.
Lies jede relevante Integritätsbedingung, wenn du eine Änderung beurteilst:
- Eine Position für Bestellung 104 scheitert, wenn diese Bestellung nicht existiert.
- Eine weitere Position mit dem Schlüssel (
101,11) scheitert, weil das Paar bereits existiert. - Die Stückzahl 0 scheitert an der Prüfung auf eine positive Stückzahl.
- Das Standardverhalten des Fremdschlüssels verhindert das Löschen von Produkt 11, solange Positionen darauf verweisen.
Ein noch nicht verwendeter Schlüssel macht eine Zeile nicht gültig, wenn ihr Verweis ins Leere geht.
Die neuen Zeilen bestimmen
Kauft ein wiederkehrender Kunde zwei verschiedene vorhandene Produkte, kommen eine Zeile in orders und zwei Zeilen in order_items hinzu. Der Kunde und die Produkte existieren bereits. Wird ein neues Produkt angeboten, kommt eine Zeile in products hinzu, ohne dass dafür eine Bestellung nötig ist.
Wichtige Erkenntnisse
- Finde jede gefragte Information, bevor du dem Schlüsselpfad folgst.
- Gleiche Fremdschlüsselwerte mit referenzierten Schlüsseln ab, nicht mit Namen oder Zeilenpositionen.
- Verwende für historische Bestellsummen den Preis aus der Verkaufsposition.
- Prüfe jede zutreffende Integritätsbedingung, wenn du eine geplante Änderung beurteilst.
- Ein neues Ereignis fügt Zeilen in die Tabellen ein, deren Fakten es erzeugt.
Relationale Datenbanken: Beispiele
1Von gemeinsamen Datensätzen zu Datenbankanfragen
12 Schritte
- 1EinführungWer kümmert sich um gemeinsame Fakten?
Vertrieb, Kundenservice und Geschäftsführung eines Ladens nutzen dieselben Kundendatensätze. Eine Datenbank enthält solche gemeinsamen Fakten, und Software namens DBMS verwaltet sie.
Verfolge, wie ein Datenbanksystem diese Fakten teilt, Änderungen konsistent hält (Aufgabe einer Transaktion) und Anfragen von Anwendungen beantwortet.
- 2ErklärungSammlung und Software trennen
Daten sind festgehaltene Fakten. Eine Datenbank ist eine organisierte Sammlung zusammengehöriger Daten; ein DBMS ist die Software, die sie verwaltet.
Die Kunden und Bestellungen des Ladens sind Daten. PostgreSQL speichert sie, prüft Regeln und beantwortet Anfragen.
- 3BeispielEine Telefonnummer aktualisieren
Die Telefonnummer von Maria steht bei 14 Verkäufen in der Tabellenkalkulation. Eine vergessene Änderung hinterlässt widersprüchliche Kopien.
Speichere ihre Telefonnummer einmal unter
customer_id1 und lass die Verkäufe auf sie verweisen. Eine neue Telefonnummer braucht dann nur eine Aktualisierung; jeder Verkauf behält seine eigenen Fakten. - 4AnalogieZwei Änderungen zusammenhalten
Eine Überweisung zieht einen Betrag vom Girokonto ab und schreibt ihn dem Sparkonto gut. Würde nur die Abbuchung gespeichert, wären die Kontostände falsch.
Eine Transaktion speichert beide Änderungen gemeinsam oder macht beide rückgängig, auch über mehrere Zeilen oder Tabellen hinweg.
- 5HerausforderungDen Schutz auswählen
Eine Reservierung verringert die Zahl der verfügbaren Plätze, aber das Speichern des Zahlungsdatensatzes schlägt fehl. Beide Änderungen gehören zu einer Transaktion. Was sollte übrig bleiben, nachdem diese Transaktion rückgängig gemacht wurde?
---reveal---
Keine der beiden Änderungen. Wird die Verringerung der Plätze rückgängig gemacht, gilt wieder die frühere Verfügbarkeit, und aus der fehlgeschlagenen Transaktion wird kein Zahlungsdatensatz gespeichert. Bliebe nur die Platzänderung, entstünde eine halbe Reservierung.
- 6VerbindungDie Art der Arbeitslast erkennen
Eine Bestellung aufzugeben ist transaktionsorientierte Arbeit: wenige schnelle Lese- und Schreibzugriffe. Monatliche Umsätze nach Region zu vergleichen ist analytische Arbeit: Viele historische Datensätze werden zusammengefasst.
Eine Verkaufsdatenbank kann beiden Tätigkeiten dienen.
- 7ErklärungDer Anfrage der Anwendung folgen
Clients senden Anfragen an einen Datenbankserver, etwa bei PostgreSQL oder SQL Server. SQLite läuft als Bibliothek innerhalb der Anwendung, ohne separaten Server.
Ein Anbieter verwalteter Cloud-Dienste betreibt die Server für seine Nutzer; Tabellen und Anfragen gelten weiterhin.
- 8BeispielEine deklarative Anfrage lesen
SELECT first_name, city FROM customers WHERE state = 'TX';fordert zwei Spalten von den Kunden in TX an.SQL ist deklarativ: Es nennt das Ergebnis und überlässt die Schritte zum Abrufen dem DBMS. SQL ist die Sprache; PostgreSQL ist ein Produkt, das sie interpretiert.
- 9TippDie Aufgabe der Anweisung erkennen
ALTER TABLEändert die Struktur;INSERTfügt eine Zeile hinzu;GRANTverwaltet Berechtigungen;COMMITspeichert eine Transaktion.Text steht in einfachen Anführungszeichen:
'TX'. Ein Apostroph im Text wird verdoppelt:'O''Brien'. Ein Semikolon beendet normalerweise eine Anweisung. - 10HerausforderungStruktur oder Daten?
Ein Laden fügt eine Spalte
delivery_notehinzu und füllt sie dann für eine Bestellung. Sind beide Änderungen Änderungen an Zeilen?---reveal---
Fügst du die Spalte hinzu, änderst du die Struktur: Datendefinition. Füllst du sie, änderst du gespeicherte Daten: Datenmanipulation.
- 11HerausforderungDie Teile zusammenführen
Eine Website sendet SQL an einen PostgreSQL-Server, um einen Kauf zu erfassen. Eine Führungskraft liest später eine gewöhnliche Sicht auf die Verkäufe. Enthält die Sicht eine weitere gespeicherte Kopie all dieser Kaufzeilen?
---reveal---
Nein. Eine gewöhnliche Sicht speichert eine Abfrage, die die zugrunde liegenden Daten liest; eigene Ergebniszeilen speichert sie nicht. PostgreSQL bleibt das DBMS, das die Kaufdatensätze verwaltet, während die Website und das Berichtswerkzeug Clients sind.
- 12ZusammenfassungEine gemeinsame Sammlung mit klaren Zuständigkeiten
Eine Datenbank enthält Fakten; ein DBMS verwaltet Speicherung, Regeln, Zugriff und Wiederherstellung. Transaktionen halten Änderungen zusammen.
SQL-Anfragen betreffen Struktur, Zeilen, Berechtigungen oder Transaktionssteuerung. Bestimme die Aufgabe, bevor du die Details liest.
2Die Bedeutung hinter einer Tabelle lesen
10 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungDamit beginnen, wofür eine Zeile steht
- 2BeispielDie Stadt eines Kunden finden
- 3ErklärungDie formalen Bezeichnungen verwenden
- 4HerausforderungZwei Arten von Ergänzungen vorhersagen
- 5KernaussageDatensätze ohne Positionen identifizieren
- 6AnalogieEinen Wert pro Eigenschaft speichern
- 7ErklärungEinen Typ seiner Domäne zuordnen
- 8HerausforderungEinen Export aus einer Tabellenkalkulation deuten
- 9HerausforderungEinen neuen Datensatz und seine Werte prüfen
- 10ZusammenfassungErst die Struktur, dann die Werte lesen
3Datentypen wählen und mit NULL logisch umgehen
15 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungZwei Entscheidungen für jede Spalte
- 2ErklärungZahlenfamilien unterscheiden
- 3TippUnterschiede zwischen Produkten beachten
- 4HerausforderungEinen Dezimalbereich prüfen
- 5VerbindungDatumswerte und Flags erkennen
- 6ErklärungNach dem Zweck des Werts wählen
- 7BeispielGeldbeträge exakt speichern
- 8HerausforderungEinen Code und eine Stückzahl korrigieren
- 9ErklärungLesen, was fehlt
- 10BeispielEinem unbekannten Vergleich folgen
- 11KernaussageDen Test für fehlende Werte verwenden
- 12HerausforderungBekanntes und Unbekanntes verknüpfen
- 13BeispielZählen, was vorhanden ist
- 14HerausforderungDie Deutung eines Berichts prüfen
- 15ZusammenfassungDie Bedeutung bestimmt die Speicherung
4Verlässliche Verknüpfungen über Schlüssel aufbauen
18 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungErst die Identität, dann die Verknüpfung
- 2ErklärungEindeutigkeit und Minimalität prüfen
- 3HerausforderungEine künftige Einschreibung prüfen
- 4TippEinen Primärschlüssel deklarieren
- 5ErklärungEin stabiles Etikett wählen
- 6KernaussageEine eigene Geschäftsregel festlegen
- 7HerausforderungEine Lücke ohne Neunummerierung lesen
- 8BeispielDem Verweis einer Bestellung folgen
- 9ErklärungVerpflichtende und optionale Verweise
- 10HerausforderungEine Löschregel lesen
- 11VerbindungDen ganzen Verweis prüfen
- 12ErklärungEins zu viele in beide Richtungen lesen
- 13BeispielEine Verknüpfung auf eins begrenzen
- 14BeispielJede Produktpaarung darstellen
- 15KernaussageEine Information über das Paar speichern
- 16HerausforderungEine Verknüpfung für eine neue Situation wählen
- 17HerausforderungIdentität und Verweise kombinieren
- 18ZusammenfassungSchlüssel erfüllen gemeinsam verschiedene Aufgaben
5Ein Schema lesen, um eine Frage zu beantworten
14 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungDie Karte von den Datensätzen trennen
- 2BeispielEine Bestelldefinition lesen
- 3KernaussageEine Prüfung mit einem Pflichtwert kombinieren
- 4HerausforderungZwei Änderungen einordnen
- 5TippDie vollständigen Regeln finden
- 6ErklärungDie Legende eines Diagramms lesen
- 7BeispielMit einer Zeile beginnen und hinüberschauen
- 8HerausforderungEine optionale Verknüpfung vorhersagen
- 9VerbindungEine Tabelle aus Paaren erkennen
- 10BeispielBestellung 102 bis zu ihrer Stadt folgen
- 11BeispielAus den Verkaufspositionen rechnen
- 12HerausforderungEine geplante Position beurteilen
- 13HerausforderungDaten, Regeln und Bedeutung verbinden
- 14ZusammenfassungJede Quelle für ihre eigene Information nutzen
Relationale Datenbanken: Übungsaufgaben
Set 1: Datensätze, Typen und einfache Verknüpfungen lesen10 Übungsfragen
Frage 1 von 10
DECIMAL(7, 2) vor dem Komma stehen?Antwort zeigenAntwort ausblenden
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Frage 4 von 10
Antwort zeigenAntwort ausblenden
Frage 5 von 10
badge_number vorhanden und eindeutig ist. Abteilungen wiederholen sich. Warum ist (badge_number, department) ein Superschlüssel, aber kein Schlüsselkandidat?Antwort zeigenAntwort ausblenden
badge_number übrig; das Paar ist also nicht minimal. Wiederholte Abteilungen heben die Eindeutigkeit des Paars nicht auf; die unnötige Spalte verhindert, dass es ein Kandidat ist.Frage 6 von 10
Antwort zeigenAntwort ausblenden
0047 als auch 47-A als Etiketten. Eine Ganzzahl verliert die führenden Nullen und kann Buchstaben und Bindestrich nicht darstellen. Wähle einen Typ nach dem Zweck des Werts.Frage 7 von 10
WHERE region <> 'NE'?Antwort zeigenAntwort ausblenden
Frage 8 von 10
event_id auf Events, der nicht NULL sein darf. Die Veranstaltungen 12 und 19 existieren. Zwei Tickets verweisen bereits auf Veranstaltung 12. Was passiert mit einem dritten Ticket, das auf Veranstaltung 12 verweist?Antwort zeigenAntwort ausblenden
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Frage 10 von 10
quantity INTEGER CHECK (quantity > 0) und status TEXT DEFAULT 'new'. Keine der beiden Spalten hat NOT NULL. Eine neue Zeile liefert für quantity NULL und lässt status weg. Was wird gespeichert?Antwort zeigenAntwort ausblenden
Set 2: Regeln in einer kleinen Datenbank anwenden10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
open_jobs und einen Index auf jobs.job_id. Welche Rolle haben die beiden jeweils?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
VARCHAR(4). Eine Zeile liefert den Text „Winter“. Was macht SQLite?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
account_id 14. Accounts enthält das Konto 14 in Phoenix und das Konto 620 in Tulsa. Die account_id der Bestellung verweist auf Accounts.account_id. Wo befindet sich das Konto von Bestellung 620?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 3: Typen wählen und verknüpften Datensätzen folgen10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
delay_days und den Status 'urgent'. Welches Ergebnis hat (delay_days > 2) OR (status = 'urgent'), und behält WHERE die Zeile?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
tracking_note als neue Spalte für jede Lieferung. Welche Eigenschaft ändert sich direkt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
member_id als Primärschlüssel. Die E-Mail-Adresse muss vorhanden sein und darf höchstens ein Konto identifizieren. Welche zusätzliche Deklaration setzt in PostgreSQL beide E-Mail-Regeln durch?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Profiles.user_id ist zugleich Primärschlüssel dieser Tabelle und Fremdschlüssel auf Users.user_id. Keine Regel verlangt, dass ein Nutzer ein Profil hat. Was erlaubt das?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
warehouse_id, item_id) mit den Zeilen (4, 7) und (5, 9). Reservations hat einen verpflichtenden, durchgesetzten zusammengesetzten Fremdschlüssel auf StockRows. Ist eine Reservierung für (4, 9) erlaubt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 4: Integritätsbedingungen lesen und Folgen erklären10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
order_id, product_id), und beide Teile sind Fremdschlüssel. Was zeigt das zwischen Bestellungen und Produkten?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
person_id als auch locker_id sind Pflichtangaben und jeweils für sich eindeutig. Der Primärschlüssel ist person_id. Wie ist locker_id einzuordnen?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
DECIMAL(8, 2). Welche zusätzliche Information braucht man, um einen gespeicherten Preis von 45,00 als realen Betrag zu deuten?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
DECIMAL(6, 2) und label als VARCHAR(3). Die Zeilen liefern den Betrag 1.234.567,89 und das Label „Sommer“. Was setzen diese Deklarationen allein durch?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 5: Fehlende Daten und zusammenhängende Integritätsbedingungen klären10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
batch_id, page_no). Das Paar (18, 4) existiert. Stapel- und Seitennummern dürfen sich einzeln wiederholen. Welche geplante Zeile wird gerade deshalb abgewiesen, weil sie diesen Schlüssel wiederholt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Orders.customer_id ein Fremdschlüssel auf Customers, der nicht NULL sein darf und keine Eindeutigkeitsregel hat. Kunden dürfen keine Bestellungen haben. Wird Orders.customer_id um UNIQUE ergänzt, bleiben die übrigen Regeln unverändert. Wie ändert sich die Beziehung?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
WHERE NOT (city = 'Miami') OR city IS NULL?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
a INTEGER NOT NULL, b INTEGER NOT NULL, PRIMARY KEY (a, b) und q INTEGER NOT NULL CHECK (q > 0). Es gibt noch keine Zeilen. Welche geplante Zeile erfüllt alle diese Integritätsbedingungen?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
project_id mit ON DELETE SET NULL. Notiz 4 verweist über einen durchgesetzten Fremdschlüssel mit ON DELETE CASCADE auf Aufgabe 7. Nach dem Löschen von Projekt 31 wird Aufgabe 7 gelöscht. Was bleibt von Aufgabe 9 und Notiz 4?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe
Schlüsselbegriffe
A
Alternativschlüssel
account_id ein Alternativschlüssel bleiben.analytische Verarbeitung (OLAP)
atomarer Wert
B
Bestellposition
boolescher Datentyp
in_stock hält fest, ob ein Artikel verfügbar ist; die genaue Speicherform hängt vom DBMS ab.C
CHECK-Bedingung
NOT NULL zusammen mit CHECK (quantity > 0), um beide Regeln abzudecken.Client-Server-System
D
Daten
Datenbank
Datenbankausprägung
Datenbankmanagementsystem (DBMS)
Datenbankschema
Datendefinitionssprache (DDL)
Datenkatalog (Data Dictionary)
shipped_date mit NULL „nicht versandt“ bedeutet oder ein verloren gegangenes Datum.Datenmanipulationssprache (DML)
Datenunabhängigkeit
Dezimalstellenanzahl (Scale)
DECIMAL(p, s) ist s, die Anzahl der Ziffern nach dem Komma; sie bestimmt die Genauigkeit des Nachkommateils.Domäne
dreiwertige Logik
E
eingebettete Datenbank-Engine
Eins-zu-eins-Beziehung
user_id zugleich als Primärschlüssel und als Fremdschlüssel verwenden und verhindert so ein zweites Profil für einen Nutzer.Eins-zu-viele-Beziehung
Eltern- und Kindtabellen
Entity-Relationship-Diagramm
exakter Dezimaltyp
DECIMAL(8, 2) deklarierter Preis speichert exakte Beträge in Dollar und Cent innerhalb seines Bereichs.F
Fremdschlüssel
customer_id 1 enthalten; jede verweist auf denselben eindeutigen Kundendatensatz.G
ganzzahlige Centbeträge
Ganzzahltyp
Genauigkeit (Precision)
DECIMAL(p, s) ist p, die Gesamtzahl der Ziffern, die für den ganzzahligen Teil und den Nachkommateil eines Werts zur Verfügung stehen.DECIMAL(8, 2) lassen insgesamt acht Ziffern Platz für sechs vor dem Komma und zwei danach.generierte ID
INTEGER PRIMARY KEY in SQLite liefert eine Ganzzahl, wenn eine neue Zeile die Kennung weglässt.Gleitkommatyp
Grad
I
Index
Integritätsbedingung (Constraint)
IS NULL
IS NULL ist der SQL-Test, der wahr liefert, wenn ein Eintrag fehlt; so lassen sich solche Zeilen ohne Gleichheitsvergleich finden.phone IS NULL findet Kunden, deren Telefonnummer nicht erfasst ist.ISO-Datumsformat
2026-03-02.J
Join
orders.customer_id mit customers.customer_id ab, um zur richtigen Stadt zu gelangen.K
Kardinalität einer Beziehung
Kardinalität einer Tabelle
Kaskadierung (CASCADE)
Krähenfußnotation
N
natürlicher Schlüssel
state_code als gut lesbaren Primärschlüssel in Adressdatensätzen verwenden.NOT NULL
NOT NULL ist eine Integritätsbedingung, die verlangt, dass ein Spalteneintrag vorhanden ist; sie weist NULL zurück, prüft aber selbst weder auf positive Werte noch auf nicht leeren Text.NULL
numerischer Code
02108 muss als Text gespeichert werden, damit die führende Null beim Zurücklesen erhalten bleibt.O
optionale Beziehung
coupon_id NULL lassen, während andere Bestellungen auf existierende Gutscheine verweisen.P
Positionsbetrag
Primärschlüssel
customer_id als Primärschlüssel, damit Bestellungen auf genau einen Kunden verweisen können.R
referenzielle Aktion
ON DELETE SET NULL behält die Kindzeilen, entfernt aber ihren Verweis auf die Elternzeile; dieser Verweis muss daher NULL zulassen.referenzielle Integrität
relationale Datenbank
S
Schemadiagramm
orders.customer_id mit dem Kundenschlüssel und macht den Verweis von Bestellungen auf Kunden sichtbar.Schlüsselkandidat
employee_id zum Primärschlüssel wird.Schlüsselpfad
customer_id zu einer Kundenzeile und liest dort die Stadt ab.selbstreferenzierende Beziehung
manager_id eines Mitarbeiters zeigt auf eine andere Mitarbeiterzeile; bei einer Person ohne Führungskraft ist sie NULL.Sicht (View)
Spalte (Attribut oder Feld)
city enthält für jeden Kundendatensatz einen Stadtwert oder, sofern erlaubt, NULL.SQL
SQL-Dialekt
LIMIT 10, um ein Ergebnis zu begrenzen, während SQL Server meist TOP 10 verwendet.Standardwert
DEFAULT 'pending' erfasst pending, wenn die neue Zeile keinen Status angibt.strukturierte Daten
Superschlüssel
employee_id eindeutig, identifiziert das Paar aus dieser Spalte und der Abteilung den Mitarbeiter weiterhin, enthält aber eine zusätzliche Spalte.Surrogatschlüssel
customer_id bleibt gleich, wenn der Kunde seine E-Mail-Adresse, Telefonnummer oder seinen Nachnamen ändert.T
Tabelle (Relation)
Transaktion
transaktionsorientierte Verarbeitung (OLTP)
Typaffinität
abc als Text behalten, wenn die Umwandlung in eine Ganzzahl scheitert.U
UNKNOWN
state <> 'TX' ist für einen Kunden mit NULL als Bundesstaat UNKNOWN, daher lässt WHERE diese Zeile weg.UUID
V
verwaiste Zeile
Viele-zu-viele-Beziehung
W
Währungscode
Z
Zeichenkettentyp
MUG-11-BLU gehört in einen Texttyp, weil sie ein Etikett ist und keine Stückzahl.Zeile (Tupel oder Datensatz)
zusammengesetzter Schlüssel
Zwischentabelle
order_items verknüpft eine Bestellung mit einem Produkt und hält Stückzahl und verlangten Stückpreis fest.- 1Relationale Datenbanken
- 2Abfragen mit SELECT
- 3Berechnete Spalten in SQL
- 4SQL-Aggregation
- 5SQL-Joins
- 6Datenbanktabellen erstellen und ändern
Über diese Einheit
Erstelle deine eigenen Lernmaterialien
Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.