SELECT imie FROM pracownicy WHERE nazwisko = 'Kowal' OR stanowisko > 2; Na tabeli Pracownicy, której wiersze zostały pokazane poniżej, wykonano...
SELECT imie FROM pracownicy WHERE nazwisko = 'Kowal' OR stanowisko > 2;Na tabeli Pracownicy, której wiersze zostały pokazane poniżej, wykonano przedstawioną kwerendę SELECT. Które dane zostaną wybrane?
| id | imie | nazwisko | stanowisko |
|---|---|---|---|
| 1 | Anna | Kowalska | 1 |
| 2 | Monika | Nowak | 2 |
| 3 | Ewelina | Nowakowska | 2 |
| 4 | Anna | Przybylska | 3 |
| 5 | Maria | Kowal | 3 |
| 6 | Ewa | Nowacka | 4 |
A. Anna, Maria, Ewa.
B. Tylko Anna.
C. Tylko Maria.
D. Monika, Ewelina, Maria.
Pytanie z egzaminu CKE, styczeń 2023 (arkusz EE.09-SG-23.01).
Kwerenda wybiera kolumnę imie z tych wierszy tabeli pracownicy, które spełniają warunek nazwisko = 'Kowal' OR stanowisko > 2. Ważne jest tu słowo OR, czyli alternatywa logiczna: wystarczy, że prawdziwy będzie przynajmniej jeden z warunków. Maria spełnia oba warunki, bo ma nazwisko Kowal i stanowisko 3. Anna z id 4 ma nazwisko Przybylska, ale stanowisko 3, więc też zostaje wybrana. Ewa ma stanowisko 4, więc również spełnia warunek stanowisko > 2. Anna Kowalska nie przechodzi, bo nazwisko Kowalska nie jest równe dokładnie Kowal, a stanowisko ma 1. Monika i Ewelina mają stanowisko 2, a operator > oznacza większe, nie większe lub równe. Wynik to więc: Anna, Maria, Ewa. W praktyce w SQL trzeba bardzo pilnować operatorów porównania i logiki AND/OR, bo mała różnica potrafi całkiem zmienić wynik raportu, np. listy pracowników, zamówień albo użytkowników systemu.
W tej kwerendzie łatwo pomylić kilka rzeczy naraz, szczególnie jeśli patrzy się tylko na jedną kolumnę tabeli. Warunek nazwisko = 'Kowal' oznacza dokładne porównanie tekstu, więc nie obejmuje nazwiska Kowalska. Gdyby chodziło o nazwiska zaczynające się od Kowal, należałoby użyć operatora LIKE, na przykład nazwisko LIKE 'Kowal%'. Tutaj jednak mamy zwykłe =, więc z tego warunku pasuje tylko Maria. Drugi warunek, stanowisko > 2, działa niezależnie, bo między warunkami jest OR. To nie jest AND, które wymagałoby spełnienia obu części jednocześnie. OR dopuszcza każdy rekord, w którym prawdziwe jest nazwisko = 'Kowal' albo prawdziwe jest stanowisko > 2. Dlatego nie można ograniczyć wyniku tylko do Marii. Nie można też dodać Moniki i Eweliny, bo ich stanowisko ma wartość 2, a 2 nie jest większe od 2. To częsty błąd: traktowanie > tak, jakby oznaczało >=. Z kolei wybór tylko Anny pomija fakt, że zapytanie nie filtruje po imieniu. SELECT imie mówi jedynie, jaką kolumnę pokazać w wyniku, a nie jaki rekord wybrać. Moim zdaniem to jedno z ważniejszych rozróżnień w SQL: SELECT określa projekcję kolumn, a WHERE selekcję wierszy. Poprawne myślenie jest takie: najpierw sprawdzamy każdy wiersz według WHERE, a dopiero potem z pasujących wierszy wypisujemy kolumnę imie.