Za pomocą której kwerendy w bazie MariaDB można wybrać artykuły, których ceny zawierają się w przedziale obustronnie domkniętym <10, 20>?
A.
SELECT * FROM Artykuly WHERE Cena BETWEEN 10 AND 20;
B.
SELECT * FROM Artykuly WHERE Cena LIKE 1%, 2%;
C.
SELECT * FROM Artykuly WHERE Cena IN (10, 20);
D.
SELECT * FROM Artykuly WHERE Cena > 10 AND Cena < 20;
Pytanie z egzaminu CKE, styczeń 2022 (arkusz EE.09-SG-22.01).
Kwerenda SELECT * FROM Artykuly WHERE Cena BETWEEN 10 AND 20; jest właściwa, bo operator BETWEEN w MariaDB sprawdza, czy wartość mieści się w przedziale domkniętym, czyli razem z granicami. W praktyce oznacza to warunek Cena >= 10 AND Cena <= 20. Jeśli więc artykuł kosztuje dokładnie 10, 15.99 albo dokładnie 20, zostanie zwrócony w wyniku zapytania. To jest właśnie sens zapisu przedziału <10, 20>. Moim zdaniem BETWEEN jest tu najbardziej czytelny, bo od razu widać, że chodzi o zakres wartości, a nie o dwa konkretne przypadki. W bazach danych takie zapytania stosuje się np. w sklepach internetowych do filtrowania produktów po cenie, dacie dodania albo liczbie sztuk w magazynie. Dobrą praktyką jest też przechowywanie cen w typie DECIMAL, a nie FLOAT, bo ceny wymagają dokładności. Przy większej tabeli warto mieć indeks na kolumnie Cena, wtedy filtrowanie zakresowe może działać dużo szybciej.
W tym pytaniu najważniejsze jest rozróżnienie między wyborem konkretnych wartości, dopasowaniem tekstowym oraz sprawdzaniem zakresu liczbowego. Operator IN nie oznacza przedziału. Warunek Cena IN (10, 20) zwróciłby tylko te rekordy, w których cena wynosi dokładnie 10 albo dokładnie 20. Produkty za 12, 15.50 czy 19.99 zostałyby pominięte, więc nie spełnia to założenia przedziału obustronnie domkniętego. To częsty błąd, bo na pierwszy rzut oka dwie liczby w nawiasie mogą się kojarzyć z zakresem, ale SQL tak tego nie interpretuje.
LIKE służy głównie do porównywania tekstu z wzorcem, np. przy wyszukiwaniu nazw zaczynających się od określonych liter. Dla cen liczbowych to nie jest dobre narzędzie. Dodatkowo zapis z 1% i 2% bez cudzysłowów oraz z przecinkiem po LIKE jest składniowo podejrzany i w praktyce nie wyraża poprawnego warunku zakresowego. Nawet gdyby użyć wzorców tekstowych, to filtrowanie ceny jako tekstu bywa zdradliwe, bo porządek tekstowy i liczbowy to dwie różne sprawy.
Warunek Cena > 10 AND Cena < 20 wybiera tylko wartości większe od 10 i mniejsze od 20. Nie obejmuje ceny równej 10 ani równej 20, więc opisuje przedział otwarty, a nie domknięty. Gdyby nie używać BETWEEN, poprawnym odpowiednikiem byłoby Cena >= 10 AND Cena <= 20. Z mojego doświadczenia takie detale z operatorami >, <, >= i <= bardzo często robią różnicę w testach i w prawdziwych systemach, np. przy raportach sprzedaży.
LIKE służy głównie do porównywania tekstu z wzorcem, np. przy wyszukiwaniu nazw zaczynających się od określonych liter. Dla cen liczbowych to nie jest dobre narzędzie. Dodatkowo zapis z 1% i 2% bez cudzysłowów oraz z przecinkiem po LIKE jest składniowo podejrzany i w praktyce nie wyraża poprawnego warunku zakresowego. Nawet gdyby użyć wzorców tekstowych, to filtrowanie ceny jako tekstu bywa zdradliwe, bo porządek tekstowy i liczbowy to dwie różne sprawy.
Warunek Cena > 10 AND Cena < 20 wybiera tylko wartości większe od 10 i mniejsze od 20. Nie obejmuje ceny równej 10 ani równej 20, więc opisuje przedział otwarty, a nie domknięty. Gdyby nie używać BETWEEN, poprawnym odpowiednikiem byłoby Cena >= 10 AND Cena <= 20. Z mojego doświadczenia takie detale z operatorami >, <, >= i <= bardzo często robią różnicę w testach i w prawdziwych systemach, np. przy raportach sprzedaży.