Lernvideo · 7:48 Minuten · Informatik, Ausbildung in IT-Berufen
Fünf Kunden, sechs Bestellungen, zwei Tabellen: Im Pizzadienst will die Chefin wissen, wer in Köln wohnt, wer aus Köln für mehr als 20 Euro bestellt hat und wer noch nie bestellt hat. Mit SELECT, WHERE und JOIN beantwortest du alle drei Fragen: 3 Kunden aus Köln, 2 Bestellungen über 20 Euro, und Emil hat noch nie bestellt. Dazu lernst du Primär- und Fremdschlüssel, das Kreuzprodukt ohne Verknüpfung, AND vor OR, LEFT JOIN und IS NULL. SQL gehört zu den Themen von Teil 2 der IHK-Abschlussprüfung in den IT-Berufen.
Auf YouTube ansehenNachhilfe in Informatik finden
Die Regeln im Video gelten in fast jeder relationalen Datenbank. Einzelheiten der Schreibweise können je nach System abweichen: In PostgreSQL und SQL Server ist zum Beispiel ein JOIN ohne ON ein Syntaxfehler. Alle Abfragen auf dieser Seite wurden mit den Beispieldaten tatsächlich ausgeführt.
Auf der Übungsseite schreibst du die Abfragen selbst und siehst sofort, ob sie stimmen. Dazu gibt es ein Übungsblatt als PDF.
Beispiele aus dem Pizzadienst. Die Regeln gelten in fast jeder relationalen Datenbank.
| KundeNr | Name | Ort |
|---|---|---|
| 1 | Ada | Köln |
| 2 | Ben | Bonn |
| 3 | Cem | Köln |
| 4 | Dana | Essen |
| 5 | Emil | Köln |
| BestellNr | KundeNr | Betrag |
|---|---|---|
| 101 | 1 | 18,50 € |
| 102 | 3 | 32,00 € |
| 103 | 1 | 24,00 € |
| 104 | 2 | 12,90 € |
| 105 | 4 | 41,00 € |
| 106 | 3 | 9,50 € |
Bestellung.KundeNr zeigt auf Kunde.KundeNr: KundeNr ist in Kunde der Primärschlüssel und in Bestellung der Fremdschlüssel. Die Namen sind erfunden.
Falle 1: Text ohne Anführungszeichen. WHERE Ort = Köln liest die Datenbank als Spaltennamen und meldet einen Fehler. Richtig: 'Köln'.
Falle 2: AND und OR ohne Klammern. AND bindet stärker. Ort = 'Köln' OR Ort = 'Bonn' AND Betrag > 20 liefert im Beispiel 4 statt 2 Zeilen.
Falle 3: Keine Verknüpfungsbedingung. Komma ohne WHERE oder CROSS JOIN ergibt jede Kombination: 5 · 6 = 30 Zeilen. In PostgreSQL und SQL Server ist ein JOIN ohne ON sogar ein Syntaxfehler.
Falle 4: = NULL statt IS NULL. Der Vergleich ergibt unbekannt, es kommt keine Zeile zurück.
Falle 5: Mehrdeutige Spalte. KundeNr steht in beiden Tabellen. Ohne Kurznamen davor, also k.KundeNr oder b.KundeNr, weiß die Datenbank nicht, welche gemeint ist.
Falle 6: INNER JOIN statt LEFT JOIN. Wer auch Zeilen ohne Partner braucht, etwa Kunden ohne Bestellung, verliert sie beim INNER JOIN.
Alle Abfragen wurden mit den Beispieldaten oben tatsächlich ausgeführt. Die Ergebniszeilen sind hier der Übersicht halber sortiert.
SELECT Name, Ort FROM Kunde
Ergebnis: 5 Zeilen. Alle Kunden, aber nur die Spalten Name und Ort.
| Name | Ort |
|---|---|
| Ada | Köln |
| Ben | Bonn |
| Cem | Köln |
| Dana | Essen |
| Emil | Köln |
SELECT Name FROM Kunde WHERE Ort = 'Köln'
Ergebnis: 3 Zeilen. Ada, Cem und Emil. Köln steht in einfachen Anführungszeichen.
| Name |
|---|
| Ada |
| Cem |
| Emil |
SELECT k.Name, b.Betrag FROM Kunde k INNER JOIN Bestellung b ON k.KundeNr = b.KundeNr
Ergebnis: 6 Zeilen. Ada und Cem haben je 2 Bestellungen, Ben und Dana je 1. Emil fehlt, denn er hat nie bestellt.
| Name | Betrag |
|---|---|
| Ada | 18,50 € |
| Cem | 32,00 € |
| Ada | 24,00 € |
| Ben | 12,90 € |
| Dana | 41,00 € |
| Cem | 9,50 € |
SELECT k.Name, b.Betrag FROM Kunde k, Bestellung b
Ergebnis: 30 Zeilen. Das sind 5 Kunden mal 6 Bestellungen, jede Kombination. Gezeigt sind die ersten 6 Zeilen, alle mit Ada. Dasselbe liefert FROM Kunde CROSS JOIN Bestellung.
| Name | Betrag |
|---|---|
| Ada | 18,50 € |
| Ada | 32,00 € |
| Ada | 24,00 € |
| Ada | 12,90 € |
| Ada | 41,00 € |
| Ada | 9,50 € |
| … 24 weitere Zeilen | |
SELECT k.Name, b.Betrag FROM Kunde k JOIN Bestellung b ON k.KundeNr = b.KundeNr WHERE k.Ort = 'Köln' AND b.Betrag > 20
Ergebnis: 2 Zeilen. Cem mit 32,00 € und Ada mit 24,00 €.
| Name | Betrag |
|---|---|
| Cem | 32,00 € |
| Ada | 24,00 € |
SELECT k.Name, b.Betrag FROM Kunde k JOIN Bestellung b ON k.KundeNr = b.KundeNr WHERE k.Ort = 'Köln' OR k.Ort = 'Bonn' AND b.Betrag > 20
Ergebnis: 4 Zeilen. AND bindet stärker als OR. Die Datenbank liest: Köln mit jedem Betrag, oder Bonn mit Betrag über 20. Deshalb stehen auch 18,50 € und 9,50 € in der Liste.
| Name | Betrag |
|---|---|
| Ada | 18,50 € |
| Cem | 32,00 € |
| Ada | 24,00 € |
| Cem | 9,50 € |
SELECT k.Name, b.Betrag FROM Kunde k JOIN Bestellung b ON k.KundeNr = b.KundeNr WHERE (k.Ort = 'Köln' OR k.Ort = 'Bonn') AND b.Betrag > 20
Ergebnis: 2 Zeilen. Wieder Cem mit 32,00 € und Ada mit 24,00 €.
| Name | Betrag |
|---|---|
| Cem | 32,00 € |
| Ada | 24,00 € |
SELECT k.Name, b.BestellNr FROM Kunde k LEFT JOIN Bestellung b ON k.KundeNr = b.KundeNr
Ergebnis: 7 Zeilen. Alle Kunden bleiben erhalten. Emil hat keine Bestellung, deshalb steht bei BestellNr der Wert NULL.
| Name | BestellNr |
|---|---|
| Ada | 101 |
| Ada | 103 |
| Ben | 104 |
| Cem | 102 |
| Cem | 106 |
| Dana | 105 |
| … 1 weitere Zeilen | |
SELECT k.Name FROM Kunde k LEFT JOIN Bestellung b ON k.KundeNr = b.KundeNr WHERE b.BestellNr IS NULL
Ergebnis: 1 Zeile. Nur Emil: Er hat noch nie bestellt.
| Name |
|---|
| Emil |
SELECT k.Name FROM Kunde k LEFT JOIN Bestellung b ON k.KundeNr = b.KundeNr WHERE b.BestellNr = NULL
Ergebnis: 0 Zeilen. Der Vergleich mit = NULL ergibt nie wahr, sondern unbekannt. Emil ist da, wird aber nicht gefunden.
| Name |
|---|
| keine Zeile |
SQL gehört zu den Themen von Teil 2 der IHK-Abschlussprüfung in den IT-Berufen. Laut den Prüfungskatalogen für die IT-Berufe (2. Auflage, gilt ab 2025) wird SQL ausschließlich in Teil 2 der Abschlussprüfung thematisiert. Welche Aufgaben genau drankommen, legt die IHK fest. Das Video ist Lernstoff und keine Prüfungsprognose.
SELECT nennt die Spalten, die du sehen willst, FROM die Tabelle, WHERE filtert die Zeilen. Beispiel: SELECT Name FROM Kunde WHERE Ort = 'Köln' liefert Ada, Cem und Emil. Logisch arbeitet die Datenbank in dieser Reihenfolge: zuerst FROM (mit JOIN und ON), dann WHERE, danach SELECT.
In SQL stehen Text-Konstanten in einfachen Anführungszeichen, zum Beispiel 'Köln'. Doppelte Anführungszeichen bezeichnen Namen, etwa von Spalten. Ohne Anführungszeichen liest die Datenbank Köln als Spaltennamen und meldet einen Fehler. Zahlen stehen ohne Anführungszeichen: b.Betrag > 20.
Ein Primärschlüssel ist eine eindeutige Kennung je Zeile: Jede KundeNr gibt es in der Tabelle Kunde nur einmal. Ein Fremdschlüssel ist eine Spalte, deren Werte auf Zeilen einer anderen Tabelle verweisen: Bestellung.KundeNr zeigt auf Kunde.KundeNr. Über diese beiden Spalten verbindet der JOIN die Tabellen. Steht ein Spaltenname in beiden Tabellen, schreibst du den Kurznamen davor, zum Beispiel k.KundeNr.
Fehlt die Bedingung, die sagt, welche Zeilen zusammengehören, entsteht das Kreuzprodukt: Die Datenbank kombiniert jede Zeile der einen Tabelle mit jeder der anderen. Bei 5 Kunden und 6 Bestellungen sind das 5 · 6 = 30 Zeilen, und Ada steht plötzlich neben Bestellungen von Ben und Dana. Das passiert, wenn du zwei Tabellen mit Komma hinter FROM ohne Bedingung in WHERE aufschreibst, und bei CROSS JOIN. Ein JOIN ohne ON ist in PostgreSQL und SQL Server sogar ein Syntaxfehler. Die Bedingung hinter ON, zum Beispiel ON k.KundeNr = b.KundeNr, legt fest, was zusammengehört.
Ein INNER JOIN liefert nur Zeilenpaare, die die Bedingung erfüllen. Zeilen ohne Partner fallen weg. Ein LEFT JOIN behält alle Zeilen der linken Tabelle. Fehlt der Partner, steht in den Spalten der rechten Tabelle NULL. Im Beispiel liefert der INNER JOIN 6 Zeilen ohne Emil, der LEFT JOIN 7 Zeilen mit Emil und NULL bei der Bestellnummer.
NULL steht für einen fehlenden oder unbekannten Wert, nicht für die Zahl 0. Ein Vergleich mit = NULL ergibt nicht wahr, sondern unbekannt, und WHERE lässt nur wahre Bedingungen durch. Deshalb liefert WHERE b.BestellNr = NULL im Beispiel 0 Zeilen. Fehlende Werte prüfst du mit IS NULL oder IS NOT NULL. Mit LEFT JOIN und WHERE b.BestellNr IS NULL findest du Emil, der noch nie bestellt hat.
Weil AND stärker bindet als OR, ähnlich wie Punkt vor Strich. Die Datenbank liest die Bedingung als: Köln mit jedem Betrag, oder Bonn mit Betrag über 20. Im Beispiel kommen deshalb auch Ada mit 18,50 € und Cem mit 9,50 € vor: 4 Zeilen statt 2. Mit Klammern, (k.Ort = 'Köln' OR k.Ort = 'Bonn') AND b.Betrag > 20, bleiben Cem mit 32,00 € und Ada mit 24,00 €.
Wir vermitteln Nachhilfe in Informatik, vor Ort oder online.
Lernvideo mit erfundenen Beispieldaten. Stimme, Musik und Bilder sind KI-erzeugt. Idee, Konzept und Redaktion: Menschlich.
Fünf Kunden, sechs Aufträge, zwei Tabellen. Und die Chefin fragt: Wer hat noch nie bestellt?
Freitagnachmittag im Pizzadienst. In der Datenbank stehen fünf Kunden und sechs Bestellungen, verteilt auf zwei Tabellen. Die Chefin will drei Dinge wissen: Wer wohnt in Köln? Wer aus Köln hat für mehr als zwanzig Euro bestellt? Und wer hat noch nie bestellt?
Und jetzt? Alles von Hand abtippen? Lieber nicht. Dafür gibt es SQL, die Sprache, mit der man relationale Datenbanken abfragt. SQL gehört zu den Themen von Teil zwei der IHK-Abschlussprüfung in den IT-Berufen. Solche Abfragen zu üben, lohnt sich also.
Wir brauchen dafür drei Wörter: SELECT, WHERE und JOIN. Die Ergebnistabelle füllt sich dabei Schritt für Schritt.
Fangen wir mit der Tabelle Kunde an. Sie hat drei Spalten: Kundennummer, Name und Ort. Welche Spalten willst du sehen, und aus welcher Tabelle? Genau diese zwei Fragen beantwortet die einfachste Abfrage.
SELECT Name, Ort FROM Kunde. Nach SELECT stehen die Spalten, durch Kommas getrennt. Nach FROM steht die Tabelle. Ergebnis: alle fünf Kunden, aber nur mit Name und Ort.
Mit SELECT Sternchen bekommst du alle Spalten. Sehr bequem. Ungefähr so bequem, wie den ganzen Kühlschrank auszuräumen, weil man die Milch sucht. Ist nach Name und Ort gefragt, schreibst du auch nur Name und Ort.
Jetzt die erste Frage der Chefin: Wer wohnt in Köln? Dafür filterst du Zeilen, nicht Spalten. Das macht WHERE.
SELECT Name FROM Kunde WHERE Ort gleich Köln. Die Datenbank prüft jede Zeile: Ada, ja. Ben, nein. Cem, ja. Dana, nein. Emil, ja. Drei Treffer.
Wichtig: Köln steht in einfachen Anführungszeichen. Ohne sie hält die Datenbank Köln für den Namen einer Spalte und meldet einen Fehler. Text kommt in einfache Anführungszeichen, Zahlen nicht. Neben gleich gibt es auch größer, kleiner und ungleich.
Zweite Frage: Wer aus Köln hat für mehr als zwanzig Euro bestellt? Schau in die Tabelle Bestellung: Bestellnummer, Kundennummer, Betrag. Da steht kein Name und kein Ort. Wie findet Ada also zu ihrer Bestellung?
Über die Kundennummer. In der Tabelle Kunde ist sie der Primärschlüssel: Jede Nummer gibt es nur einmal, und sie ist immer ausgefüllt. In der Tabelle Bestellung ist sie ein Fremdschlüssel: Sie zeigt auf den Kunden, der bestellt hat. Bestellung hundertdrei gehört zu Kunde eins, also zu Ada.
Genau diese Verbindung baut JOIN. FROM Kunde k JOIN Bestellung b ON k Punkt KundeNr gleich b Punkt KundeNr. k und b sind Kurznamen für die Tabellen. Hinter ON steht die Bedingung: Welche Zeilen gehören zusammen?
Die Datenbank legt jetzt jede Bestellung neben den passenden Kunden. Ada hat zwei Bestellungen, Cem auch zwei, Ben und Dana je eine. Sechs Zeilen. Und Emil? Fehlt. Er hat nie bestellt, und ein INNER JOIN zeigt nur Paare, die zusammenpassen.
Und was passiert ohne Verknüpfung? Schreibst du die beiden Tabellen nur mit Komma hintereinander, ohne Bedingung, oder als CROSS JOIN, kombiniert die Datenbank jede Zeile mit jeder: fünf Kunden mal sechs Bestellungen, dreißig Zeilen. Ada hat dann plötzlich auch Bens und Danas Bestellungen. Die Chefin ist bestimmt begeistert. Das nennt man Kreuzprodukt. Die Bedingung hinter ON legt fest, was wirklich zusammengehört.
Noch ein Detail: KundeNr steht in beiden Tabellen. Deshalb schreibst du k Punkt oder b Punkt davor. Sonst weiß die Datenbank nicht, welche Spalte gemeint ist.
Jetzt alles zusammen. Wer aus Köln hat für mehr als zwanzig Euro bestellt? Erst verbinden, dann filtern: der JOIN mit ON, danach WHERE k Punkt Ort gleich Köln AND b Punkt Betrag größer zwanzig.
Die Datenbank arbeitet dabei nicht einfach von oben nach unten. Logisch kommt zuerst FROM mit dem JOIN, dann WHERE, und erst danach SELECT. Übrig bleiben zwei Zeilen: Cem mit zweiunddreißig Euro und Ada mit vierundzwanzig Euro.
Und wenn die Chefin sagt: Köln oder Bonn, über zwanzig Euro? Du schreibst: Ort gleich Köln OR Ort gleich Bonn AND Betrag größer zwanzig, ohne Klammern. Plötzlich stehen auch Ada mit achtzehn Euro fünfzig und Cem mit neun Euro fünfzig in der Liste. Warum?
Weil AND stärker bindet als OR, ähnlich wie Punkt vor Strich. Die Datenbank liest: Köln mit jedem Betrag, oder Bonn über zwanzig Euro. Setz Klammern um Köln oder Bonn, dann stimmt es wieder: Cem und Ada.
Dritte Frage: Wer hat noch nie bestellt? Mit dem INNER JOIN geht das nicht, denn Emil fällt dort ja gerade raus. Wie holst du ihn zurück?
Mit LEFT JOIN. Er behält alle Zeilen der linken Tabelle, hier also alle Kunden. Wo keine Bestellung passt, stehen im Ergebnis in den Spalten der rechten Tabelle NULL-Werte. NULL steht für einen fehlenden oder unbekannten Wert, nicht für null Euro.
Jetzt nur noch filtern: WHERE b Punkt BestellNr IS NULL. Die Bestellnummer ist bei einer echten Bestellung nie NULL, deshalb passt nur Emil. Aber Achtung: Ein Vergleich mit gleich NULL ergibt nicht wahr, sondern unbekannt. WHERE lässt nur wahre Bedingungen durch, also bekommst du gar keine Zeile. Fehlende Werte prüfst du mit IS NULL.
Was musst du dir für die Prüfung merken? SELECT wählt Spalten, FROM die Tabelle, WHERE filtert Zeilen. Text kommt in einfache Anführungszeichen. Beim JOIN legt ON fest, was zusammengehört; Komma oder CROSS JOIN ohne Bedingung liefern jede Kombination. AND bindet stärker als OR, also Klammern setzen. Und fehlende Werte prüfst du mit IS NULL, nie mit gleich.
Die Chefin hat ihre drei Antworten: Drei Kunden wohnen in Köln, zwei Bestellungen von Kunden aus Köln liegen über zwanzig Euro, und Emil hat noch nie bestellt. Er bekommt einen Gutschein. Mit SELECT, WHERE und JOIN beantwortest du solche Fragen in fast jeder relationalen Datenbank. Auf unserer Übungsseite schreibst du die Abfragen selbst und siehst sofort, ob sie stimmen.
Wenn du in Informatik Unterstützung möchtest: Wir finden dir Nachhilfe, vor Ort oder online.
Spalten wählen, Reihen filtern, über die Nummer verbinden. Wer nie bestellt hat, hat leere Felder: ihn findest du mit links!