Die 12 häufigsten Fehler
1Attribut mit Attributwert verwechselt
| Farbe |
|---|
| rot |
| blau |
So wird oft gearbeitet: „Das Attribut der Zeile R2 ist rot.“
Richtig ist: Farbe ist das Attribut (Spalte), rot ist der Attributwert in der Zeile R2.
Spalte = Attribut, Zelle = Attributwert.
2„Heute eindeutig“ als Schlüssel
| Nachname | Geburtsdatum |
|---|---|
| Weber | 12.03.2008 |
| Schmidt | 05.11.2007 |
So wird oft gearbeitet: Nachname + Geburtsdatum als Primärschlüssel, weil in den Daten nichts doppelt ist.
Richtig ist: Ein Primärschlüssel muss für alle künftigen Datensätze eindeutig sein — Namen und Geburtstage können sich wiederholen.
Grundsätzlich eindeutig, nie NULL, unveränderlich — sonst künstliche Nummer.
3Fremdschlüssel soll eindeutig sein
| SchuelerNr | ↑LehrerNr |
|---|---|
| S1 | L1 |
| S2 | L1 |
So wird oft gearbeitet: „L1 kommt zweimal vor — das verletzt den Fremdschlüssel.“
Richtig ist: Fremdschlüsselwerte dürfen sich wiederholen: Viele Schüler haben denselben Lehrer. Eindeutig ist L1 nur in der Tabelle Lehrer.
Verweise dürfen mehrfach zeigen — nur nicht ins Leere.
4Mehrere Werte in einer Zelle
| Name | Telefon |
|---|---|
| Kaya | 0511 12, 0172 34 |
So wird oft gearbeitet: Zwei Telefonnummern durch Komma getrennt in einer Zelle.
Richtig ist: Jede Zelle ist atomar. Mehrere Nummern gehören in eine eigene Tabelle Telefon(↑PersonNr, Nummer).
Eine Zelle, ein Wert.
5Text ohne Hochkommas
WHERE Genre = Rennen;
So wird oft gearbeitet: WHERE Genre = Rennen
Richtig ist: WHERE Genre = 'Rennen' — ohne Hochkommas sucht SQL eine Spalte „Rennen“.
Texte in einfache Hochkommas, Zahlen ohne.
6= NULL statt IS NULL
WHERE FSK = NULL;
So wird oft gearbeitet: WHERE FSK = NULL soll Filme ohne Altersangabe finden.
Richtig ist: Vergleiche mit NULL sind nie wahr; richtig ist WHERE FSK IS NULL.
Fehlende Werte nur mit IS NULL bzw. IS NOT NULL prüfen.
7AND und OR ohne Klammern
WHERE Klasse = '10a' OR Klasse = '10b'
AND Punkte >= 60;
So wird oft gearbeitet: Gemeint: „10a oder 10b, jeweils mit mindestens 60 Punkten“.
Richtig ist: AND bindet stärker: So gilt die Punktgrenze nur für 10b. Richtig: (Klasse = '10a' OR Klasse = '10b') AND Punkte >= 60.
Bei gemischtem AND/OR immer Klammern setzen.
8Verbundbedingung vergessen
SELECT Kunde.Name, Bestellung.Datum
FROM Kunde, Bestellung;
So wird oft gearbeitet: Das Ergebnis ist „erstaunlich lang“ — jede Kundin hat jede Bestellung.
Richtig ist: Ohne WHERE Kunde.KNr = Bestellung.KNr entsteht das Kreuzprodukt mit m · n Zeilen.
Je zwei verbundene Tabellen eine Verbundbedingung.
9Verbindungstabelle weggelassen
FROM Leser, Buch
WHERE Leser.LeserNr = Buch.BuchNr
So wird oft gearbeitet: Leser und Buch direkt über ihre Nummern verbunden.
Richtig ist: LeserNr und BuchNr bedeuten Verschiedenes. Der Weg führt über Ausleihe: zwei Verbundbedingungen.
Dem ↑-Pfeil im Schema folgen — nie zwei fremde Schlüssel vergleichen.
10Aggregat in WHERE
WHERE COUNT(*) > 2
GROUP BY Genre;
So wird oft gearbeitet: WHERE COUNT(*) > 2
Richtig ist: WHERE wirkt vor dem Gruppieren und kennt keine Anzahlen. Bedingungen an Aggregate gehören in HAVING.
Zeilen filtert WHERE, Gruppen filtert HAVING.
11Fremde Spalte im gruppierten SELECT
SELECT Name, AVG(Runden)
FROM Lauf
GROUP BY Klasse;
So wird oft gearbeitet: SELECT Name, AVG(Runden) … GROUP BY Klasse
Richtig ist: Pro Klasse gibt es eine Ergebniszeile — welcher Name sollte dort stehen? Im SELECT nur Gruppierungsattribute und Aggregate.
SELECT-Regel bei GROUP BY beachten.
12Pseudonym für anonym gehalten
| Code | Note |
|---|---|
| S-0417 | 2 |
| S-0418 | 4 |
So wird oft gearbeitet: „Die Namen sind durch Codes ersetzt, also gilt die DSGVO nicht mehr.“
Richtig ist: Solange die Zuordnungsliste existiert, sind die Daten pseudonym und personenbezogen — die DSGVO gilt weiter.
Anonym ist nur, was sich niemandem mehr zuordnen lässt.
