Łączenie kilku warunków w klauzuli WHERE operatorami AND, OR i NOT oraz rola nawiasów przy ustalaniu kolejności działań.
Jeden warunek w klauzuli WHERE wystarcza rzadko. Zwykle zadanie brzmi „uczniowie z klasy 3A i ze średnią powyżej 4,0" albo „uczniowie z klasy 3A lub 3B". Do łączenia warunków służą trzy operatory logiczne: AND, OR i NOT.
Pomocny obraz: dwa zbiory. Każdy warunek wyznacza pewną grupę wierszy. AND zwraca część wspólną obu grup – wiersze należące jednocześnie do jednej i do drugiej. OR zwraca ich sumę – wszystko, co należy do którejkolwiek. Ten jeden obrazek rozstrzyga większość wątpliwości, który operator wybrać.
AND – oba warunki naraz. Wiersz trafia do wyniku tylko wtedy, gdy spełnia wszystkie połączone warunki. Każde kolejne AND może więc wynik już tylko zawęzić, nigdy poszerzyć.
OR – wystarczy jeden. Wiersz trafia do wyniku, gdy spełnia przynajmniej jeden z warunków. Każde kolejne OR może wynik tylko poszerzyć.
NOT – odwrócenie. NOT neguje warunek, który po nim stoi: zwraca dokładnie te wiersze, których warunek nie obejmował.
Pułapka językowa. Polskie „i" w treści zadania nie zawsze znaczy AND. Polecenie „wypisz uczniów z klasy 3A i 3B" po polsku brzmi jak „i", ale logicznie znaczy klasa = '3A' OR klasa = '3B' – bo żaden pojedynczy uczeń nie jest jednocześnie w dwóch klasach. Warunek z AND zwróciłby tu pustą tabelę. Zawsze sprawdzaj, czy oba warunki dotyczą tej samej kolumny – jeśli tak, prawie zawsze chodzi o OR.
Jeżeli w którejkolwiek z porównywanych kolumn mogą być wartości puste, tabela prawdy zyskuje trzecią wartość – „nieznane" – i wyniki przestają być oczywiste. Warto o tym pamiętać przy warunkach na kolumnach, które bywają niewypełnione.
Kolejność działań i nawiasy. AND wiąże mocniej niż OR – dokładnie tak, jak mnożenie wiąże mocniej niż dodawanie. Zapis A OR B AND C baza czyta jako A OR (B AND C), co często nie jest tym, o co nam chodziło. Jeżeli w warunku występują jednocześnie AND i OR, wstaw nawiasy i nie licz na domyślną kolejność. Nawet gdy nawias niczego nie zmienia, czyni zapis jednoznacznym dla czytającego – a na maturze także dla sprawdzającego.
| Warunek A | Warunek B | A AND B | A OR B |
|---|---|---|---|
| prawda | prawda | prawda | prawda |
| prawda | fałsz | fałsz | prawda |
| fałsz | prawda | fałsz | prawda |
| fałsz | fałsz | fałsz | fałsz |
-- AND: oba warunki muszą być spełnione naraz SELECT nazwisko, klasa, srednia FROM uczniowie WHERE klasa = '3A' AND srednia > 4.00
| nazwisko | klasa | srednia |
|---|---|---|
| Kowalska | 3A | 4.75 |
| Wiśniewski | 3A | 5.10 |
-- OR: "uczniowie z 3A i 3B" to logicznie OR, nie AND SELECT nazwisko, klasa FROM uczniowie WHERE klasa = '3A' OR klasa = '3B'
| nazwisko | klasa |
|---|---|
| Kowalska | 3A |
| Nowak | 3B |
| Wiśniewski | 3A |
| Dąbrowski | 3B |
-- Nawiasy rozstrzygają kolejność: bez nich AND wykonałby się pierwszy SELECT nazwisko, klasa, srednia FROM uczniowie WHERE (klasa = '3A' OR klasa = '3B') AND srednia >= 4.00
| nazwisko | klasa | srednia |
|---|---|---|
| Kowalska | 3A | 4.75 |
| Wiśniewski | 3A | 5.10 |
| Dąbrowski | 3B | 4.10 |
Najdroższy błąd w tym temacie to AND tam, gdzie powinno być OR. Objawia się pustym wynikiem: skoro żaden wiersz nie może mieć w jednej kolumnie dwóch różnych wartości naraz, warunek klasa = '3A' AND klasa = '3B' nie zwróci niczego. Jeśli zapytanie zwraca zero wierszy, a spodziewasz się jakichś – sprawdź to jako pierwsze.
Drugi błąd to brak nawiasów przy mieszaniu AND z OR. Zapytanie się wykona, nie zgłosi żadnego błędu i zwróci wynik – tylko nie ten, o który prosiło zadanie. To najtrudniejsza do wyłapania kategoria pomyłek, bo nic nie sygnalizuje problemu.
Praktyczna rada: przy warunku złożonym z trzech i więcej członów rozpisz go sobie na brudno w punktach, zanim zapiszesz w SQL-u. Sprawdź na jednym konkretnym wierszu tabeli, czy Twój warunek go przepuszcza – i czy powinien.
Praktycznie dowolnie wiele. Problemem nie jest limit bazy, tylko czytelność – przy pięciu członach łatwo zgubić się w nawiasach. Jeśli warunek robi się długi, warto sprawdzić, czy nie da się go zapisać krócej, np. operatorem IN dla listy wartości albo BETWEEN dla przedziału.
Nie. NOT (A AND B) oznacza „nie jest tak, że oba naraz", czyli wystarczy, że jeden warunek nie jest spełniony. NOT A AND NOT B oznacza „żaden z nich nie jest spełniony" – to warunek znacznie ostrzejszy. Poprawnym odpowiednikiem NOT (A AND B) jest NOT A OR NOT B.
Nie – A AND B i B AND A dają ten sam zbiór wierszy. To samo dotyczy OR. Kolejność bywa istotna dla szybkości działania na dużych tabelach, ale na maturze nie ma to znaczenia.
Zagadnienia z tego samego obszaru matury – warto je powtórzyć razem: