Wróć do: Bazy danych
średni SQLBETWEENINmatura rozszerzona z informatyki

BETWEEN i IN – skróty warunków

Operator BETWEEN jako skrót warunku na przedziale oraz IN i NOT IN jako skrót długiego ciągu warunków połączonych OR.

01

Opis

Dwa bardzo częste kształty warunku mają w SQL-u własne, krótsze zapisy. Oba da się zapisać zwykłymi operatorami porównania i operatorami logicznymi – ale wersja skrócona jest czytelniejsza i trudniej się w niej pomylić.

BETWEEN – warunek na przedziale. Zapis srednia BETWEEN 4.00 AND 5.00 znaczy dokładnie tyle samo co srednia >= 4.00 AND srednia <= 5.00. Zamiast dwóch warunków i powtórzonej nazwy kolumny jest jeden czytelny zapis.

Najważniejsza rzecz o BETWEEN: obie granice należą do przedziału. To odpowiednik >= i <=, nigdy > i <. Jeśli zadanie mówi „powyżej 2000, ale poniżej 4000" z wyłączeniem granic, BETWEEN jest złym narzędziem i trzeba wrócić do dwóch osobnych warunków.

Kolejność też ma znaczenie – najpierw wartość mniejsza, potem większa. Zapisany odwrotnie BETWEEN 5.00 AND 4.00 nie zgłosi błędu, tylko zwróci pustą tabelę, bo żadna liczba nie jest jednocześnie większa od 5 i mniejsza od 4.

IN – warunek na liście wartości. Zapis klasa IN ('3A', '3B', '3C') zastępuje klasa = '3A' OR klasa = '3B' OR klasa = '3C'. Im dłuższa lista, tym większa oszczędność – i tym mniejsze ryzyko, że gdzieś pomyli się OR z AND.

NOT IN odwraca warunek: zwraca wiersze, których wartość nie występuje na liście.

Pułapka NOT IN i pustych wartości. Jeśli lista zawiera choćby jedną wartość pustą, NOT IN potrafi zwrócić pustą tabelę wbrew intuicji. Przy liście wpisanej ręcznie problemu nie ma, ale gdy lista pochodzi z podzapytania, warto się upewnić, że kolumna nie zawiera pustych pól.

Oba operatory działają nie tylko na liczbach – BETWEEN porównuje też teksty (alfabetycznie) i daty, co bywa najwygodniejszym sposobem na wybranie zakresu dat.

02

Zapytanie

-- BETWEEN zawiera obie granice: 4.10 i 5.10 wchodzą do wyniku
SELECT nazwisko, srednia
FROM uczniowie
WHERE srednia BETWEEN 4.00 AND 5.10
Wynik zapytania
nazwiskosrednia
Kowalska4.75
Wiśniewski5.10
Dąbrowski4.10
-- Ten sam warunek zapisany dwoma porównaniami
SELECT nazwisko, srednia
FROM uczniowie
WHERE srednia >= 4.00 AND srednia <= 5.10
Wynik zapytania
nazwiskosrednia
Kowalska4.75
Wiśniewski5.10
Dąbrowski4.10
-- IN zastępuje ciąg warunków połączonych OR
SELECT nazwisko, klasa
FROM uczniowie
WHERE klasa IN ('3A', '3C')
Wynik zapytania
nazwiskoklasa
Kowalska3A
Wiśniewski3A
Zając3C
-- NOT IN: wszystko poza wymienionymi wartościami
SELECT nazwisko, klasa
FROM uczniowie
WHERE klasa NOT IN ('3A', '3C')
Wynik zapytania
nazwiskoklasa
Nowak3B
Dąbrowski3B

Na maturze

Czytaj polecenie pod kątem granic przedziału. „Od 2000 do 4000", „między 2000 a 4000", „co najmniej 2000 i nie więcej niż 4000" to BETWEEN. „Powyżej 2000 i poniżej 4000" to już nie BETWEEN, bo wykluczono skrajne wartości – tam potrzebne są dwa warunki z > i <.

Przy IN pilnuj typu wartości na liście. Teksty w apostrofach, liczby bez. Lista mieszana – raz w apostrofach, raz bez – to najczęstsza przyczyna błędu w tym zapisie.

Warto też wiedzieć, że użycie BETWEEN albo IN nie jest wymagane, żeby dostać punkt. Rozwiązanie zapisane przez AND i OR jest równie poprawne. Skróty stosuj tam, gdzie realnie skracają – przy dwóch wartościach na liście IN niewiele daje.

04

Najczęściej zadawane pytania

Czy BETWEEN działa na tekstach?

Tak – porównuje wtedy alfabetycznie, tak samo jak >= i <=. Zapis nazwisko BETWEEN 'A' AND 'M' wybierze nazwiska z pierwszej połowy alfabetu. Trzeba tylko pamiętać, że tekst dłuższy niż jedna litera porównywany jest znak po znaku.

Ile wartości można wypisać po IN?

Praktycznie bardzo dużo, ale przy długiej liście warto się zastanowić, czy nie da się jej zastąpić podzapytaniem, które tę listę wyliczy samo. Lista wpisana ręcznie dezaktualizuje się przy każdej zmianie danych.

Czy jest odpowiednik BETWEEN dla wykluczenia przedziału?

Tak – NOT BETWEEN. Zwraca wiersze spoza przedziału, czyli wszystko poniżej dolnej granicy i powyżej górnej, z wyłączeniem samych granic.

Powiązane zagadnienia