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.