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

AND, OR, NOT – łączenie warunków

Łączenie kilku warunków w klauzuli WHERE operatorami AND, OR i NOT oraz rola nawiasów przy ustalaniu kolejności działań.

01

Opis

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.

02

Tabela

Kiedy warunek złożony jest prawdziwy
Warunek AWarunek BA AND BA OR B
prawdaprawdaprawdaprawda
prawdafałszfałszprawda
fałszprawdafałszprawda
fałszfałszfałszfałsz
03

Zapytanie

-- AND: oba warunki muszą być spełnione naraz
SELECT nazwisko, klasa, srednia
FROM uczniowie
WHERE klasa = '3A' AND srednia > 4.00
Wynik zapytania
nazwiskoklasasrednia
Kowalska3A4.75
Wiśniewski3A5.10
-- OR: "uczniowie z 3A i 3B" to logicznie OR, nie AND
SELECT nazwisko, klasa
FROM uczniowie
WHERE klasa = '3A' OR klasa = '3B'
Wynik zapytania
nazwiskoklasa
Kowalska3A
Nowak3B
Wiśniewski3A
Dąbrowski3B
-- 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
Wynik zapytania
nazwiskoklasasrednia
Kowalska3A4.75
Wiśniewski3A5.10
Dąbrowski3B4.10

Na maturze

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.

05

Najczęściej zadawane pytania

Ile warunków można połączyć?

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.

Czy `NOT (A AND B)` to to samo co `NOT A AND NOT B`?

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.

Czy kolejność warunków przy AND ma znaczenie dla wyniku?

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.

Powiązane zagadnienia