Łączenie wielu warunków w klauzuli WHERE
Rzadko kiedy wystarcza nam jeden warunek. Zazwyczaj chcemy łączyć logikę (np. „uczniowie z klasy 3A i o średniej powyżej 4.0”). Do tego służą operatory logiczne AND, OR oraz NOT.
Operator AND (oba warunki muszą być spełnione)
Operator AND łączy dwa warunki. Całość jest TRUE tylko wtedy, gdy oba warunki składowe (po lewej i po prawej stronie AND) są TRUE.
Składnia:
... WHERE [warunek1] AND [warunek2];Przykład: Znajdź uczniów z klasy '3A', którzy mają średnią powyżej 4.5.
SELECT Imie, Nazwisko, Srednia
FROM Uczniowie
WHERE Klasa = '3A' AND Srednia > 4.5;Operator OR (wystarczy, że jeden warunek jest spełniony)
Operator OR łączy dwa warunki. Całość jest TRUE, jeśli przynajmniej jeden z warunków składowych jest TRUE.
Składnia:
... WHERE [warunek1] OR [warunek2];Przykład: Znajdź uczniów, którzy mieszkają w Warszawie lub w Krakowie.
SELECT Imie, Nazwisko, Miasto
FROM Uczniowie
WHERE Miasto = 'Warszawa' OR Miasto = 'Kraków';Operator NOT (negacja warunku)
Operator NOT odwraca (neguje) znaczenie warunku, który po nim następuje (zmienia TRUE na FALSE i odwrotnie).
Składnia:
... WHERE NOT [warunek];Przykład: Znajdź wszystkich uczniów, którzy nie mieszkają w Warszawie.
SELECT Imie, Nazwisko, Miasto
FROM Uczniowie
WHERE NOT Miasto = 'Warszawa';Uwaga: Jest to logicznie tożsame z WHERE Miasto != 'Warszawa'. NOT staje się bardziej użyteczny w połączeniu z operatorami IN oraz BETWEEN.
Kolejność wykonywania działań (użycie nawiasów)
To jest jedna z najczęstszych pułapek logicznych w SQL. Podobnie jak w matematyce (gdzie mnożenie wykonuje się przed dodawaniem), w SQL operator AND jest przetwarzany przed operatorem OR.
Przykład błędnego zapytania (chcemy znaleźć uczniów z klasy '3A' lub '3B', którzy mają średnią powyżej 4.0):
-- Błędne zapytanie:
SELECT *
FROM Uczniowie
WHERE Klasa = '3A' OR Klasa = '3B' AND Srednia > 4.0;Jak zinterpretuje to baza danych (zgodnie z kolejnością działań):
... WHERE Klasa = '3A' OR (Klasa = '3B' AND Srednia > 4.0);Wynik: otrzymamy wszystkich uczniów z klasy '3A' (niezależnie od średniej) ORAZ uczniów z klasy '3B', którzy mają średnią powyżej 4.0 — co nie jest zamierzonym wynikiem.
Rozwiązanie: zawsze, gdy mieszamy AND i OR, należy używać nawiasów, aby wymusić kolejność działań i zapewnić czytelność.
-- Poprawne zapytanie:
SELECT *
FROM Uczniowie
WHERE (Klasa = '3A' OR Klasa = '3B') AND Srednia > 4.0;Teraz warunek jest poprawny: „Klasa to 3A lub 3B” ORAZ „Średnia jest powyżej 4.0”.