Kartesisches Produkt vermeiden - 2 Tabellen mit SQL abfragen (JOIN)

Animierte Gifs

Die animierten Gifs sind für frontale Erläuterungen nicht so gut geeignet - sie sind zu schnell. Für Eigenarbeit sind sie aber gut. Man friere einfach das Bild, das man braucht, beim Erklären ein (Sie verwenden doch hoffentlich auch ZoomIt - die mit Abstand beste Bildschirmlupe für den Informatikunterricht. Ohne die kann man keinen guten Informatikunterricht machen. Ehrlich.

Kowalsky! Die Chefin macht mich fertig, wenn ich ihr nicht bald ein Ergebnis liefere! Wonach hat diese Anna Bader denn jetzt gegoogelt?

Du müsstest eigentlich sehen, dass die Daten, die wir brauchen, auf zwei Tabellen verteilt sind. Du kennst ja ihre Personalausweisnummer, also ihren Primärschlüssel.🔑 Diesen Primärschlüssel suchst du jetzt bei den Fremdschlüsseln in der Suchanfragen-Tabelle. Du kannst dir das so vorstellen:

Und genau das sagen wir jetzt auch so in der Abfrage: Zeig mir die Google-Suchbegriffe von Anna Bader, wobei einige Infos aus der einen Tabelle kommen, andere aus der anderen Tabelle. Ich schreib dir das mal auf:

Abfragen mit mehreren Tabellen

Wir wollen die beiden Tabellen googleSuchanfragen und personen abfragen und uns vorname, nachname (aus der Tabelle Personen) und suchbegriff (aus der Tabelle googleSuchanfragen) ausgeben lassen.

Wir könnten es ja mal so probieren:

falsch!

select p.vorname, p.nachname, g.suchbegriff
from personen p, googleSuchanfragen g
where p.vorname = 'Anna'
and p.nachname = 'Bader';

Diese Abfrage ergibt ungefähr 130.000 Datensätze. Es werden nämlich ALLE (!) Suchanfragen angezeigt und mit ALLEN Personen (in diesem Fall nur Anna Bader) kombiniert. Das ist natürlich Quatsch. Probier den Befehl einfach mal aus - du wirst genau so viel Ergebnisse erhalten, wie du Suchanfragen hast.

Deshalb MUSST du immer noch sagen, dass nur die Datensätze angezeigt werden, wo der Fremdschlüssel und der Primärschlüssel gleich sind:

select p.vorname, p.nachname, g.suchbegriff
from personen p, googleSuchanfragen g
where p.pnr = g.fk_pnr
and p.vorname = 'Anna'
and p.nachname = 'Bader';

Diese Abfrage ergibt mehr als 6.000 Datensätze - probiere es aus! Denn es werden nur alle Suchanfragen gezeigt, die auch eine Entsprechung zum Primärschlüssel von Anna Bader haben (»wo g.fk_pnr = p.pnr«).

Bei mehr als zwei Tabellen hast du entsprechend mehr PK-FK-Einschränkungen, aber das brauchst du jetzt für die Suchanfragen nicht.

Nochmal im Video erklären, bitte

Das MUSST du kapieren, Smith - du wirst noch viel mehr Tabellen gleichzeitig abfragen müssen, wenn dir dein Job lieb ist. Also was wollte Rousseau gleich noch …

ACHTUNG, NOTIZ AN MICH: Rousseau will nur pNr, vorname, nachname und suchbegriff. Also nicht den Stern, sonst motzt sie wieder.

  1. Eine Liste aller Suchanfragen von Anna Bader.
  2. Alle Suchanfragen von Anna Bader, die im Januar 2033 getätigt wurden.
  3. Alle Suchanfragen von Anna Bader, die das Wort "hacken" beinhalten.
  4. Alle Suchanfragen von Anna Bader, die das Wort "sprengstoff" oder "explodiert" beinhalten.
  5. Alle Suchanfragen von Djako Daskalov.
  6. Alle Suchanfragen von Djako Daskalov, aber diesmal nur suchbegriff und zeitpunkt
  7. In Maulwurfstadt wohnen ja 6 oder 7 Leute mit dem Nachnamen Lanzilotti. Wohnen die tatsächlich im gleichen Ort? Lasse ich mir mal ausgeben: Nachname, Vorname, Ort-Name.

Damit wird sie zufrieden sein. Erst mal ein Päuschen …wobei … Vielleicht sollte ich mal schauen, was dieser seltsame Daskalov so im Internet treibt?