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
CREATE TABLEundINSERTrichten eine Tabellebestellungenmit vier Zeilen ein, verteilt über unterschiedliche Beträge und Daten.WHERE betrag BETWEEN 50 AND 150behält nur Zeilen, bei denenbetrag >= 50 AND betrag <= 150gilt. Beide Grenzen sind eingeschlossen, daher würde auch ein Wert von genau 50 oder 150 passen.- 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
| Ansatz | Verwenden, wenn … |
|---|---|
BETWEEN low AND high | Der Bereich kontinuierlich ist und beide Grenzen eingeschlossen sein sollen |
>= low AND < high | Eine exklusive obere Grenze nötig ist (Timestamps, Pagination) |
IN (a, b, c) | Werte diskret sind und keinen kontinuierlichen Bereich bilden |
> low AND < high | Beide 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.