0Pricing
SQL Interview Prep · Lektion

BETWEEN, IN und inklusive Grenzen

Grenzfälle verstehen und erfahren, wie BETWEEN die Endpunkte behandelt

BETWEEN, IN und inklusive Grenzen ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Warum Grenzwerte Bewerber Punkte kosten

Bereichs- und Mengenfilter wirken trivial, deshalb nehmen Interviewer die Randfälle besonders gern aufs Korn. BETWEEN schließt beide Grenzwerte ein, IN verbirgt eine subtile NULL-Falle, und bei Datumsbereichen führen Fehler um einen Tag unbemerkt zu verfälschten Berichten.

In dieser Lektion erfahren Sie genau, wie BETWEEN seine Grenzwerte behandelt, wann IN sauberer ist als verkettete OR-Ausdrücke und welches halboffene Bereichsmuster Profis für Datumswerte verwenden.

BETWEEN ist an beiden Enden inklusiv

col BETWEEN a AND b ist eine Kurzform für col >= a AND col <= b. Beide Grenzwerte sind eingeschlossen.

price BETWEEN 10 AND 20 liefert also auch Zeilen zurück, deren Preis genau 10 oder genau 20 beträgt, sowie alle Werte dazwischen. Die häufigste falsche Antwort im Vorstellungsgespräch lautet, dass der obere Grenzwert ausgeschlossen sei.

SELECT *
FROM products
WHERE price BETWEEN 10 AND 20;
-- equivalent to: price >= 10 AND price <= 20

Die Reihenfolge der Argumente ist wichtig

BETWEEN erwartet zuerst den unteren Wert. col BETWEEN 20 AND 10 wird zu col >= 20 AND col <= 10 erweitert. Das kann niemals wahr sein und liefert daher keine Zeilen statt eines Fehlers.

Das ist eine beliebte Falle: Die Abfrage läuft problemlos, liefert nichts zurück, und der Bewerber nimmt an, die Daten seien leer. Setzen Sie den kleineren Grenzwert immer an die erste Stelle.

SELECT *
FROM products
WHERE price BETWEEN 20 AND 10;
-- returns NOTHING, not an error

Der Off-by-one-Fehler bei Datumsbereichen

Wenn Sie nach dem gesamten Januar fragen, schreiben viele Bewerber order_date BETWEEN '2024-01-01' AND '2024-01-31'. Wenn order_date ein Zeitstempel ist, gehen dabei alle Werte nach Mitternacht am 31. verloren, weil 2024-01-31 2024-01-31 00:00:00 bedeutet.

Eine Bestellung am 31. Januar um 14 Uhr wird ausgeschlossen. Bei reinen DATE-Spalten funktioniert das, aber Sie dürfen den Typ nicht voraussetzen.

SELECT *
FROM orders
WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';
-- silently excludes Jan 31 afternoon if order_date is a timestamp

Die Lösung mit dem halboffenen Bereich

Das professionelle Muster für Datumswerte ist ein halboffenes Intervall: größer oder gleich dem Anfang und strikt kleiner als der nächste Zeitraum. Es ist sowohl für DATE als auch für TIMESTAMP korrekt und setzt keine Kenntnis der zeitlichen Auflösung der Spalte voraus.

Beachten Sie, dass der obere Grenzwert der erste Tag im Februar ist, nicht der letzte Tag im Januar. So wird jeder Zeitpunkt im Januar erfasst.

SELECT *
FROM orders
WHERE order_date >= '2024-01-01'
  AND order_date <  '2024-02-01';

NOT BETWEEN

col NOT BETWEEN a AND b wird zu col < a OR col > b erweitert. Beide Grenzwerte und alle Werte dazwischen werden ausgeschlossen.

Achtung: Wenn col NULL ist, wird NOT BETWEEN zu UNKNOWN ausgewertet. NULL-Zeilen werden daher genauso wie bei einem einfachen BETWEEN ausgeschlossen. NULL-Werte erfüllen einen Bereichstest in keiner der beiden Richtungen.

SELECT *
FROM products
WHERE price NOT BETWEEN 10 AND 20;
-- price < 10 OR price > 20

IN als Zugehörigkeit zu einer Menge

col IN (a, b, c) ist eine Kurzform für col = a OR col = b OR col = c. Damit testen Sie sauber, ob ein Wert zu einer kleinen, festgelegten Menge gehört.

Das ist besser lesbar als eine Kette von OR-Ausdrücken und vermeidet das Problem mit der Klammerung aufgrund der Operatorrangfolge vollständig, da der gesamte Mengentest ein einziges Prädikat ist.

SELECT *
FROM orders
WHERE status IN ('pending', 'shipped', 'delivered');

Die NULL-Falle bei NOT IN

Dies ist die gefürchtetste IN-Frage. Wenn die Liste oder Unterabfrage hinter NOT IN auch nur ein einziges NULL enthält, kann das gesamte Prädikat zu UNKNOWN ausgewertet werden und keine Zeilen zurückgeben.

Der Grund: x NOT IN (1, NULL) wird zu x <> 1 AND x <> NULL, und x <> NULL ist niemals wahr, sondern UNKNOWN. Das gesamte AND kann daher niemals wahr sein.

SELECT *
FROM employees
WHERE manager_id NOT IN (SELECT id FROM managers);
-- returns NOTHING if any managers.id is NULL

NOT IN korrigieren

Es gibt zwei robuste Lösungen für die NOT IN-NULL-Falle:

  • Filtern Sie NULL-Werte mit WHERE id IS NOT NULL aus der Unterabfrage heraus
  • Noch besser: Schreiben Sie die Abfrage in NOT EXISTS um, das NULL-Werte konstruktionsbedingt korrekt behandelt

Interviewer betrachten NOT EXISTS als die Antwort auf Senior-Niveau, weil es die Falle vollständig umgeht und häufig auch einen besseren Ausführungsplan ermöglicht.

SELECT e.*
FROM employees e
WHERE NOT EXISTS (
  SELECT 1 FROM managers m WHERE m.id = e.manager_id
);

IN mit einer Unterabfrage

IN akzeptiert eine Unterabfrage, die eine Spalte zurückgibt. WHERE customer_id IN (SELECT customer_id FROM vip) behält die Zeilen bei, deren Kunde zur VIP-Menge gehört.

Ein einfaches IN (kein NOT IN) ist bei NULL-Werten in der Unterabfrage sicher: Ein NULL-Wert in der Liste findet einfach keine Übereinstimmung, beeinträchtigt aber nicht die Zeilen, die tatsächlich übereinstimmen. Die Falle betrifft ausschließlich NOT IN.

SELECT *
FROM orders
WHERE customer_id IN (SELECT customer_id FROM vip_customers);

Mehrspaltiges IN mit Row-Constructors

Eine häufige Nachfrage: Wie können Sie nach mehr als einer Spalte gleichzeitig abgleichen? Übergeben Sie ein Tupel an IN, indem Sie einen Row-Constructor verwenden – dadurch werden die Spalten positionsbezogen verglichen, und die Lösung ist wesentlich übersichtlicher als eine Verkettung von OR (a = .. AND b = ..).

  • Die Schreibweise ist übersichtlich und lässt sich auf lange Auswahllisten erweitern.
  • Jedes Tupel muss die Spalten in derselben Reihenfolge aufführen.
SELECT *
FROM orders
WHERE (customer_id, status) IN ((101, 'paid'), (102, 'shipped'));

Kurzer Check

Rufen Sie sich ins Gedächtnis, wie BETWEEN seine Grenzwerte behandelt.

Zusammenfassung

Die wichtigsten Punkte:

  • BETWEEN a AND b schließt beide Grenzwerte ein; der untere Grenzwert muss zuerst kommen, sonst erhalten Sie keine Zeilen
  • Verwenden Sie für Zeitstempelbereiche ein halboffenes Intervall: >= start AND < next_period
  • IN prüft die Zugehörigkeit zu einer Menge sauber und ist sicher bei NULL-Werten
  • NOT IN liefert nichts zurück, sobald die Liste ein NULL enthält; schreiben Sie die Abfrage stattdessen als NOT EXISTS

Das wiederkehrende Muster: Ein Filter kann problemlos ausgeführt werden und dennoch unbemerkt die falschen Zeilen zurückgeben.

Häufig gestellte Fragen

Ist die Lektion „BETWEEN, IN und inklusive Grenzen“ kostenlos?

Ja — der vollständige Text von „BETWEEN, IN und inklusive Grenzen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „BETWEEN, IN und inklusive Grenzen“?

Grenzfälle verstehen und erfahren, wie BETWEEN die Endpunkte behandelt Du übst SQL Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um SQL Interview Prep zu starten?

Keine Vorkenntnisse erforderlich. SQL Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „BETWEEN, IN und inklusive Grenzen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser SQL Interview Prep-Lektion Code schreiben und ausführen?

Ja. Jede SQL Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. AND/OR-Rangfolge und Klammerung
  2. BETWEEN, IN und inklusive Grenzen
  3. LIKE, Platzhalter und Escaping
  4. Nach berechneten Werten filtern
← Zurück zu SQL Interview Prep