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.
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.
-- 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
| nazwisko | srednia |
|---|---|
| Kowalska | 4.75 |
| Wiśniewski | 5.10 |
| Dąbrowski | 4.10 |
-- Ten sam warunek zapisany dwoma porównaniami SELECT nazwisko, srednia FROM uczniowie WHERE srednia >= 4.00 AND srednia <= 5.10
| nazwisko | srednia |
|---|---|
| Kowalska | 4.75 |
| Wiśniewski | 5.10 |
| Dąbrowski | 4.10 |
-- IN zastępuje ciąg warunków połączonych OR SELECT nazwisko, klasa FROM uczniowie WHERE klasa IN ('3A', '3C')
| nazwisko | klasa |
|---|---|
| Kowalska | 3A |
| Wiśniewski | 3A |
| Zając | 3C |
-- NOT IN: wszystko poza wymienionymi wartościami SELECT nazwisko, klasa FROM uczniowie WHERE klasa NOT IN ('3A', '3C')
| nazwisko | klasa |
|---|---|
| Nowak | 3B |
| Dąbrowski | 3B |
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.
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.
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.
Tak – NOT BETWEEN. Zwraca wiersze spoza przedziału, czyli wszystko poniżej dolnej granicy i powyżej górnej, z wyłączeniem samych granic.
Zagadnienia z tego samego obszaru matury – warto je powtórzyć razem: