KWALIFIKACJA INF3 - CZERWIEC 2019

PYTANIE NR 22.
W tabeli produkt znajdują się przedmioty wyprodukowane po 2000 roku, z polami nazwa i rok_produkcji. Klauzula SQL wyświetli listę przedmiotów wyprodukowanych

SELECT * FROM `produkt` WHERE SUBSTR(rok_produkcji,3,2)=17;

A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Warunek SUBSTR(rok_produkcji,3,2)=17 wybiera z pola rok_produkcji dwa znaki zaczynając od 3. pozycji. Dla zapisu "2017" tym fragmentem jest "17", więc zwrócone zostaną rekordy z rokiem 2017 (a nie lata większe lub mniejsze).

Pełne wyjaśnienie:

Zapytanie SELECT * FROM produkt WHERE SUBSTR(rok_produkcji,3,2)=17; filtruje wiersze tabeli produkt na podstawie fragmentu pola rok_produkcji.

Funkcja SUBSTR(x,3,2) zwraca dwa znaki zaczynając od 3. pozycji w łańcuchu. Jeśli rok jest zapisany w formie czterech znaków, np. 2017, to:

  • pozycja 1: "2"
  • pozycja 2: "0"
  • pozycja 3: "1"
  • pozycja 4: "7"

Zatem SUBSTR('2017',3,2) zwróci "17". Warunek równości sprawdza, czy wycięty fragment ma wartość 17 (w praktyce odpowiada to końcówce "17" dla roku 2017 w takim zapisie). Dlatego poprawna jest odpowiedź "w roku 2017."

Odpowiedź "po roku 2017." byłaby prawidłowa, gdyby w zapytaniu użyto operatora porównania "większe niż" (np. > 2017) albo gdyby porównywano pełny rok jako liczbę. Tutaj występuje równość i sprawdzany jest tylko fragment tekstu.

Odpowiedź "przed rokiem 2017." także nie pasuje, bo nie ma operatora "mniejsze niż" oraz nie ma żadnej logiki wskazującej na lata wcześniejsze.

Odpowiedź "w latach innych niż 2017." wymagałaby negacji warunku (np. != 17) albo innej konstrukcji. W przedstawionym zapytaniu wybierane są tylko te rekordy, które spełniają równość.

Wskazówka egzaminacyjna: w takich zadaniach najpierw "podstaw" przykładową wartość (np. 2017) i ręcznie policz, które znaki zostaną wycięte przez SUBSTR, a dopiero potem interpretuj sens warunku WHERE.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Funkcja SUBSTR (często równoważna z SUBSTRING) wycina fragment łańcucha znaków. Podajesz tekst, pozycję startową i długość, a wynikiem jest podciąg. Używa się jej m.in. do filtrowania, formatowania i walidacji danych zapisanych jako tekst.
Dla tekstu "2017" wycinane są 2 znaki od 3. pozycji: trzeci znak to "1", czwarty to "7", więc wynikiem jest "17". Następnie ten wynik jest porównywany w WHERE z wartością podaną po znaku równości.
W zapytaniu jest operator równości "=", więc wybierane są rekordy spełniające dokładnie wskazany warunek, a nie większe/mniejsze wartości. Aby dostać "po 2017", trzeba porównywać cały rok operatorem > (np. rok_produkcji > 2017) lub przekształcić dane do liczby.
Najczęściej lepiej przechowywać rok jako liczbę (łatwiejsze porównania i sortowanie). Gdy rok jest tekstem, pojawia się potrzeba używania funkcji typu SUBSTR i ryzyko błędów formatowania. Jeśli jednak dane pochodzą z importu, tekstowy zapis bywa spotykany i trzeba umieć go obsłużyć.
Najczęściej myli się numerację pozycji (od 0 zamiast od 1), długość wycinanego fragmentu oraz sens operatora w WHERE (np. mylenie "=" z ">"). Częsty jest też błąd interpretacji: student zakłada, że "17" oznacza lata po 2017, a to tylko równość fragmentu tekstu.
Jeśli rok jest liczbą, użyj warunku rok_produkcji > 2017. Jeśli rok jest tekstem, zwykle najpierw warto go przekonwertować na liczbę (np. rzutowaniem) i dopiero porównywać. Ważne jest, by porównywać pełny rok, a nie tylko końcówkę.
W wielu silnikach SQL występuje automatyczna konwersja typów w wyrażeniach, więc porównanie może "zadziałać", ale bywa nieczytelne i zależne od ustawień. Bezpieczniej jest jawnie porównywać tekst z tekstem (np. '17') lub jawnie konwertować do typu liczbowego.
Gdy pole jest typu daty (DATE/DATETIME) lub da się je przechowywać jako data, wtedy funkcje daty (np. wyciąganie roku) są bardziej poprawne i odporne na format. SUBSTR ma sens głównie wtedy, gdy dane są już tekstem i nie masz pewności co do ich ustrukturyzowania.
Najprościej wykonać testowe zapytanie na stałej wartości, np. wyświetlić wynik funkcji dla przykładu. W praktyce: uruchom SELECT z SUBSTR na przykładzie "2017" i zobacz rezultat. To pomaga uniknąć błędów pozycji i długości argumentów.
Ćwicz na małych tabelach: SELECT z WHERE, a potem dodawaj funkcje tekstowe (SUBSTR, LENGTH, CONCAT). Rób krótkie testy na stałych wartościach, aby rozumieć wynik funkcji. Ucz się też czytać zapytanie etapami: najpierw FROM, potem WHERE, na końcu co zwraca SELECT.
info

Statystycznie 47% uczniów zna prawidłową odpowiedź. trudne

Eksperci podkreślają: "Warunek SUBSTR(rok_produkcji,3,2)=17 wybiera z pola rok_produkcji dwa znaki zaczynając od 3."

Źródła:

  • MySQL 8.0 Reference Manual: String Functions and Operators – SUBSTRING()/SUBSTR(), https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_substring (dostęp: 2026-03-02)
  • MySQL 8.0 Reference Manual: Data Type Conversion in Expression Evaluation, https://dev.mysql.com/doc/refman/8.0/en/type-conversion.html (dostęp: 2026-03-02)
  • MySQL 8.0 Reference Manual: Comparison Operators, https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html (dostęp: 2026-03-02)

Materiały:

  • Dokumentacja funkcji łańcuchowych używanego silnika bazy danych
  • Ćwiczenia z budowania warunków WHERE i testowania zapytań na przykładowych tabelach
  • Materiały kursowe z podstaw SQL: SELECT, WHERE, funkcje na danych

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego