Wyniki egzaminu

Informacje o egzaminie:
  • Zawód: Technik informatyk
  • Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych
  • Data rozpoczęcia: 12 czerwca 2026 11:22
  • Data zakończenia: 12 czerwca 2026 11:48

Egzamin zdany!

Wynik: 32/40 punktów (80,0%)

Wymagane minimum: 20 punktów (50%)

Pochwal się swoim wynikiem!
Szczegółowe wyniki:
Pytanie 1

Jaką wartość uzyska zmienna x po wykonaniu kodu PHP zaprezentowanego w ramce?

Ilustracja do pytania
A. Ilość wierszy dodanych do tabeli produkty
B. Ilość wierszy w bazie danych
C. Ilość wierszy przetworzonych przez zapytanie DELETE FROM
D. Ilość wierszy w tabeli produkty, gdzie pole status jest większe od zera
W przedstawionym kodzie PHP funkcja mysqli_affected_rows() jest używana do uzyskania liczby wierszy zmienionych przez ostatnie zapytanie MySQL. W tym przypadku zapytanie DELETE FROM produkty WHERE status < 0 próbuje usunąć wszystkie rekordy z tabeli produkty, których pole status ma wartość mniejszą od zera. Po wykonaniu tego zapytania funkcja mysqli_affected_rows($db) zwróci liczbę wierszy, które zostały rzeczywiście usunięte. To jest szczególnie przydatne w kontekście sprawdzania wpływu operacji na bazę danych i pozwala na dynamiczne podejmowanie decyzji w aplikacjach bazodanowych. Przykładowo, jeśli po usunięciu chcemy wykonać dodatkowe operacje tylko wtedy, gdy co najmniej jeden rekord został usunięty, możemy użyć tej funkcji. Zgodnie z dobrymi praktykami, korzystanie z mysqli_affected_rows() jest standardem, gdyż pozwala również na obsługę wyjątków i błędów bazy danych. Optymalizacja operacji DELETE poprzez precyzyjne filtrowanie w WHERE, jak w naszym przykładzie, jest kluczowa dla zachowania wydajności bazy danych szczególnie w dużych systemach produkcyjnych.

Pytanie 2

Jaką wartość zwróci zapytanie z ramki wykonane na pokazanej tabeli?

SELECT COUNT(DISTINCT wykonawca) FROM muzyka;
Ilustracja do pytania
A. 0
B. 1
C. 3
D. 4
Zapytanie SQL SELECT COUNTDISTINCT wykonawca) FROM muzyka; ma na celu zliczenie unikalnych wartości w kolumnie wykonawca tabeli muzyka. W tym przypadku w tabeli są trzy różne wartości w tej kolumnie: Czesław Niemen Stan Borys i Mikołaj Czechowski. Funkcja COUNTDISTINCT zwraca liczbę niepowtarzających się wykonawców co w tym zestawie danych daje wynik 3. Zrozumienie użycia funkcji COUNTDISTINCT jest kluczowe w analizie danych szczególnie gdy chcemy określić liczebność unikalnych elementów w dużych zbiorach danych. To podejście jest szeroko stosowane w raportowaniu i analizach biznesowych gdzie istotne jest zidentyfikowanie niepowtarzalnych wpisów na przykład liczby unikalnych klientów czy produktów w sklepie. Dobre praktyki w SQL obejmują używanie aliasów w celu zwiększenia czytelności zapytań oraz optymalizację wydajności przez właściwe indeksowanie kolumn które są często wykorzystywane w funkcjach zliczających.

Pytanie 3

Do czego służy polecenie DROP w SQL?

A. do usunięcia istniejącego obiektu (np. tabeli)
B. do zmiany parametrów obiektu
C. do aktualizacji danych obiektu
D. do dodania nowego obiektu
Polecenie DROP usuwa istniejący obiekt bazy - np. DROP TABLE kasuje tabelę, DROP DATABASE bazę, DROP VIEW widok. Działa na poziomie struktury (DDL). Dlatego DROP służy do usunięcia istniejącego obiektu.

Pytanie 4

Wskaż polecenie SQL, które dodaje kolumnę miesiacSiewu do już istniejącej tabeli rośliny

A. UPDATE rosliny ADD miesiacSiewu int
B. CREATE TABLE rosliny {miesiacSiewu int}
C. ALTER TABLE rosliny ADD miesiacSiewu int
D. INSERT INTO rosliny Values (miesiacSiewu int)
Polecenie SQL 'ALTER TABLE rosliny ADD miesiacSiewu int;' to całkiem sensowny sposób na dodanie nowej kolumny do tabeli w bazie danych. Gdy chcemy coś zmieniać w tabeli, to 'ALTER TABLE' jest tym, czego szukamy, bo pozwala nam modyfikować tabelę bez jej usuwania. Dodając kolumnę 'miesiacSiewu', przechowamy dane typu całkowitego (int), co idealnie pasuje do wartości miesięcy. Dzięki temu poleceniu możemy łatwo dostosować strukturę bazy do potrzeb aplikacji. Po jego wykonaniu, w każdej chwili można już wrzucać dane do nowej kolumny. To by się na pewno przydało przy analizie danych dotyczących upraw. W SQL to w sumie standard, więc działa w większości systemów jak MySQL czy PostgreSQL.

Pytanie 5

Na czym polega operacja selekcji w algebrze relacji?

A. na usunięciu pustych wierszy
B. na wyborze krotek spełniających określone warunki
C. na wyborze krotek bez wartości NULL
D. na usunięciu krotek z powtarzającymi się polami
Selekcja w algebrze relacji to operacja wyboru tych KROTEK (wierszy), które spełniają zadany warunek - jej odpowiednikiem w SQL jest klauzula WHERE. Z całej relacji zostają więc tylko rekordy pasujące do kryterium (np. pracownicy z pensją powyżej 5000). Dlatego selekcja to wybór krotek spełniających warunek.

Pytanie 6

Rozważ tabelę pracownicy. Jakie jest polecenie MySQL, które usuwa wszystkie wpisy z tabeli, gdzie pole rodzaj_umowy jest puste?

A. DROP pracownicy FROM rodzaj_umowy = 0
B. DROP pracownicy WHERE rodzaj_umowy IS NULL
C. DELETE pracownicy WHERE rodzaj_umowy ='brak'
D. DELETE FROM pracownicy WHERE rodzaj_umowy IS NULL
Aby usunąć wszystkie rekordy z tabeli pracownicy, dla których pole rodzaj_umowy pozostaje puste, czyli ma wartość NULL, używamy polecenia DELETE FROM pracownicy WHERE rodzaj_umowy IS NULL. Klauzula DELETE FROM jest standardowym poleceniem SQL, które służy do usuwania danych z bazy danych. W tym przypadku warunek IS NULL jest kluczowy, ponieważ wskazuje, że chcemy usunąć jedynie te rekordy, w których pole rodzaj_umowy nie zawiera żadnej wartości. Warto zauważyć, że NULL w SQL oznacza brak wartości, co różni się od innych typów wartości, jak na przykład 0 czy pusty ciąg tekstowy. Przykład praktyczny użycia tego polecenia: jeśli w tabeli mamy pracowników z różnymi rodzajami umowy, w tym także takich, którzy nie mają przypisanego rodzaju, to powyższe polecenie usunie ich z bazy danych. Tego rodzaju operacje są niezwykle ważne w kontekście utrzymania bazy danych, gdyż pozwalają na eliminację nieaktualnych lub niekompletnych danych, co w efekcie prowadzi do poprawy jakości przechowywanych informacji i ułatwia późniejsze zapytania do bazy. Takie podejście jest zgodne z dobrymi praktykami w zakresie zarządzania danymi i normami ANSI SQL.

Pytanie 7

Z jaką bazą danych nawiązuje połączenie funkcja pg_connect w PHP?

A. MySQL
B. MS SQL
C. PostgreSQL
D. MS Access
Pozostałe bazy mają inne funkcje łączące. MySQL obsługuje mysqli_connect(), MS SQL Server - funkcje sqlsrv_, a do MS Access łączy się zwykle przez ODBC/PDO. Prefiks pg_ jednoznacznie wskazuje PostgreSQL.

Pytanie 8

Z jakim problemem wiąże się poziom izolacji transakcji Repeatable Read (powtarzalny odczyt)?

A. z odczytami widmowymi (phantom reads)
B. z utratą aktualizacji
C. z brudnymi odczytami
D. z niepowtarzalnymi odczytami
Poziom izolacji Repeatable Read gwarantuje, że te same wiersze odczytane w transakcji nie zmienią się - ale wciąż dopuszcza ODCZYTY WIDMOWE (phantom reads): gdy inna transakcja DODA nowe wiersze pasujące do warunku, powtórne zapytanie może zwrócić ich więcej. Zapamiętaj: Repeatable Read blokuje zmiany istniejących wierszy, lecz nie pojawianie się nowych (widm).

Pytanie 9

W języku PHP przeprowadzono operację zaprezentowaną w ramce. Jak można wyświetlić wszystkie rezultaty tego zapytania?

Ilustracja do pytania
A. pokazać zmienną $db
B. użyć polecenia mysql_fetch
C. zastosować pętlę z poleceniem mysqli_fetch_row
D. zaindeksować zmienną tab, gdzie tab[0] to pierwsze imię
Zastosowanie pętli z poleceniem mysqli_fetch_row jest poprawnym rozwiązaniem dla wyświetlenia wyników zapytania w języku PHP. Funkcja mysqli_fetch_row zwraca kolejny wiersz wynikowy jako tablicę liczbową przy każdym wywołaniu. Oznacza to, że aby przetworzyć wszystkie wiersze wyników, należy zastosować pętlę while bądź for, która będzie kontynuować do momentu zwrócenia ostatniego wiersza. Przykładowy kod może wyglądać następująco while ($row = mysqli_fetch_row($tab)) { echo $row[0]; } gdzie $tab to wynik zapytania mysqli_query. Takie podejście pozwala na iteracyjne przetwarzanie każdego wiersza i jest zgodne z branżowymi standardami dotyczącymi pracy z bazami danych w PHP. Dodatkowo mysqli_fetch_row jest bardziej efektywny w przypadku dużych zbiorów danych, ograniczając zużycie pamięci. Jest to zgodne z dobrymi praktykami dotyczącymi przetwarzania dużych zbiorów danych, gdzie operacje powinny być jak najbardziej zoptymalizowane i pamięciooszczędne co ma kluczowe znaczenie w aplikacjach internetowych z dużym obciążeniem.

Pytanie 10

Czym jest relacja w bazach danych?

A. logicznym połączeniem tabel
B. kluczem głównym w relacji tabel
C. algebraicznym połączeniem tabel
D. połączeniem dwóch pól w obrębie jednej tabeli
Relacja w bazach danych to logiczne połączenie tabel, które umożliwia organizację i zarządzanie danymi w sposób umożliwiający ich efektywne przetwarzanie. W kontekście baz danych relacyjnych, relacje tworzone są na podstawie kluczy, które pozwalają na łączenie danych z różnych tabel. Na przykład, w bazie danych e-commerce, tabela 'Klienci' może być połączona z tabelą 'Zamówienia' przez klucz klienta. Dzięki temu, gdy zapytamy o zamówienia konkretnego klienta, silnik bazy danych może wykonać zapytanie łączące te obie tabele, dostarczając spójny zestaw danych. Taki model relacyjny oparty jest na teorii zbiorów i algebrze relacyjnej, co pozwala na skomplikowane operacje, takie jak łączenie, filtrowanie i agregowanie danych. W praktyce, relacje w bazach danych są kluczowe dla zapewnienia integralności danych, eliminacji redundancji oraz zwiększenia wydajności operacji na danych. Standardy takie jak SQL oparte są na tych koncepcjach, co czyni je fundamentalnymi w programowaniu baz danych.

Pytanie 11

Co PRZYSPIESZA wyszukiwanie danych, ale może spowolnić operacje zapisu (INSERT/UPDATE)?

A. reguły
B. indeksy
C. wartości domyślne
D. klucze podstawowe
Pozostałe elementy nie mają takiego kompromisu. Reguły i wartości domyślne dotyczą poprawności i wypełniania danych, a klucze podstawowe identyfikują rekordy (same w sobie nie są mechanizmem przyspieszania wyszukiwań po dowolnych polach). Przyspieszają odczyt kosztem zapisu indeksy.

Pytanie 12

W zapytaniu SQL, umieszczonym w ramce, symbol gwiazdki wskazuje, że w wyniku tego zapytania

Ilustracja do pytania
A. zostanie pominięty warunek dotyczący imienia
B. zostanie pokazane pole o nazwie "*" (gwiazdka)
C. zostaną wyświetlone wszystkie wpisy z tabeli mieszkańcy
D. zostaną wyświetlone wszystkie kolumny tabeli mieszkańcy
W zapytaniach SQL użycie znaku gwiazdki (*) po klauzuli SELECT jest częstą praktyką, która wskazuje na potrzebę wyświetlenia wszystkich kolumn z tabeli wynikowej. W kontekście zapytania SELECT * FROM mieszkańcy WHERE imie = 'Anna'; oznacza to, że zostaną zwrócone wszystkie kolumny dla rekordów, które spełniają warunek imie='Anna'. Jest to szybki sposób na uzyskanie pełnych danych dla określonych kryteriów bez konieczności wyszczególniania nazw kolumn, co może być szczególnie przydatne w przypadku tabel o dużej liczbie kolumn. Ważnym aspektem jest tutaj optymalizacja zapytań; choć użycie * jest wygodne, w dużych zbiorach danych lepiej jest selekcjonować tylko te kolumny, które są rzeczywiście potrzebne do analizy, co zmniejsza obciążenie bazy danych i poprawia wydajność. W praktykach branżowych zaleca się również zwracanie uwagi na bezpieczeństwo danych i dostępność użytkowników do informacji, szczególnie w kontekście RODO i innych regulacji dotyczących ochrony danych osobowych.

Pytanie 13

Tabela psy ma pola imie, rasa, telefon_wlasciciela, rok_szczepienia. Która kwerenda zwróci telefony właścicieli psów szczepionych PRZED 2015?

A.
SELECT psy FROM rok_szczepienia < 2015;
B.
SELECT imie, rasa FROM psy WHERE rok_szczepienia > 2015;
C.
SELECT telefon_wlasciciela FROM psy WHERE rok_szczepienia < 2015;
D.
SELECT telefon_wlasciciela FROM psy WHERE rok_szczepienia > 2015;
Po SELECT wymienia się kolumny do POBRANIA, a w WHERE warunek wyboru wierszy. Chcemy telefony psów szczepionych przed 2015, więc bierzemy kolumnę telefon_wlasciciela i warunek rok_szczepienia < 2015: SELECT telefon_wlasciciela FROM psy WHERE rok_szczepienia < 2015;. Dlatego ta kwerenda jest poprawna.

Pytanie 14

Aby usunąć z istniejącej tabeli pojedynczą kolumnę, należy użyć polecenia:

A.
DELETE COLUMN
B.
DROP TABLE
C.
ALTER TABLE ... DROP COLUMN
D.
REMOVE COLUMN
Strukturę istniejącej tabeli zmienia ALTER TABLE. Aby usunąć kolumnę, stosuje się je z klauzulą DROP COLUMN, np. ALTER TABLE klienci DROP COLUMN telefon. Znika wtedy kolumna wraz z jej danymi, a reszta tabeli zostaje. Dlatego do usunięcia pojedynczej kolumny służy ALTER TABLE ... DROP COLUMN.

Pytanie 15

W SQL, aby zmienić dane w tabeli, wykorzystuje się instrukcję

A. CREATE
B. UPDATE
C. SELECT
D. JOIN
Odpowiedź 'UPDATE' jest poprawna, ponieważ w języku SQL polecenie to służy do modyfikacji danych w istniejących rekordach tabeli. Umożliwia aktualizację wartości w jednym lub więcej polach w wybranych wierszach, których identyfikacja może być dokonana poprzez zastosowanie klauzuli WHERE. Na przykład, aby zaktualizować nazwisko użytkownika w tabeli 'Użytkownicy', można użyć polecenia: 'UPDATE Użytkownicy SET nazwisko = 'NoweNazwisko' WHERE id = 1;'. Dobrą praktyką jest zawsze uwzględnienie klauzuli WHERE, aby uniknąć przypadkowego zaktualizowania wszystkich rekordów w tabeli. Polecenie UPDATE jest częścią standardu SQL i szeroko stosowane w codziennej pracy z bazami danych, co czyni je kluczowym narzędziem w zarządzaniu danymi. Warto również pamiętać, że przed wykonaniem aktualizacji zaleca się wykonanie kopii zapasowej danych, aby zabezpieczyć się przed niezamierzonymi zmianami.

Pytanie 16

Aby w wyniku zapytania wyeliminować powtarzające się wiersze, należy użyć klauzuli

A.
LIMIT
B.
UNIQUE
C.
DISTINCT
D.
ORDER BY
Najczęstsze pomyłki w tym pytaniu biorą się z mylenia ról poszczególnych słów kluczowych. LIMIT jedynie ogranicza liczbę zwróconych wierszy (np. pierwszych dziesięć) i w ogóle nie sprawdza, czy się powtarzają, więc duplikaty nadal mogą trafić do wyniku. ORDER BY ustawia wiersze w określonej kolejności; powtórzenia po posortowaniu znajdą się obok siebie, ale wciąż tam będą - sortowanie ich nie kasuje. UNIQUE bywa kojarzone ze słowem „unikalny”, jednak to ograniczenie integralności (więz lub indeks) zakładane na kolumnę przy projektowaniu tabeli, a nie klauzula używana w zapytaniu SELECT. Do usunięcia powtarzających się wierszy z wyniku służy wyłącznie DISTINCT, która porównuje wiersze i zostawia tylko unikalne.

Pytanie 17

Do czego stosuje się zapytanie z klauzulą JOIN?

A. do wywołania funkcji agregującej
B. do zdefiniowania klucza obcego
C. do uzyskania wyniku z jednej tabeli
D. do uzyskania danych z dwóch powiązanych tabel
Klauzula JOIN łączy wiersze z DWÓCH (lub więcej) powiązanych tabel na podstawie wspólnego warunku (zwykle klucz obcy = klucz główny), zwracając dane z obu naraz. Dlatego JOIN służy do uzyskania danych z powiązanych tabel.

Pytanie 18

W systemie baz danych sklepu znajdują się dwie tabele powiązane ze sobą relacją: produkty oraz oceny. Tabela oceny zawiera dowolną liczbę ocen wystawionych przez klientów dla konkretnego produktu, które są zdefiniowane przez pola: id, ocena (pole numeryczne), produktID (klucz obcy). Aby uzyskać maksymalną ocenę dla produktu o ID równym 10, należy użyć zapytania

A. MAX SELECT ocena FROM oceny WHERE produktID = 10;
B. SELECT MAX(ocena) FROM oceny WHERE produktID = 10;
C. COUNT MAX SELECT ocena FROM oceny WHERE produktID = 10;
D. SELECT MAX COUNT(ocena) FROM oceny WHERE produktID = 10;
Odpowiedź "SELECT MAX(ocena) FROM oceny WHERE produktID = 10;" jest prawidłowa, ponieważ wykorzystuje odpowiednią składnię SQL do uzyskania maksymalnej wartości z kolumny "ocena" dla produktu o określonym ID. Funkcja agregująca MAX() umożliwia znalezienie najwyższej oceny w zbiorze danych spełniających określone kryteria. W tym przypadku, zapytanie przeszukuje tabelę "oceny" i filtruje wyniki na podstawie "produktID" równym 10. Takie podejście jest zgodne z najlepszymi praktykami w obszarze SQL, ponieważ zapewnia prostotę i efektywność. W praktycznym zastosowaniu, w momencie gdy mamy do czynienia z dużymi zbiorami danych, takie zapytanie pozwala na szybkie uzyskanie potrzebnych informacji, co jest kluczowe dla analizy wydajności produktów w sklepie. Używanie funkcji agregujących, takich jak MAX(), jest standardem w relacyjnych bazach danych, co czyni to podejście odpowiednim w kontekście zarządzania danymi.

Pytanie 19

W SQL uprawnienie SELECT przydzielone za pomocą polecenia GRANT umożliwia użytkownikowi bazy danych

A. zmienianie danych w tabeli
B. generowanie tabeli
C. uzyskiwanie danych z tabeli
D. usuwanie danych z tabeli
Wybór odpowiedzi sugerujących modyfikowanie danych, tworzenie tabeli czy usuwanie danych z tabeli wskazuje na niepełne zrozumienie podstawowych przywilejów w SQL. Przywilej SELECT jest ściśle związany z dostępem do danych, co oznacza, że jego rola ogranicza się do umożliwienia użytkownikowi odczytu informacji, a nie ich modyfikowania. Modyfikowanie danych w tabeli zarezerwowane jest dla przywileju UPDATE, który pozwala na zmianę istniejących danych. Tworzenie tabeli wiąże się z przywilejem CREATE, który z kolei umożliwia użytkownikom dodawanie nowych struktur danych do bazy. Z kolei usunięcie danych z tabeli realizowane jest przez przywilej DELETE, pozwalający na eliminowanie zapisów z bazy. Te różnice są fundamentalne dla zrozumienia zarządzania dostępem w systemach baz danych. Typowe błędy w myśleniu o uprawnieniach mogą prowadzić do nieprawidłowego zarządzania danymi i naruszeń bezpieczeństwa. Użytkownicy muszą mieć jasną świadomość, że każdy przywilej w SQL ma swoje specyficzne zastosowanie, a nieprawidłowe przypisanie uprawnień może prowadzić do nieautoryzowanego dostępu lub utraty danych. Właściwe zrozumienie hierarchii i ról przywilejów jest kluczowe dla efektywnego i bezpiecznego zarządzania bazami danych.

Pytanie 20

Integralność referencyjna w relacyjnych bazach danych oznacza, że

A. każdemu kluczowi głównemu przyporządkowany jest dokładnie jeden klucz obcy w powiązanych tabelach
B. wartość klucza głównego oraz klucza obcego nie może być pusta
C. klucz główny lub klucz obcy nie mogą zawierać wartości NULL
D. wartość klucza obcego w danej tabeli musi być albo równa wartości klucza głównego w związanej z nią tabeli albo równa wartości NULL
Wybór odpowiedzi sugerujących, że każdemu kluczowi głównemu odpowiada dokładnie jeden klucz obcy w tabeli lub tabelach powiązanych, jest błędny. W rzeczywistości, jeden klucz główny może być powiązany z wieloma kluczami obcymi w różnych rekordach. Na przykład, w bazie danych dotyczącej zamówień, klucz główny tabeli 'Klienci' może być referencjonowany przez wiele rekordów w tabeli 'Zamówienia', co oznacza, że ten sam klient może mieć wiele zamówień. Odpowiedzi sugerujące, że klucz główny lub klucz obcy nie zawierają wartości NULL, są również mylące. W praktyce, klucze obce mogą zawierać wartość NULL, co oznacza, że dany rekord nie musi mieć przypisanego odniesienia do innej tabeli. Przykładem mogą być zamówienia, które nie są jeszcze przypisane do żadnego klienta – w takim wypadku wartość klucza obcego (KlientID) może być NULL. Te nieprawidłowe odpowiedzi prowadzą do błędnych wniosków, które mogą wpłynąć na projektowanie baz danych oraz ich funkcjonalność. Zrozumienie, że klucze obce mogą być NULL oraz że jeden klucz główny może być powiązany z wieloma kluczami obcymi, jest kluczowe dla prawidłowego modelowania danych i zapewnienia spójności w bazach danych.

Pytanie 21

W SQL klauzula DISTINCT w poleceniu SELECT spowoduje, że otrzymane dane

A. będą zgrupowane według wskazanego pola
B. będą spełniały dany warunek
C. nie będą zawierały powtórzeń
D. zostaną uporządkowane
Niepoprawne odpowiedzi na to pytanie często wynikają z nieporozumienia dotyczącego podstawowych funkcji, jakimi dysponuje SQL. Klauzula DISTINCT ma jedynie na celu usunięcie duplikatów z wyników zapytania, co oznacza, że powinna być używana jedynie w kontekście potrzeby uzyskania unikalnych wartości. Odpowiedzi sugerujące, że DISTINCT grupuje dane, są mylące, ponieważ do grupowania danych służy klauzula GROUP BY, która nie tylko wydziela unikalne rekordy, ale także umożliwia ich agregację i analizę pod kątem określonych kryteriów. Twierdzenie, że DISTINCT sortuje dane, również jest błędne, ponieważ sortowanie osiąga się za pomocą klauzuli ORDER BY, która porządkuje wyniki według zadanych kryteriów. W przypadku stwierdzenia, że DISTINCT spełnia określony warunek, należy zrozumieć, że to nie jest jego funkcja; zamiast tego warunki w zapytaniach SQL wprowadza się za pomocą klauzuli WHERE. W praktyce, zrozumienie właściwego zastosowania DISTINCT jest kluczowe dla efektywnego korzystania z SQL, ponieważ niewłaściwe użycie może prowadzić do nieodpowiednich wyników i nieefektywności w zapytaniach. Dlatego ważne jest, aby pamiętać o różnicach między tymi klauzulami i umieć odpowiednio je stosować w kontekście zapytań, aby uzyskać pożądane rezultaty.

Pytanie 22

W podanym kodzie PHP, w miejscu kropek należy umieścić odpowiednią instrukcję

$zapytanie = mysqli_query($db, "SELECT imie, nazwisko FROM uzytkownik");
while ($wiersz = ...................)
    echo "$wiersz[0] $wiersz[1]";
A. mysqli_query($zapytanie)
B. mysqli_fetch_array($zapytanie)
C. mysqli_free_result($zapytanie)
D. mysqli_num_fields($zapytanie)
Funkcja mysqli_fetch_array($zapytanie) jest używana do pobierania wyników zapytania SQL w formie tablicy asocjacyjnej lub indeksowanej. W kontekście podanego kodu, po wykonaniu zapytania SELECT do bazy danych, wyniki są zwracane jako zasób, który musi być przetworzony. Mysqli_fetch_array pozwala na iteracyjne przetwarzanie każdego wiersza z zestawu wyników, co umożliwia dostęp do poszczególnych wartości pól za pomocą indeksów lub kluczy. Jest to przydatne w sytuacjach, gdzie dane muszą być wyświetlane lub przetwarzane w pętli, jak w przykładowym kodzie. Tablica zwracana przez mysqli_fetch_array może zawierać pola zarówno z indeksami numerycznymi, jak i nazwami kolumn, co daje elastyczność w dostępie do danych. Zgodnie z dobrymi praktykami programistycznymi, zawsze należy sprawdzić, czy zapytanie zostało wykonane poprawnie, zanim zacznie się przetwarzać jego wyniki, oraz zwolnić pamięć po zakończeniu przetwarzania wyników. Stosowanie odpowiednich mechanizmów obsługi błędów i zabezpieczeń, takich jak przygotowane zapytania, jest również kluczowe dla bezpieczeństwa aplikacji.

Pytanie 23

Przedstawiona jest tabela pracownicy, w której umieszczono rekordy widoczne obok. Jaką wartość zwróci wykonanie umieszczonej w ramce kwerendy SQL?

SELECT MAX(pensja) FROM pracownicy WHERE pensja < 3000;
idimienazwiskopensja
1AnnaKowalska3400
2MonikaNowak1300
3EwelinaNowakowska2600
4AnnaPrzybylska4600
5MariaKowal2200
6EwaNowacka5400
A. 1300
B. 5400
C. 2600
D. 2200
Kwerenda SQL SELECT MAX(pensja) FROM pracownicy WHERE pensja < 3000; służy do znalezienia maksymalnej wartości w kolumnie pensja z rekordów spełniających warunek pensja mniejsza niż 3000. Przeszukując tabelę pracownicy widzimy że wartości spełniające ten warunek to 1300 2600 i 2200. Najwyższą z tych wartości jest 2600 co czyni tę odpowiedź poprawną. Zrozumienie tego typu kwerend SQL jest kluczowe w pracy z bazami danych ponieważ pozwala na wyciąganie konkretnych informacji z dużych zbiorów danych. W praktyce takie zapytania mogą być używane do analizowania danych pracowniczych w firmach gdzie na przykład chcemy zidentyfikować pracowników z wynagrodzeniem poniżej określonego progu. Jest to zgodne z dobrymi praktykami w branży gdzie używa się agregacji danych do celów analitycznych. Zrozumienie jak działa funkcja MAX() w połączeniu z klauzulą WHERE umożliwia efektywne filtrowanie i przetwarzanie danych co jest niezbędne w wielu aplikacjach biznesowych.

Pytanie 24

W jaki sposób będzie uporządkowana lista stworzona z wszystkich kolumn tabeli uczniowie, obejmująca uczniów o średniej wyższej niż 5, która zostanie zwrócona jako rezultat przedstawionego zapytania?

SELECT *
FROM uczniowie
WHERE srednia > 5
ORDER BY klasa DESC;
A. Malejąco według parametru klasa
B. Malejąco według parametru srednia
C. Rosnaco według parametru srednia
D. Rosnąca według parametru klasa
Zapytanie SQL używa klauzuli ORDER BY klasa DESC co oznacza że wyniki będą posortowane malejąco według kolumny klasa Klauzula ORDER BY jest używana w języku SQL do sortowania wyników zapytania Użycie DESC oznacza że sortowanie będzie w porządku malejącym co w praktyce oznacza że najwyższe wartości będą na początku listy a najniższe na końcu To jest przydatne gdy chcemy uzyskać strukturę danych w której najważniejsze lub najbardziej istotne rekordy są prezentowane na samym początku na przykład gdy analizujemy dane w kontekście hierarchicznym lub priorytetowym W tym przypadku sortujemy malejąco według klasy co może być użyteczne na przykład gdy chcemy szybko zidentyfikować uczniów z wyższych klas którzy osiągają wysokie wyniki średnia powyżej 5 Dobre praktyki w SQL zalecają jasne i precyzyjne definiowanie kryteriów sortowania co ułatwia zrozumienie logiki zapytania oraz zapewnia jego przewidywalne działanie Jeśli dane wymagają częstego sortowania warto rozważyć optymalizację poprzez odpowiednie indeksy co może znacząco poprawić wydajność zapytań zwłaszcza w dużych zestawach danych

Pytanie 25

Jak kwerenda SQL przedstawiona w ramce wpłynie na tabelę pracownicy?

ALTER TABLE pracownicy MODIFY plec char(9);
A. Zmieni typ danych kolumny plec na znakowy o zmiennej długości 9
B. Doda kolumnę plec ze znakowym typem danych o zmiennej długości 9
C. Zmieni typ danych kolumny plec na znakowy o stałej długości 9
D. Doda kolumnę plec ze znakowym typem danych o stałej długości 9
Jak widzisz, polecenie SQL ALTER TABLE pracownicy MODIFY plec char(9) zmienia typ kolumny plec na CHAR o stałej długości 9 znaków. To znaczy, że wszystkie wartości w tej kolumnie będą miały dokładnie 9 znaków. Jeśli dana wartość będzie krótsza, to automatycznie dopełni się spacjami. W praktyce to jest przydatne, gdy musimy mieć dane zawsze w tej samej długości, na przykład przy kodach pocztowych czy numerach identyfikacyjnych. Twoja odpowiedź jest poprawna, ponieważ mówi dokładnie o tym, co się dzieje przy użyciu MODIFY, a typ CHAR wskazuje, że mamy do czynienia z danymi o stałej długości. Wiesz, czasami w aplikacjach biznesowych trzeba mieć dane w jednolitej formie, bo to ułatwia ich przetwarzanie i porównywanie. Dlatego tak ważne jest, żeby znać różne typy danych i ich zastosowania podczas projektowania baz danych.

Pytanie 26

Jakie mechanizmy przyznawania zabezpieczeń, umożliwiające przeprowadzanie operacji na bazie danych, są powiązane z tematyką zarządzania kontami, użytkownikami oraz uprawnieniami?

A. Z zasadami
B. Z przywilejami obiektowymi
C. Z przywilejami systemowymi
D. Z atrybutami
Przywileje systemowe to kluczowy element zarządzania bezpieczeństwem w systemach baz danych. Obejmują one uprawnienia, które są przypisane do konta użytkownika na poziomie systemu, a niekoniecznie na poziomie obiektów bazy danych, takich jak tabele czy widoki. Dzięki nim możemy kontrolować dostęp do różnych funkcji systemowych, takich jak możliwość tworzenia nowych użytkowników, modyfikacji struktury bazy danych czy przydzielania uprawnień innym użytkownikom. Przykładem zastosowania przywilejów systemowych jest sytuacja, w której administrator bazy danych przydziela użytkownikom różne role, takie jak DBA (Database Administrator), która daje pełny dostęp do zasobów, lub rola z ograniczonymi uprawnieniami, co pozwala na wykonywanie tylko wybranych operacji. Dobrym przykładem standardów w tej dziedzinie jest podejście oparte na zasadzie minimalnych uprawnień, gdzie użytkownicy otrzymują jedynie te uprawnienia, które są absolutnie niezbędne do wykonywania ich zadań. Dzięki zastosowaniu przywilejów systemowych można skutecznie zarządzać bezpieczeństwem bazy danych oraz minimalizować ryzyko nieautoryzowanego dostępu.

Pytanie 27

Została stworzona baza danych z tabelą podzespoły, która zawiera pola: model, producent, typ, cena. Aby uzyskać listę wszystkich modeli pamięci RAM od firmy Kingston uporządkowanych od najniższej do najwyższej ceny, należałoby użyć kwerendy:

A. SELECT model FROM podzespoły WHERE typ='RAM' AND producent='Kingston' ORDER BY cena DESC
B. SELECT model FROM podzespoły WHERE typ='RAM' AND producent='Kingston' ORDER BY cena ASC
C. SELECT model FROM podzespoły WHERE typ='RAM' OR producent='Kingston' ORDER BY cena DESC
D. SELECT model FROM producent WHERE typ='RAM' OR producent='Kingston' ORDER BY podzespoły ASC
Wybrana kwerenda jest poprawna, ponieważ dokładnie spełnia wymagania zadania. Użycie klauzuli SELECT do wyboru pola 'model' z tabeli 'podzespoły' pozwala na uzyskanie właściwych informacji. Warunek WHERE ogranicza wyniki do tych, które dotyczą pamięci RAM (typ='RAM') oraz producenta Kingston (producent='Kingston'). Kluczowym elementem tej kwerendy jest zastosowanie ORDER BY cena ASC, które sortuje wyniki według ceny w porządku rosnącym, co jest zgodne z wymaganiem wyświetlenia modeli od najtańszej do najdroższej. Przykłady zastosowania takiej kwerendy mogą obejmować systemy zarządzania zapasami, gdzie klienci poszukują najlepszych ofert, czy aplikacje e-commerce, które chcą dostarczyć użytkownikom najbardziej korzystne opcje zakupowe. Stosowanie jasnych i precyzyjnych kwerend SQL, według dobrych praktyk branżowych, jest kluczowe dla wydajności i przejrzystości danych.

Pytanie 28

Do tabeli pracownicy wpisano rekordy. Co zostanie wyświetlone po uruchomieniu kwerendy SQL SELECT podanej poniżej?

SELECT SUM(pensja) FROM pracownicy WHERE pensja > 4000;
idimienazwiskopensja
1AnnaKowalska3400
2MonikaNowak1300
3EwelinaNowakowska2600
4AnnaPrzybylska4600
5MariaKowal2200
6EwaNowacka5400
A. Wartość 10000, czyli suma pensji pracownika o id=4 oraz o id=6.
B. Wartość 19500, czyli suma wszystkich pensji pracowników.
C. Dwie wartości: 4600 i 5400, jako pensje pracowników wyższe niż 4000.
D. Wartość 5400, czyli najwyższa pensja pracownika.
Gratulacje, twoja odpowiedź jest poprawna. Kwerenda SQL 'SELECT SUM(pensja) FROM pracownicy WHERE pensja > 4000;' jest zapytaniem, które agreguje (suma) wartości kolumny 'pensja' dla tych wierszy, gdzie pensja przekracza 4000. SQL jest językiem, który pozwala na manipulację i odzyskiwanie danych przechowywanych w relacyjnej bazie danych. Funkcja SUM() jest jednym z podstawowych operatorów agregujących w SQL, który zwraca sumę wartości numerycznych. W tym konkretnym przypadku, zgodnie z pytaniem, suma pensji pracowników, którzy zarabiają więcej niż 4000 wynosi 10000. To pokazuje, jak potężne mogą być kwerendy SQL, umożliwiając szybkie wykonanie złożonych obliczeń na dużych zestawach danych. Podejście to jest często stosowane w analizie danych i raportowaniu, gdzie potrzebna jest agregacja danych na różnych poziomach.

Pytanie 29

Podaj polecenie SQL, które pozwoli na dodanie kolumny miesiacSiewu do tabeli rośliny znajdującej się w bazie danych

A. ALTER TABLE rośliny ADD miesiacSiewu int;
B. CREATE TABLE rośliny {miesiacSiewu int};
C. INSERT INTO rośliny VALUES (miesiacSiewu int);
D. UPDATE rośliny ADD miesiacSiewu int;
Odpowiedź 'ALTER TABLE rośliny ADD miesiacSiewu int;' jest jak najbardziej na miejscu. Używasz tutaj komendy SQL 'ALTER TABLE', co jest standardem, jeśli chcesz coś zmienić w już istniejącej tabeli. W tym przypadku dodajesz nowe pole 'miesiacSiewu' w formacie 'int' do tabeli 'rośliny'. Fajnie, bo dodawanie kolumn w relacyjnych bazach danych to chleb powszedni, zwłaszcza gdy musisz dodać nowe informacje. Na przykład, jak chcesz wiedzieć, kiedy siać rośliny, to zrobienie tego przy pomocy tej komendy pozwoli Ci trzymać te dane blisko innych szczegółów roślin. Warto też pamiętać, żeby nowe kolumny były dobrze indeksowane lub miały jakieś wartości domyślne, bo to może przyspieszyć zapytania do bazy. Tego typu operacje są naprawdę ważne w zarządzaniu bazami danych, bo dają Ci elastyczność, żeby dostosować strukturę bazy do potrzeb Twojej aplikacji.

Pytanie 30

W firmowej tabeli znajdują się kolumny: nazwa, adres, NIP, obrót (obrót w ostatnim miesiącu), rozliczenie oraz status. Po wykonaniu kwerendy SQL

SELECT nazwa, NIP FROM firmy WHERE obrot < 4000;
na ekranie pojawią się:
A. wszystkie informacje o firmach, które w ostatnim miesiącu uzyskały obrót co najmniej 4000 zł
B. wszystkie informacje o firmach, które w ostatnim miesiącu miały obrót poniżej 4000 zł
C. tylko nazwa oraz numer NIP firm, które w ostatnim miesiącu miały obrót co najmniej 4000 zł
D. tylko nazwa oraz numer NIP firm, które w ostatnim miesiącu miały obrót mniejszy niż 4000 zł
W tej kwerendzie SQL chodziło o to, aby zrozumieć, że zapytanie 'SELECT nazwa, NIP FROM firmy WHERE obrót < 4000;' zwróci tylko nazwy firm i ich numery NIP. Tylko te firmy, co miały obrót poniżej 4000 zł w ostatnim miesiącu. SQL jako język zapytań daje nam możliwość wybierania konkretnych kolumn z tabeli i filtrowania wyników według różnych warunków. Tu wybraliśmy kolumny 'nazwa' i 'NIP', a filtr 'WHERE obrót < 4000' pokazuje nam tylko te firmy, które spełniają ten warunek. To bardzo ważne w praktycznym użyciu SQL, bo często musimy wyświetlać dane według określonych kryteriów. Dzięki temu zapytaniu łatwo możemy zidentyfikować firmy, które mogą potrzebować wsparcia finansowego lub jakiejś pomocy z powodu niskiego obrotu.

Pytanie 31

Jaką czynność należy wykonać przed zrobieniem kopii zapasowej danych w MySQL?

A. ustalenie systemu kodowania znaków w bazie
B. zweryfikowanie poprawności tabel w bazie oraz ewentualne naprawienie usterek
C. przyznanie uprawnień do przeglądania bazy dla Administratora
D. sprawdzenie, czy baza działa wystarczająco wydajnie
Sprawdzenie poprawności tabel w bazie przed wykonaniem kopii bezpieczeństwa jest kluczowym krokiem, który pozwala na zapewnienie integralności danych. W przypadku, gdy w tabelach występują błędy, takie jak uszkodzone wiersze czy niedopasowane indeksy, proces tworzenia kopii zapasowej może nie uwzględnić tych problemów, co w konsekwencji prowadzi do utraty danych lub trudności w ich przywróceniu. W MySQL, przed rozpoczęciem backupu, zaleca się użycie polecenia 'CHECK TABLE' do weryfikacji stanu tabel. Przykładowo, jeśli tabela 'users' jest sprawdzana i wykryto błąd, można zastosować 'REPAIR TABLE', aby naprawić uszkodzenia. Dobrą praktyką w branży jest regularne tworzenie kopii zapasowych oraz prowadzenie audytów jakości danych, co pozwala na minimalizację ryzyka utraty informacji. Utrzymywanie bazy danych w dobrym stanie technicznym poprzez regularne sprawdzanie tabel oraz ich naprawianie jest zalecane w dokumentacji MySQL oraz innych systemów zarządzania bazami danych, co podkreśla znaczenie tego procesu w kontekście bezpieczeństwa danych.

Pytanie 32

W SQL warunek ten odpowiada warunkowi liczba >= 10 AND liczba <= 100?

A. NOT (liczba < 10 AND liczba > 100)
B. liczba BETWEEN 10 AND 100
C. liczba IN (10, 100)
D. liczba LIKE '10%'
Odpowiedzi, które nie są poprawne, mogą wynikać z nieporozumień dotyczących operatorów logicznych i porównawczych w SQL. Rozważając pierwszą odpowiedź, 'NOT (liczba < 10 AND liczba > 100)', można zauważyć, że wyrażenie to w rzeczywistości sprawdza, czy liczba nie jest ani mniejsza niż 10, ani większa niż 100. Choć może się wydawać, że jest to zbliżone do sprawdzania, czy liczba mieści się w przedziale, to w rzeczywistości wyrażenie to jest kluczowo różne – może być mylące, ponieważ nie uwzględnia wartości brzegowych, co prowadzi do błędnych wyników. Z kolei odpowiedź 'liczba IN (10, 100)' również nie oddaje sensu warunku, ponieważ operator IN sprawdza tylko, czy liczba jest równa jednej z wymienionych wartości, a nie czy mieści się w przedziale. Co więcej, 'liczba LIKE '10%'' to wyrażenie, które jest stosowane do porównywania z wzorcami tekstowymi i nie jest odpowiednie w kontekście porównywania wartości liczbowych. Użycie LIKE w takim przypadku może prowadzić do nieprzewidywalnych wyników, szczególnie gdy porównywane są liczby i tekst. Takie błędne podejścia mogą wynikać z niewłaściwego zrozumienia różnicy między operatorami porównawczymi a operatorami logicznymi, co jest kluczowe w efektywnym korzystaniu z SQL.

Pytanie 33

Tabela samochody zawiera dane przedstawione poniżej:

idklasa_idmarkamodelrocznik
11fordka2017
22seattoledo2016
33opelzafira2018
42fiat500X2018
53opelinsignia2017
Wydając zamieszczone zapytanie SQL, jakie dane zostaną zwrócone:
SELECT model FROM samochody WHERE rocznik > 2017 AND marka = "opel";
A. zafira
B. opel zafira
C. zafira; insignia
D. opel zafira; opel insignia
Poprawna odpowiedź to 'zafira', ponieważ zapytanie SQL odnosi się do modelu samochodu marki 'opel', którego rocznik jest większy niż 2017. Z analizy danych w tabeli wynika, że tylko model 'opel zafira' (z rocznika 2018) spełnia te warunki. Odpowiedzi 'opel zafira', 'zafira; insignia', 'opel zafira; opel insignia' zawierają dodatkowe informacje, które nie są zgodne z wymaganiami zapytania. Dobrym przykładem zastosowania takiej analizy jest filtrowanie danych w bazach danych, co jest kluczowym procesem w zarządzaniu informacjami. Efektywne posługiwanie się zapytaniami SQL to umiejętność istotna w pracy każdego analityka danych, programisty, czy specjalisty w zakresie baz danych, ponieważ pozwala na wyciąganie precyzyjnych informacji zgodnych z wymaganiami biznesowymi.

Pytanie 34

Jakie zapytanie SQL należy użyć, aby zmienić strukturę już istniejącej tabeli?

A. UPDATE
B. INSERT INTO
C. ALTER TABLE
D. CREATE TABLE
Odpowiedź 'ALTER TABLE' jest poprawna, ponieważ to polecenie SQL służy do modyfikacji struktury istniejącej tabeli w bazie danych. Dzięki 'ALTER TABLE' możemy dodawać nowe kolumny, modyfikować istniejące kolumny (np. zmieniając ich typ danych czy nazwę), a także usuwać kolumny, które nie są już potrzebne. Przykładowe zastosowanie polecenia to dodanie nowej kolumny do tabeli pracowników: 'ALTER TABLE pracownicy ADD COLUMN wiek INT;'. Ponadto, 'ALTER TABLE' pozwala na wprowadzanie ograniczeń, takich jak klucze obce czy unikalności, co jest kluczowe w kontekście integracji danych i zapewnienia ich spójności. W praktyce, odpowiednie zarządzanie strukturą tabel jest fundamentalnym aspektem utrzymania bazy danych w dobrej kondycji. Należy pamiętać, aby stosować te zmiany zgodnie z najlepszymi praktykami, takimi jak testowanie zapytań w środowisku deweloperskim przed ich wdrożeniem w produkcji, co minimalizuje ryzyko błędów i strat danych.

Pytanie 35

Jak nazywa się informacje opisujące inne informacje (dane o danych)?

A. databus
B. metadane (metadata)
C. metajęzyk (metalanguage)
D. język znaczników (markup language)
Informacje opisujące inne dane (dane o danych) to METADANE - np. autor, data utworzenia, format czy rozmiar pliku. Dlatego mowa o metadanych.

Pytanie 36

W tabeli mieszkancy znajdują się różne dane. Aby przefiltrować jedynie mieszkańców, którzy mają przypisaną dzielnicę = 1, stworzono dla uproszczenia działania wirtualną tabelę (widok) poprzez zastosowanie kwerendy

A. CREATE VIEW mieszkancy WHERE dzielnica = 1
B. CREATE VIEW mieszkancy FROM mieszkancy WHERE dzielnica = 1
C. CREATE VIEW mieszkancySrodmiescie AS SELECT * FROM mieszkancy
D. CREATE VIEW mieszkancySrodmiescie AS SELECT * FROM mieszkancy WHERE dzielnica = 1
Odpowiedzi, które nie pasują do definicji widoków w SQL, mają kilka kluczowych błędów. W pierwszej z nich, 'CREATE VIEW mieszkancy WHERE dzielnica = 1;', brakuje ważnych elementów do zdefiniowania widoku. Przede wszystkim, nie ma słowa 'AS', które powinno być tam, żeby określić kwerendę, z której widok się tworzy. SQL wymaga, żeby definicja widoku miała zapytanie, czego tutaj brakuje. W drugiej odpowiedzi, 'CREATE VIEW mieszkancy FROM mieszkancy WHERE dzielnica = 1;', również jest niepoprawna, bo nie ma 'AS' i jest zła składnia, bo 'FROM' nie może być używane w tworzeniu widoku bez odpowiedniej struktury. Ostatnia odpowiedź, 'CREATE VIEW mieszkancySrodmiescie AS SELECT * FROM mieszkancy;', choć składnia jest okej, nie filtruje danych do mieszkańców z dzielnicy nr 1. To błędne myślenie, bo często zapominamy o używaniu filtrów, co prowadzi do tego, że mamy za dużo danych do analizy. Tworząc widoki, warto zawsze mieć na uwadze, po co je robimy i zadbać o to, żeby zawierały tylko te dane, które są nam naprawdę potrzebne.

Pytanie 37

Które narzędzie do zarządzania bazą danych jest wbudowane w pakiet XAMPP?

A. MySQL Workbench
B. phpMyAdmin
C. pgAdmin
D. SQLite
Pakiet XAMPP (Apache, MySQL/MariaDB, PHP) zawiera wbudowane narzędzie phpMyAdmin do zarządzania bazą przez przeglądarkę - tworzenia baz, tabel i uruchamiania zapytań. Dlatego w XAMPP znajdziesz phpMyAdmin.

Pytanie 38

ALTER TABLE transport MODIFY COLUMN rok_produkcji INT;
Wykonanie powyższej kwerendy SQL w bazie MySQL spowoduje:
A. usunięcie kolumny rok_produkcji w tabeli transport.
B. zmianę typu danych w kolumnie rok_produkcji na INT.
C. utworzenie tabeli transport zawierającej kolumnę rok_produkcji.
D. dodanie kolumny rok_produkcji typu INT w tabeli transport.
Poprawnie – polecenie ALTER TABLE ... MODIFY COLUMN w MySQL służy do modyfikowania istniejącej kolumny, a nie do jej tworzenia czy usuwania. W podanym przykładzie baza danych szuka tabeli o nazwie `transport`, a następnie zmienia definicję kolumny `rok_produkcji` tak, aby jej typ danych był `INT`. Jeśli kolumna już istnieje (a musi istnieć, żeby MODIFY zadziałało), to po wykonaniu polecenia dalej będzie miała tę samą nazwę, ale jej typ i właściwości zostaną nadpisane nową definicją. W MySQL warto pamiętać, że przy MODIFY COLUMN trzeba podać pełną definicję kolumny, nie tylko sam typ. Czyli jeśli wcześniej była np. NOT NULL albo miała domyślną wartość, to dobra praktyka jest napisać coś w stylu: `ALTER TABLE transport MODIFY COLUMN rok_produkcji INT NOT NULL DEFAULT 2000;` – inaczej można przypadkiem zgubić część ustawień. W praktyce takie polecenia stosuje się przy zmianach w projekcie bazy: np. najpierw kolumna jest typu VARCHAR, bo ktoś przechowuje tam rok jako tekst, a potem, zgodnie z lepszymi zasadami projektowania, zmienia się to na typ liczbowy INT, żeby można było łatwo filtrować, sortować, robić warunki typu `WHERE rok_produkcji > 2015`. Z mojego doświadczenia dobrze jest przed taką zmianą sprawdzić, czy wszystkie dane da się bezpiecznie skonwertować na liczbę, bo jeśli w kolumnie są jakieś śmieciowe wartości tekstowe, to MySQL może je obciąć albo zamienić na 0, co później robi bałagan w raportach. W środowiskach produkcyjnych takie ALTER TABLE najlepiej wykonywać po zrobieniu kopii zapasowej i często w oknie serwisowym, bo przy dużych tabelach operacja może chwilowo blokować dostęp do danych.

Pytanie 39

Podane w ramce polecenie SQL nadaje prawo SELECT

GRANT SELECT ON hurtownia.* TO 'sprzedawca'@'localhost';
A. do wszystkich pól w tabeli hurtownia.
B. do wszystkich tabel w bazie hurtownia.
C. dla użytkownika 'root' na serwerze localhost.
D. dla użytkownika 'root' na serwerze sprzedawca.
Poprawnie wychwyciłeś najważniejszy element składni: zapis hurtownia.* po słowie ON oznacza całą bazę danych o nazwie hurtownia, a nie pojedynczą tabelę. W składni GRANT w MySQL i innych systemach bazodanowych mamy kilka poziomów nadawania uprawnień: można nadać uprawnienia do całej bazy (database), do konkretnej tabeli, a nawet do pojedynczych kolumn. Kluczowe jest to, co znajduje się po słowie ON. Jeżeli podamy nazwa_bazy.* – tak jak tutaj – to uprawnienie SELECT dotyczy wszystkich tabel w tej bazie danych. Gdyby chodziło o jedną tabelę, składnia wyglądałaby np. GRANT SELECT ON hurtownia.zamowienia TO 'sprzedawca'@'localhost'; i wtedy prawo dotyczyłoby wyłącznie tabeli zamowienia.
W tym poleceniu dodatkowo jasno określony jest użytkownik: 'sprzedawca'@'localhost'. W MySQL użytkownik jest identyfikowany parą nazwa_użytkownika@host, więc nie jest to ani root, ani żaden inny login, tylko konkretny użytkownik o nazwie sprzedawca, który łączy się z serwera localhost. To jest typowy scenariusz np. dla aplikacji sprzedażowej instalowanej na tym samym serwerze co baza. Taki użytkownik często dostaje tylko SELECT do bazy hurtownia, żeby mógł odczytywać dane (np. listę produktów, stany magazynowe, historię zamówień), ale nie miał uprawnień do modyfikacji struktury bazy czy kasowania rekordów.
Moim zdaniem jest to bardzo dobra praktyka bezpieczeństwa: tworzy się osobnych użytkowników o wąskim zakresie uprawnień zamiast wszędzie używać konta root. W realnych projektach webowych, np. w PHP czy innych językach backendowych, w pliku konfiguracyjnym aplikacji podaje się właśnie takiego technicznego użytkownika, który ma GRANT SELECT (czasem też INSERT/UPDATE) tylko na jedną, konkretną bazę. Dzięki temu nawet jeśli aplikacja zostanie zhakowana, atakujący ma dużo mniejsze pole do popisu, bo nie dysponuje pełnymi uprawnieniami administracyjnymi.
Dobrze też zapamiętać, że GRANT SELECT nie daje prawa do tworzenia nowych tabel ani zmiany struktury – to są osobne uprawnienia (CREATE, ALTER, DROP). Tutaj mówimy wyłącznie o możliwości wykonywania zapytań odczytujących dane ze wszystkich tabel w bazie hurtownia, co w praktyce oznacza, że użytkownik sprzedawca może spokojnie robić SELECT * FROM jakakolwiek_tabela; pod warunkiem, że ta tabela znajduje się właśnie w tej bazie.

Pytanie 40

Tabela Pacjenci ma pola: imie, nazwisko, wiek, lekarz_id. Aby zestawić raport zawierający wyłącznie imiona i nazwiska pacjentów poniżej 18 roku życia, którzy zapisani są do lekarza o id równym 6, można posłużyć się kwerendą SQL

A. SELECT imie, nazwisko WHERE wiek < 18 OR lekarz_id = 6;
B. SELECT imie, nazwisko WHERE wiek < 18 AND lekarz_id = 6;
C. SELECT imie, nazwisko FROM Pacjenci WHERE wiek < 18 OR lekarz_id = 6;
D. SELECT imie, nazwisko FROM Pacjenci WHERE wiek < 18 AND lekarz_id = 6;
Poprawna kwerenda to: SELECT imie, nazwisko FROM Pacjenci WHERE wiek < 18 AND lekarz_id = 6; i ona dokładnie realizuje założenia zadania. Po pierwsze, część SELECT imie, nazwisko określa, jakie kolumny mają znaleźć się w wyniku – tylko imię i nazwisko, bez wieku czy identyfikatora lekarza. To jest dobra praktyka: wybieramy tylko te dane, które są faktycznie potrzebne w raporcie, zamiast używać SELECT *.
Po drugie, FROM Pacjenci wskazuje tabelę źródłową. W standardowym SQL klauzula FROM jest obowiązkowa przy pobieraniu danych z tabel, bez niej serwer bazodanowy po prostu nie wie, skąd ma brać rekordy. Moim zdaniem to jest taki fundament, który warto mieć odruchowo w palcach.
Najważniejsza jest jednak klauzula WHERE wiek < 18 AND lekarz_id = 6. Warunek wiek < 18 filtruje wyłącznie pacjentów niepełnoletnich, a lekarz_id = 6 ogranicza wynik do tych osób, które przypisane są do konkretnego lekarza o identyfikatorze 6. Zastosowanie operatora logicznego AND oznacza, że oba warunki muszą być spełnione jednocześnie. To dokładnie odpowiada treści zadania: pacjent musi być jednocześnie poniżej 18 lat i zapisany do lekarza nr 6.
W praktyce takie kwerendy są podstawą raportowania w systemach medycznych, CRM-ach, systemach sprzedażowych itd. Na przykład podobną konstrukcję można użyć: SELECT * FROM Zamowienia WHERE status = 'nowe' AND kwota > 1000; – logika jest identyczna. Dobrą praktyką jest też czytelne zapisywanie warunków logicznych i unikanie niejednoznacznych kombinacji AND/OR bez nawiasów. W większych projektach standardem jest również używanie aliasów tabel, ale tu jedna tabela w zupełności wystarcza. Warto zapamiętać ten szablon: SELECT [kolumny] FROM [tabela] WHERE [warunek1] AND [warunek2]; bo pojawia się praktycznie wszędzie w pracy z SQL.