SQL BETWEEN: inklusive Zahlen- und Datumsbereiche

SQL BETWEEN filtert Zeilen, deren Spaltenwert in einem angegebenen Bereich liegt, einschließlich beider Grenzen. Es ersetzt ein Paar aus >= und <= durch ein einzelnes Prädikat und hält WHERE-Klauseln bei inklusiven Bereichen kompakt. BETWEEN funktioniert mit Zahlen, Datumswerten und Text, bei Datumsbereichen ist wegen Zeitanteilen aber besondere Sorgfalt nötig.

SQL BETWEEN Beispiel zum Filtern von Bereichen

Ausgabe:

Die Ausgabe erscheint hier...

Ausgabe:

+-------+--------+-------------+
| kunde | betrag | bestellt_am |
+-------+--------+-------------+
| Ben   | 120.5  | 2026-02-15  |
| Carla | 89.99  | 2026-02-20  |
+-------+--------+-------------+
2 row(s)

So funktioniert dieses Beispiel

  1. CREATE TABLE und INSERT richten eine Tabelle bestellungen mit vier Zeilen ein, verteilt über unterschiedliche Beträge und Daten.
  2. WHERE betrag BETWEEN 50 AND 150 behält nur Zeilen, bei denen betrag >= 50 AND betrag <= 150 gilt. Beide Grenzen sind eingeschlossen, daher würde auch ein Wert von genau 50 oder 150 passen.
  3. Zeilen mit Beträgen von 45.00 und 200.00 liegen außerhalb des Bereichs und werden ausgeschlossen.

x BETWEEN y AND z ist äquivalent zu x >= y AND x <= z. Ist eine der Grenzen NULL, ergibt das Prädikat den Wert unbekannt und die Zeile wird herausgefiltert.

Was ist SQL BETWEEN?

SQL BETWEEN prüft, ob ein Wert in einem inklusiven Bereich liegt: column >= low AND column <= high. Für numerische Bereiche ist das gut lesbar und verhält sich zuverlässig. Manche Datenbanken unterstützen zusätzlich BETWEEN SYMMETRIC, das die Grenzen vertauscht, wenn sie in umgekehrter Reihenfolge angegeben sind.

Häufige Fehler mit SQL BETWEEN

Fehler: BETWEEN für Timestamp-Bereiche verwenden.

Falsch:

WHERE bestellt_am BETWEEN '2026-02-01' AND '2026-02-28'

Richtig:

WHERE bestellt_am >= '2026-02-01' AND bestellt_am < '2026-03-01'

Warum: Wenn die Spalte eine Uhrzeit enthält, trifft ein Enddatum wie '2026-02-28' meist nur den Tagesanfang. Verwende ein halboffenes Intervall, um den ganzen Tag abzudecken.

Fehler: Grenzen vertauschen und Ergebnisse erwarten.

Falsch:

WHERE betrag BETWEEN 150 AND 50

Richtig:

WHERE betrag BETWEEN 50 AND 150

Warum: Bei normalem BETWEEN muss die erste Grenze der kleinere Wert sein. Sind die Grenzen vertauscht, kann die Bedingung nicht wahr sein.

BETWEEN vs IN vs Vergleichsoperatoren

AnsatzVerwenden, wenn …
BETWEEN low AND highDer Bereich kontinuierlich ist und beide Grenzen eingeschlossen sein sollen
>= low AND < highEine exklusive obere Grenze nötig ist (Timestamps, Pagination)
IN (a, b, c)Werte diskret sind und keinen kontinuierlichen Bereich bilden
> low AND < highBeide Grenzen exklusiv sein müssen

Regel: Verwende BETWEEN für inklusive numerische Bereiche. Wechsle zu expliziten Vergleichen, wenn eine Grenze exklusiv sein muss, besonders bei Datumswerten. Verwende IN für eine feste Wertemenge; BETWEEN würde sonst auch unerwünschte Zwischenwerte erfassen.

Hinweise zur Performance

BETWEEN ist sargable: Der Query-Planer behandelt es wie >= AND <= und kann einen B-Tree-Index auf der gefilterten Spalte nutzen. Wird die Spalte in eine Funktion gepackt (DATE(col), LOWER(col)), verhindert das die Indexnutzung; normalisiere stattdessen die Grenzen. Sehr breite Bereiche scannen trotz Index viele Zeilen, daher ist Selektivität wichtiger als die Operatorwahl.

FAQ

Ist SQL BETWEEN inklusiv oder exklusiv?

BETWEEN ist an beiden Enden inklusiv. WHERE x BETWEEN 5 AND 10 liefert Zeilen, in denen x 5, 6, 7, 8, 9 oder 10 ist. Eine eingebaute exklusive Variante gibt es nicht; nutze > und < für exklusive Grenzen.

Kann BETWEEN mit Textwerten verwendet werden?

Ja. WHERE name BETWEEN 'A' AND 'M' liefert Namen, die unter der aktuellen Sortierung in diesem Bereich liegen. Die Ergebnisse hängen von den Kollationsregeln und der Groß-/Kleinschreibung der Datenbank ab. Teste Textbereiche mit deiner konkreten Konfiguration, bevor du dich in Produktion darauf verlässt.

Warum übersieht BETWEEN Datensätze am Enddatum?

Wenn die Spalte ein Datetime speichert (Datum + Uhrzeit), wird eine obere Grenze wie '2026-02-28' oft als Tagesanfang interpretiert. Jede Zeile später am 28. Februar liegt dann außerhalb des Bereichs. Nutze ein halboffenes Intervall (>= start AND < next_day), um den gesamten Tag abzudecken.