Pierwszy oceniany rezultat krok po kroku: start Apache i MySQL w XAMPP, baza egzamin w phpMyAdmin, import pliku .sql, zrzut import.jpg oraz cztery kwerendy zapisane w kwerendy.txt ze zrzutami kw1.png do kw4.png. Lekcja 13.2 kursu INF.03.
Pierwszy z pięciu ocenianych rezultatów zadania praktycznego to operacje na bazie danych: uruchomienie serwera, założenie bazy, import tabel z pliku i cztery kwerendy SQL. Ta lekcja prowadzi przez niego w kolejności, w jakiej robi się to przy komputerze, i pokazuje, czego arkusz wymaga w każdym z plików. Rezultat zamyka się w pierwsze pół godziny egzaminu i dopiero po nim ma sens skrypt PHP, bo bez bazy nie ma z czym się łączyć. Składni SQL nie ma tu od nowa, są odnośniki do działu SQL.
Start usług i baza o nazwie z arkusza
Zadanie zaczyna się poza bazą. Zdający loguje się na konto Egzamin, rozpakowuje archiwum ZIP zabezpieczone hasłem podanym w arkuszu i zakłada folder nazwany własnym numerem PESEL. Do tego folderu trafiają wszystkie wyniki: pliki tego rezultatu, później witryna, skrypty i plik przeglądarka.txt z nazwą użytej przeglądarki. Resztę dyscypliny plików opisuje lekcja o anatomii zadania. Serwer uruchamia XAMPP Control Panel. Potrzebne są dwie usługi: MySQL, bo w nim stanie baza, oraz Apache, bo przez niego działa phpMyAdmin i późniejsze strony PHP. Po kliknięciu Start obie mają mieć zielone tło i numer procesu. Czerwony komunikat o porcie znaczy, że port zajmuje inny program, najczęściej druga instalacja MySQL albo usługa IIS.
Adres http://localhost/phpmyadmin otwiera panel, konto to root bez hasła. Zakładka Bazy danych, pole z nazwą, zestawienie znaków utf8mb4_polish_ci, przycisk Utwórz. Nazwa bazy jest w arkuszu i zwykle brzmi egzamin, ale w arkuszu o portalu dla wędkarzy baza nazywała się wedkowanie, więc nazwy nie zgaduje się z pamięci. Instalację pakietu i sam panel opisuje lekcja o XAMPP i phpMyAdmin. Import pliku .sql i zrzut import.jpg
Plik z tabelami leży w rozpakowanym archiwum. Kolejność klikania jest stała:
1.
Kliknij nazwę nowej bazy na liście po lewej, żeby była wybrana.
2.
Zakładka Import, przycisk wyboru pliku, wskaż plik .sql.
3.
Kodowanie utf-8, format SQL, przycisk Wykonaj na dole strony.
4.
Sprawdź listę tabel po lewej i liczbę wierszy w każdej z nich.
Import zrobiony bez zaznaczonej bazy to najczęstsza pomyłka tego kroku: tabele powstają poza bazą albo operacja kończy się błędem, a skrypt PHP nie znajduje później danych. Szczegóły importu i eksportu są w lekcji o skryptach SQL. Zrzut ekranu robi się dopiero po sprawdzeniu tabel. Arkusz żąda pliku import.jpg i wymaga, żeby było na nim widać CAŁY ekran razem z paskiem zadań, więc służy do tego klawisz PrtScr i wklejenie obrazu do edytora grafiki, a nie Alt+PrtScr, który kopiuje samo aktywne okno. Plik zapisuje się w folderze PESEL w formacie JPG. Zrzut zapisany jako PNG i przemianowany na .jpg nadal jest plikiem PNG.
Cztery kwerendy i tabele, na których stoją
Arkusz podaje cztery polecenia po polsku, a zdający zamienia je na SQL. Przykłady poniżej stoją na dwóch tabelach w relacji: wycieczka z kolumnami id, nazwa, cena i id_kraju oraz kraj z kolumnami id i nazwa. Klucz obcy id_kraju wskazuje na kraj.id i to jest cała relacja, o którą pyta jedna z kwerend. Nazwy w arkuszu będą inne, kształt zapytania ten sam.
Dwie pierwsze kwerendy to zwykle SELECT (WYBIERZ): jedna wypisuje całą tabelę, druga zawęża ją warunkiem.
SELECT * FROM wycieczka;
SELECT * FROM wycieczka WHERE cena < 2000;
Gwiazdka pasuje tylko tam, gdzie arkusz mówi o wszystkich danych albo wszystkich kolumnach. Polecenie „wypisz nazwę i cenę" znaczy dwie kolumny w podanej kolejności, więc SELECT * dałby w tym miejscu inny wynik niż zamówiony. Operatory warunku, LIKE, BETWEEN i sortowanie opisuje lekcja o zapytaniu SELECT. Kolejna kwerenda „wykorzystuje relację między tabelami", czyli bierze dane z dwóch tabel naraz. Dwa zapisy dają ten sam wynik.
SELECT wycieczka.nazwa, kraj.nazwa
FROM wycieczka
INNER JOIN kraj ON wycieczka.id_kraju = kraj.id;
SELECT wycieczka.nazwa, kraj.nazwa
FROM wycieczka, kraj
WHERE wycieczka.id_kraju = kraj.id;
Pierwszy używa INNER JOIN (ZŁĄCZENIE WEWNĘTRZNE), drugi wymienia obie tabele po FROM i wiąże je warunkiem. Warunek złączenia musi być, bo bez niego wychodzi iloczyn kartezjański, czyli każdy wiersz z każdym. Kolumna o tej samej nazwie w obu tabelach wymaga przedrostka z nazwą tabeli, inaczej serwer zgłosi, że nazwa jest niejednoznaczna. Rodzaje złączeń są w lekcji o złączeniach JOIN. Zamiast jednego z zapytań arkusz bywa, że pyta o liczbę, sumę albo średnią, czyli o funkcję agregującą.
SELECT COUNT(*) FROM wycieczka WHERE id_kraju = 3;
Takie zapytanie zwraca jeden wiersz z jedną liczbą. Pozostałe funkcje, SUM, AVG, MIN i MAX, oraz grupowanie opisuje lekcja o funkcjach agregujących. Kwerenda, która zmienia dane albo strukturę
Ostatnia kwerenda zwykle nic nie wypisuje, tylko zmienia bazę. W arkuszu o biurze turystycznym był to UPDATE (AKTUALIZUJ) podnoszący cenę o 10 procent.
UPDATE wycieczka SET cena = cena * 1.1;
Podwyżka o 10 procent to mnożenie przez 1.1, nie dodanie dziesięciu i nie mnożenie przez 0.1. Gdy arkusz ogranicza zmianę do części wierszy, dochodzi WHERE z warunkiem. Gdy nie ogranicza, warunku nie ma i zmieniają się wszystkie wiersze. Pominięty WHERE tam, gdzie arkusz go wymagał, psuje dane w całej tabeli i import trzeba powtórzyć od zera. Składnia jest w lekcji o INSERT, UPDATE i DELETE. W arkuszu o portalu dla wędkarzy ostatnie polecenie dokładało kolumnę i mówiło o niej tyle, że ma przyjmować „jedynie liczby z przedziału <0, 255>". Dobór typu jest tu częścią zadania.
ALTER TABLE wycieczka ADD ocena TINYINT UNSIGNED;
Typ
Zakres wartości
Kiedy z arkusza
TINYINT
-128 do 127
mała liczba, także ujemna
TINYINT UNSIGNED
0 do 255
liczby z przedziału od 0 do 255
SMALLINT UNSIGNED
0 do 65535
rok, licznik odwiedzin
INT
około -2,1 do 2,1 miliarda
klucz główny, duże liczby
DECIMAL(6,2)
liczba z dwoma miejscami po przecinku
cena, kwota
VARCHAR(30)
tekst do 30 znaków
nazwa, imię
DATE
data w postaci RRRR-MM-DD
termin, data urodzenia
UNSIGNED (BEZ ZNAKU) odbiera typowi wartości ujemne i przesuwa górny koniec zakresu, dlatego sam TINYINT sięga 127, a TINYINT UNSIGNED sięga 255. Do ceny nie używa się typu FLOAT, bo liczy on przybliżeniami. Typy kolumn zbiera lekcja o CREATE, ALTER i DROP. Zapis wyników: kwerendy.txt i zrzuty kw1.png do kw4.png
Kwerendy wykonuje się po jednej w zakładce SQL w phpMyAdmin i po każdej robi zrzut ekranu. Numeracja plików idzie za numeracją poleceń w arkuszu: pierwsze polecenie to kw1.png, drugie kw2.png, i tak do kw4.png. Na zrzucie ma być widać treść zapytania oraz to, co odpowiedział serwer.
SELECT odpowiada tabelą wyników, więc zrzut obejmuje okno z wynikiem. UPDATE i ALTER TABLE nie zwracają wierszy, tylko komunikat w rodzaju „zmodyfikowano 12 wierszy" wraz z czasem wykonania, i ten komunikat jest dowodem wykonania polecenia. Brak tabeli wyników po UPDATE nie znaczy, że kwerenda się nie udała.
Plik kwerendy.txt to zwykły plik tekstowy w folderze PESEL: po jednej kwerendzie w linii, każda zakończona średnikiem, w kolejności poleceń z arkusza.
SELECT * FROM wycieczka;
SELECT * FROM wycieczka WHERE cena < 2000;
SELECT wycieczka.nazwa, kraj.nazwa FROM wycieczka INNER JOIN kraj ON wycieczka.id_kraju = kraj.id;
UPDATE wycieczka SET cena = cena * 1.1;
Zapisuje się go w Notatniku w kodowaniu UTF-8, żeby polskie znaki z warunków nie zamieniły się w krzaki. Wygodniejsza kolejność pracy jest taka: najpierw kwerenda w pliku, potem wklejenie jej do phpMyAdmin, bo plik zostaje nawet wtedy, gdy przeglądarka albo panel się zamknie. Wszystkie cztery kształty da się przećwiczyć wcześniej w placu zabaw SQL w przeglądarce, bez stawiania XAMPP. Gdzie traci się punkty
›
Baza założona pod inną nazwą niż podana w arkuszu. Skrypt PHP łączy się z nazwą z arkusza, więc ta pomyłka przewraca także ostatni rezultat.
›
Import wykonany bez zaznaczonej bazy: tabele powstają w złym miejscu albo wcale.
›
import.jpg obejmujący samo okno przeglądarki, podczas gdy arkusz żąda całego ekranu z paskiem zadań.
›
Zrzut zapisany w innym formacie, niż mówi nazwa: PNG przemianowany na import.jpg albo JPG nazwany kw1.png.
›
SELECT * tam, gdzie arkusz wymienia konkretne kolumny, oraz wybrane kolumny tam, gdzie arkusz prosi o wszystkie dane.
›
Kwerenda na dwóch tabelach napisana bez warunku łączącego: wynik to iloczyn kartezjański.
›
UPDATE bez WHERE przy poleceniu ograniczonym do części wierszy oraz WHERE dopisany tam, gdzie arkusz każe zmienić wszystkie wiersze.
›
Podwyżka o 10 procent zapisana jako dodanie dziesięciu zamiast mnożenia przez 1.1.
›
Typ nowej kolumny dobrany na oko, na przykład INT przy przedziale od 0 do 255.
›
Kwerendy w kwerendy.txt bez średników, w innej kolejności niż polecenia albo zapisane w pliku edytora tekstu zamiast w zwykłym pliku tekstowym.
›
Pliki zostawione na pulpicie zamiast w folderze o nazwie PESEL. Poza tym folderem nie trafiają na płytę i nie podlegają ocenie.
Ściąga
Krok
Co zrobić
Plik do folderu PESEL
1
XAMPP Control Panel: Start dla Apache i MySQL
brak
2
http://localhost/phpmyadmin, konto root, hasło puste
brak
3
Nowa baza o nazwie z arkusza (zwykle egzamin), utf8mb4_polish_ci
brak
4
Zaznacz bazę, zakładka Import, plik .sql, kodowanie utf-8, Wykonaj
brak
5
Sprawdź tabele i wiersze, zrzut całego ekranu z paskiem zadań
import.jpg
6
Kwerenda: SELECT * FROM tabela;
kw1.png
7
Kwerenda: SELECT z warunkiem WHERE
kw2.png
8
Kwerenda: dwie tabele złączone po kluczu obcym
kw3.png
9
Kwerenda: UPDATE albo ALTER TABLE ... ADD z dobranym typem
kw4.png
10
Cztery kwerendy, po jednej w linii, każda ze średnikiem
kwerendy.txt
Pobierz ściągę PDF