Zdefiniowano bazę danych z tabelą mieszkancy o polach: nazwisko, imie, miasto. Następnie stworzono następujące zapytanie do bazy:
SELECT nazwisko, imie FROM mieszkancy WHERE miasto='Poznań' UNION ALL SELECT nazwisko, imie FROM mieszkancy WHERE miasto='Kraków';Wskaż zapytanie, które zwróci identyczne dane.
SELECT nazwisko, imie FROM mieszkancy AS 'Poznań' OR 'Kraków';
SELECT nazwisko, imie FROM mieszkancy WHERE miasto='Poznań' OR miasto='Kraków';
SELECT nazwisko, imie FROM mieszkancy WHERE miasto BETWEEN 'Poznań' OR 'Kraków';
SELECT nazwisko, imie FROM mieszkancy WHERE miasto HAVING 'Poznań' OR 'Kraków';
Pytanie z egzaminu CKE, styczeń 2016 (arkusz E.14-X-16.01).
UNION ALL skleja wyniki dwóch zapytań jeden pod drugim. Pierwsze zwraca mieszkańców Poznania, drugie Krakowa, więc razem dostajesz osoby z obu miast. Ten sam zbiór daje jedno zapytanie z warunkiem połączonym operatorem OR: WHERE miasto='Poznań' OR miasto='Kraków'. Wiersz trafia do wyniku, gdy spełniony jest którykolwiek z warunków.
W OR każdy warunek trzeba zapisać w całości, z nazwą kolumny po obu stronach. Krótszy zapis tego samego to WHERE miasto IN ('Poznań', 'Kraków'). Różnica między obiema postaciami może dotyczyć tylko kolejności wierszy, bo UNION ALL najpierw wypisuje cały Poznań, a dopiero potem Kraków. Bez ORDER BY kolejność wyniku SQL nie jest jednak gwarantowana.
Wszystkie błędne zapytania próbują wpisać dwa miasta w miejsce, które ich nie przyjmie. AS nadaje alias tabeli albo kolumnie, a nie filtruje danych. Zapis FROM mieszkancy AS 'Poznań' OR 'Kraków' to w dodatku błąd składni.
HAVING filtruje wyniki grupowania po GROUP BY, np. HAVING COUNT(*) > 5. Nie łączy się go z WHERE w środku warunku. BETWEEN wymaga przedziału zapisanego słowem AND: BETWEEN 'A' AND 'M', a przedział nazw miast obejmowałby też wszystkie miasta leżące alfabetycznie pomiędzy.
Zapamiętaj: kilka wartości jednej kolumny łączy się przez OR z pełnymi warunkami albo przez IN.
Poprawne zapytanie z OR jest też krótsze i czytelniejsze od połączenia dwóch zapytań.
Warto przećwiczyć takie zapytania w phpMyAdmin: zapis z błędną składnią serwer odrzuci od razu komunikatem o błędzie, a BETWEEN z poprawnym AND zadziała, ale zwróci za dużo wierszy.