Bazy danych i SQL na egzaminie INF.03
INF.03 · 423 pytań w banku
W banku INF.03 znajdują się 423 unikalne pytania o bazach danych i SQL. Ten sam zakres pojawia się w zadaniach praktycznych, gdy trzeba zaprojektować tabele, połączyć dane i wyświetlić wynik w aplikacji internetowej. Warto rozumieć, skąd bierze się rezultat zapytania, zamiast uczyć się samych nazw poleceń.
❯ przejdź do pytań INF.03
Od modelu danych do tabel
Klucz główny jednoznacznie wskazuje wiersz, a klucz obcy łączy go z rekordem w innej tabeli. Dla tabel klient(id, nazwa) i zamowienie(id, klient_id, kwota) kolumna zamowienie.klient_id odwołuje się do klient.id. Jeden klient może mieć wiele zamówień, więc jest to relacja jeden-do-wielu.
Relację wiele-do-wielu zapisuje się przez tabelę pośrednią. Uczeń może należeć do wielu grup, a grupa może zawierać wielu uczniów, dlatego tabela uczen_grupa powinna przechowywać co najmniej uczen_id i grupa_id. Ograniczenia PRIMARY KEY, FOREIGN KEY, UNIQUE i NOT NULL pomagają utrzymać spójne dane.
Normalizacja bez definicji na pamięć
Pierwsza postać normalna oznacza pojedynczą wartość w każdym polu, a nie listę numerów telefonów wpisaną do jednej komórki. Druga usuwa zależności od części klucza złożonego. Trzecia usuwa zależności pośrednie, na przykład nazwę miasta zależną od kodu pocztowego, a nie bezpośrednio od identyfikatora klienta.
Celem normalizacji jest ograniczenie powtórzeń i błędów przy zmianach. Gdy nazwa kategorii występuje w każdym produkcie, literówkę trzeba poprawiać w wielu miejscach. Po wydzieleniu tabeli kategoria nazwa jest zapisana raz, a produkt przechowuje tylko klucz obcy. Projekt staje się też łatwiejszy do rozwijania.
SELECT, JOIN, NULL i zmiana danych
Zapytanie SELECT klient_id, COUNT(*) AS ile FROM zamowienie GROUP BY klient_id HAVING COUNT(*) >= 3 zwraca klientów z co najmniej trzema zamówieniami. WHERE filtruje wiersze przed grupowaniem, a HAVING filtruje gotowe grupy. ORDER BY ustala kolejność, natomiast LIMIT ogranicza liczbę zwróconych rekordów.
INNER JOIN zwraca tylko pasujące rekordy z obu tabel. LEFT JOIN zachowuje każdy wiersz z tabeli po lewej, nawet jeśli nie ma odpowiednika po prawej. Przykład klient LEFT JOIN zamowienie pozwala pokazać również klientów bez zamówień. Warunek WHERE zamowienie.id IS NULL wybierze właśnie tę grupę.
NULL oznacza brak znanej wartości. Nie jest zerem ani pustym tekstem i nie sprawdza się go przez = NULL. Poprawne warunki to IS NULL oraz IS NOT NULL. COUNT(*) liczy wiersze, a COUNT(kolumna) pomija wiersze, w których wskazana kolumna ma wartość NULL.
INSERT dodaje rekord, UPDATE zmienia istniejące dane, a DELETE usuwa wybrane wiersze. Przed UPDATE lub DELETE należy sprawdzić warunek WHERE przez odpowiadający mu SELECT. Dane pochodzące od użytkownika przekazuje się do zapytań jako parametry prepared statement, zamiast sklejać SQL z tekstu formularza.
Z tym działem powiązano 423 pytań w banku INF.03. Na ekranie Wszystkie pytania wybierz jeden z tagów: bazy-danych, sql. Możesz wtedy przejrzeć zadania tylko z interesującego Cię obszaru.