Dana jest tabela mieszkania zawierająca kolumny o nazwach: adres, metraz, ile_pokoi, standard, status, cena. Wykonanie przedstawionej kwerendy SQL spowoduje, że zostaną wyświetlone
SELECT metraz, cena FROM mieszkania WHERE ile_pokoi > 3;
A. metraż oraz cena tych mieszkań, które mają więcej niż 3 pokoje
B. wszystkie informacje oprócz adresu tych mieszkań, które mają więcej niż 3 pokoje
C. metraż oraz cena tych mieszkań, które mają co najmniej 3 pokoje
D. wszystkie informacje dotyczące mieszkań, które mają co najmniej 3 pokoje
Pytanie z egzaminu CKE, czerwiec 2018 (arkusz E.14-X-18.06).
Kwerenda SELECT metraz, cena FROM mieszkania WHERE ile_pokoi > 3; zwraca tylko dwie wskazane kolumny: metraz oraz cena. To wynika bezpośrednio z części SELECT, bo tam określamy, jakie dane mają znaleźć się w wyniku zapytania. Warunek WHERE ile_pokoi > 3 ogranicza rekordy do mieszkań, które mają więcej niż 3 pokoje, czyli 4, 5, 6 itd. Ważne jest tu rozróżnienie: znak > oznacza „większe niż”, a nie „większe lub równe”. Gdyby chodziło o co najmniej 3 pokoje, należałoby użyć warunku ile_pokoi >= 3. W praktyce takie zapytanie przyda się np. w panelu biura nieruchomości, gdy chcemy pokazać klientowi tylko duże mieszkania i od razu porównać ich metraż oraz cenę. Moim zdaniem to bardzo dobry przykład na to, że w SQL trzeba czytać osobno listę kolumn i osobno warunek filtrowania. Dobra praktyka jest taka, żeby nie używać SELECT * bez potrzeby, bo pobieranie tylko potrzebnych kolumn zmniejsza ilość przesyłanych danych i poprawia czytelność kwerendy.
W tym zapytaniu łatwo pomylić dwie różne rzeczy: wybór kolumn oraz filtrowanie wierszy. Część SELECT metraz, cena nie oznacza pobrania wszystkich informacji o mieszkaniu, tylko pobranie konkretnie tych dwóch pól. Jeśli tabela ma także adres, standard, status czy ile_pokoi, to te dane nie pojawią się w wyniku, nawet jeśli istnieją w tabeli. Do wyświetlenia wszystkich kolumn służyłoby SELECT *, ale w tym przypadku gwiazdki nie ma. To częsty błąd, bo ktoś patrzy na nazwę tabeli mieszkania i zakłada, że wynik zawiera pełne rekordy, a SQL działa jednak bardzo dosłownie. Równie ważny jest operator w warunku WHERE. Zapis ile_pokoi > 3 wybierze mieszkania mające więcej niż 3 pokoje, więc mieszkanie trzypokojowe zostanie pominięte. Sformułowanie „co najmniej 3 pokoje” odpowiadałoby operatorowi >=, czyli większe lub równe. W bazach danych taka różnica ma spore znaczenie, bo jeden znak potrafi zmienić wynik raportu, oferty albo statystyki. Niepoprawne jest też założenie, że zapytanie zwraca „wszystko oprócz adresu”. SQL nie działa tu na zasadzie odejmowania jednej kolumny od kompletu, tylko na zasadzie jawnego wskazania, które kolumny mają być pokazane. Z mojego doświadczenia najlepiej czytać takie zapytania od końca logicznie: z tabeli mieszkania wybierz rekordy, gdzie ile_pokoi jest większe niż 3, a potem pokaż z nich tylko metraż i cenę.