Przejdź do głównej treści

Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Zawód: Technik informatyk, Technik programista

Kategorie: Bazy danych

W bazie danych hurtowni zdefiniowano tabelę sprzedaz o polach: id, kontrahent, grupa_cenowa, obrot. Aby wyszukać wyłącznie kontrahentów z drugiej grupy cenowej, których obrót jest większy niż 4000 zł, należy zastosować polecenie

A.
SELECT sprzedaz FROM kontrahent WHERE obrot > 4000;
B.
SELECT kontrahent FROM sprzedaz WHERE grupa_cenowa = 2 AND obrot > 4000;
C.
SELECT sprzedaz FROM kontrahent WHERE grupa_cenowa = 2 AND obrot > 4000;
D.
SELECT kontrahent FROM sprzedaz WHERE grupa_cenowa = 2 OR obrot > 4000;

Pytanie z egzaminu CKE, październik 2016 (arkusz E.14-X-16.08).

To polecenie dobrze wykorzystuje podstawową składnię zapytania SQL: SELECT wskazuje, jakie dane mają zostać zwrócone, FROM określa tabelę źródłową, a WHERE zawęża rekordy do tych, które spełniają warunki. W tym przypadku SELECT kontrahent FROM sprzedaz oznacza, że z tabeli sprzedaz pobieramy tylko wartości z kolumny kontrahent. Warunek grupa_cenowa = 2 wybiera klientów z drugiej grupy cenowej, a obrot > 4000 odcina tych, których obrót nie przekracza 4000 zł. Bardzo ważny jest operator AND, bo wymaga spełnienia obu warunków jednocześnie. W praktyce takie zapytania stosuje się np. do tworzenia listy klientów objętych promocją, raportów sprzedażowych albo segmentacji kontrahentów. Moim zdaniem to jeden z najważniejszych schematów w SQL, bo większość realnych raportów działa właśnie na filtrowaniu danych. Dobrą praktyką jest też wybieranie konkretnych kolumn zamiast SELECT *, bo wynik jest czytelniejszy i mniej obciąża bazę. Przy dużej tabeli warto rozważyć indeks na kolumnach grupa_cenowa i obrot, choć to już zależy od silnika bazy i charakteru danych. Gdyby trzeba było usunąć powtórzenia kontrahentów, można by użyć SELECT DISTINCT kontrahent, ale w tym pytaniu chodzi o poprawne filtrowanie rekordów według dwóch warunków.
W tym zadaniu najłatwiej pomylić dwa różne problemy: wybór właściwych kolumn i tabel oraz poprawne połączenie warunków logicznych. Zapytanie ma zwrócić kontrahentów, więc po słowie SELECT powinna znaleźć się kolumna kontrahent. Dane są przechowywane w tabeli sprzedaz, dlatego po FROM musi wystąpić właśnie sprzedaz. Częsty błąd polega na odwróceniu tych elementów, czyli traktowaniu nazwy tabeli jak kolumny, a nazwy kolumny jak tabeli. Dla serwera SQL to nie jest kwestia stylu, tylko konkretna instrukcja: SELECT mówi co pobrać, a FROM mówi skąd pobrać. Jeśli tabela kontrahent nie istnieje albo kolumna sprzedaz nie istnieje, zapytanie po prostu się nie wykona. A nawet jeśli przypadkiem takie obiekty byłyby w bazie, wynik dotyczyłby innych danych niż opisano w treści. Drugim typowym potknięciem jest użycie operatora OR zamiast AND. OR oznacza, że wystarczy spełnić jeden z warunków: klient może być w drugiej grupie cenowej albo mieć obrót większy niż 4000. To daje zbyt szeroki wynik, bo pojawią się także kontrahenci z innych grup cenowych, jeśli mają wysoki obrót, oraz kontrahenci z drugiej grupy z obrotem mniejszym lub równym 4000. W treści jest słowo wyłącznie, więc trzeba zawężać, nie rozszerzać. Z mojego doświadczenia warto czytać taki warunek po polsku: grupa cenowa równa 2 i obrót większy niż 4000. Jeśli w zdaniu naturalnie pasuje i, w SQL zwykle będzie to AND. Pominięcie warunku grupa_cenowa = 2 też jest niepoprawne, bo wtedy raport obejmie wszystkich kontrahentów z wysokim obrotem, bez względu na grupę cenową, czyli nie spełni wymagania biznesowego.

Wymagane logowanie

Ocenianie trudności pytań jest dostępne tylko dla zalogowanych użytkowników. Zaloguj się, aby skorzystać z pełni możliwości platformy.

Twoja ocena pomoże innym uczniom w przygotowaniu do egzaminu, a Tobie pozwoli na dostęp do spersonalizowanych statystyk.

Zgłoś błąd w pytaniu

Rozwiń sekcję i zmień pole, którego dotyczy błąd. Wysłane zostaną tylko zmienione sekcje.

Błędna kwalifikacja
Błąd w treści pytania
Błąd w treści odpowiedzi
Błąd w obrazie
Dane kontaktowe (opcjonalnie)
Podaj email, jeśli chcesz otrzymać informację o rozpatrzeniu zgłoszenia.