LIKE, IN, BETWEEN i IS NULL
Szukaj po wzorcu, liście i zakresie. Poznaj granice przedziałów oraz pułapkę NULL w NOT IN.
Część bazodanowa INF.03Cztery częste pytania do danych
LIKE
Czy tekst pasuje do wzorca, np. zaczyna się od A?
IN
Czy wartość należy do podanej listy?
BETWEEN
Czy wartość mieści się między granicami włącznie?
IS NULL
Czy wartości brakuje?
LIKE: wzorzec zamiast równości
W MySQL/MariaDB, SQL Server i Oracle znak % oznacza ciąg dowolnej długości, także pusty, a _ pojedynczy znak. Wzorzec jest literałem tekstowym, więc wymaga apostrofów.
-- Rzeczywisty MySQL / MariaDB, SQL Server albo Oracle
SELECT imie FROM klienci WHERE imie LIKE 'A%';
SELECT imie FROM klienci WHERE imie LIKE '%a';
SELECT imie FROM klienci WHERE imie LIKE '_a_';Dla naszych prostych imion oczekujesz odpowiednio: Ala i Adam; Ala i Ewa; Jan. O wielkości liter, akcentach i szczegółach porównania decyduje silnik oraz kolacja. LIKE 'A%' nie znaczy „zawiera A gdziekolwiek” — do tego służy LIKE '%A%'.
Gdy szukasz dosłownego znaku % lub _, trzeba go odróżnić od symbolu wzorca. Np. w wymienionych silnikach LIKE '10!%%' ESCAPE '!' wyszukuje tekst zaczynający się od „10%”. Dobierz sposób ucieczki do dialektu i ustawień. Nie myl apostrofu SQL ze znakiem ucieczki we wzorcu.
Access: sprawdź tryb ANSI
| Cel | MySQL / SQL Server / Oracle, Access ANSI-92 | Access ANSI-89 |
|---|---|---|
| Zaczyna się od A | LIKE 'A%’ | LIKE 'A*’ |
| Kończy się na a | LIKE '%a’ | LIKE '*a’ |
| 3 znaki, środkowy to a | LIKE '_a_’ | LIKE ’?a?’ |
Typowa kwerenda bazy Access .accdb/.mdb korzysta z ANSI-89, ale ustawienia bazy i metoda połączenia mogą oznaczać ANSI-92. Sprawdź środowisko zamiast zgadywać po nazwie pliku. Gwiazdka po SELECT i gwiazdka we wzorcu Access to dwa różne zastosowania tego samego znaku.
IN: czytelna lista
SELECT imie, miasto FROM klienci
WHERE miasto IN ('Gdansk', 'Torun')
ORDER BY id;Wynik to Ala, O’Neil i Adam. Lista jest alternatywą dla dwóch porównań połączonych OR. Nie zapisuj miasto = 'Gdansk' OR 'Torun' — drugi fragment nie jest porównaniem miasta.
NOT IN ('Gdansk', 'Torun') nie wybierze Ewy z NULL. Jeszcze groźniejsza pułapka to NULL wewnątrz listy NOT IN: np. id NOT IN (1, NULL) nie wybierze żadnego z naszych klientów. Dla id 1 wynik jest fałszywy, dla pozostałych nieznany. Podzapytania i NOT EXISTS omówimy osobno.
BETWEEN obejmuje obie granice
SELECT nazwa, cena FROM produkty
WHERE cena BETWEEN 60 AND 120
ORDER BY id;To odpowiednik cena >= 60 AND cena <= 120: Mysz za 60 i Klawiatura za 120 mieszczą się w zakresie. Granice podawaj od mniejszej do większej. NOT BETWEEN opisuje wartości poza zakresem, ale porównanie z NULL nadal daje UNKNOWN.
Dla znacznika czasu cały luty lepiej opisać przedziałem półotwartym: od początku 1 lutego włącznie do początku 1 marca wyłącznie. BETWEEN z końcem „2026-02-28” może oznaczać północ i pominąć resztę ostatniego dnia.
-- MySQL / MariaDB: kolumna DATE lub DATETIME
WHERE data >= '2026-02-01' AND data < '2026-03-01'
-- SQL Server: jednoznaczny format bez separatorów
WHERE data >= '20260201' AND data < '20260301'
-- Oracle 19c
WHERE data >= DATE '2026-02-01' AND data < DATE '2026-03-01'
-- Access w kwerendzie
WHERE data >= DateSerial(2026,2,1) AND data < DateSerial(2026,3,1)To fragmenty warunku, nie samodzielne pełne zapytania. W edytorze data jest tekstem ISO YYYY-MM-DD, a nie rzeczywistym typem daty. Dla jednakowego formatu tekstu porządek leksykalny daje tu poprawną kolejność dni.
Wypróbuj zapytanie
SQLite — rzeczywisty silnik przeglądarki. MySQL / SQL Server — ograniczona emulacja składni. Wybierz tryb SQLite do natywnego LIKE. Pozostałe tryby nie są rzeczywistymi serwerami. Ścisłe typy, auto-ID i administrację ćwicz w prawdziwym SZBD.
Ćwiczenia
- Wybierz produkty o cenie od 25 do 60 włącznie.
- Wybierz klientów z id 1, 3 lub 5.
- Znajdź klientów z Gdanska albo bez znanej miejscowości. Wyjaśnij, dlaczego IN (’Gdansk’, NULL) nie wystarczy.
- Napisz wzorzec imienia zaczynającego się od A dla MySQL i Access ANSI-89.
Rozwiązania
SELECT nazwa FROM produkty WHERE cena BETWEEN 25 AND 60 ORDER BY id;
SELECT imie FROM klienci WHERE id IN (1,3,5) ORDER BY id;
SELECT imie FROM klienci
WHERE miasto = 'Gdansk' OR miasto IS NULL ORDER BY id;
-- MySQL: WHERE imie LIKE 'A%'
-- Access ANSI-89: WHERE imie LIKE 'A*'1. Mysz, Kabel. 2. Ala, O’Neil, Adam. 3. Ala, O’Neil, Ewa. NULL w IN nie zastępuje testu IS NULL.
Źródła: MySQL LIKE, Access LIKE, T-SQL BETWEEN. INF.03.4: wyszukiwanie danych według warunków. Dalej: sortowanie i ograniczanie liczby wyników.

