Relacje i Kwerendy Wielotabelowe
Klucz główny i obcy, relacja jeden do wielu, złączenie wewnętrzne i zewnętrzne oraz najczęstsze miny: iloczyn kartezjański i rekordy bez pary.
Dane w zadaniu prawie nigdy nie leżą w jednej tabeli. Nazwisko jest w jednej, zamówienie w drugiej, kategoria produktu w trzeciej — i dopiero złączenie pozwala odpowiedzieć na pytanie z polecenia. To materiał, który wraca w każdym arkuszu, a jego trudność sprowadza się do dwóch decyzji: po czym łączyć i którego rodzaju złączenia użyć. Reszta to już zwykłe filtrowanie.
1. Dlaczego dane są w osobnych tabelach
Gdyby przy każdym zamówieniu powtarzać komplet danych klienta, jedna zmiana adresu wymagałaby poprawienia setek wierszy, a literówka w nazwisku rozbiłaby grupowanie na dwie osoby. Dlatego dane opisujące jeden byt trzymamy w jednym miejscu, a tabele wiążemy kluczami.
Klienci Zamowienia
ID <-------- ID_klienta (klucz obcy)
Nazwisko Numer (klucz glowny)
Miasto Wartosc
Data2. Klucz główny i klucz obcy
- Klucz główny — jednoznacznie wskazuje rekord. Nie powtarza się i nie bywa pusty.
- Klucz obcy — pole w drugiej tabeli, które przechowuje wartość klucza głównego i w ten sposób wskazuje właściciela rekordu.
- Więzy integralności — opcja w oknie relacji, która blokuje wpisanie zamówienia dla nieistniejącego klienta i ostrzega przy próbie usunięcia rekordu, do którego ktoś się odwołuje.
W Accessie relacje ustawiasz w Narzędzia bazy danych → Relacje, przeciągając klucz główny na klucz obcy. Jeśli tego nie zrobisz, kwerenda i tak się wykona — tylko wynik będzie bez sensu, o czym za chwilę.
3. Złączenie wewnętrzne i zewnętrzne
Złączenie wewnętrzne zostawia tylko rekordy, które mają parę po obu stronach. Złączenie zewnętrzne zachowuje wszystkie rekordy z jednej tabeli, a brakujące dane z drugiej zastępuje wartością pustą. Wybór między nimi zmienia liczbę wierszy wyniku, więc jest wprost punktowany.
-- tylko klienci z zamowieniami
SELECT k.Nazwisko, z.Numer, z.Wartosc
FROM Klienci AS k
INNER JOIN Zamowienia AS z ON k.ID = z.ID_klienta;
-- wszyscy klienci, takze bez zamowien
SELECT k.Nazwisko, z.Numer
FROM Klienci AS k
LEFT JOIN Zamowienia AS z ON k.ID = z.ID_klienta;
-- trzy tabele naraz (skladnia Accessa: nawiasy sa obowiazkowe)
SELECT k.Nazwisko, p.Nazwa, z.Ilosc
FROM (Zamowienia AS z
INNER JOIN Klienci AS k ON z.ID_klienta = k.ID)
INNER JOIN Produkty AS p ON z.ID_produktu = p.ID;Access wymaga, żeby przy łączeniu więcej niż dwóch tabel każde kolejne złączenie ująć w nawiasy. Zapis bez nawiasów, poprawny w większości baz danych, zwróci tu komunikat o błędzie składni. Najprościej zbudować kwerendę w siatce projektowej — Access wstawi nawiasy sam — i dopiero potem zajrzeć do Widoku SQL, jeśli arkusz prosi o treść zapytania.
Kliknij dwukrotnie linię łączącą tabele i wybierz właściwości złączenia. Opcja pierwsza to złączenie wewnętrzne, druga i trzecia to zewnętrzne, zależnie od tego, która tabela ma zachować wszystkie rekordy. Strzałka na linii pokazuje kierunek.
4. Klasyczne polecenie: kto nic nie kupił
Samo złączenie wewnętrzne takich osób nie pokaże, bo nie mają pary. Wzorzec jest zawsze ten sam: złączenie zewnętrzne plus warunek na wartość pustą po stronie drugiej tabeli.
SELECT k.Nazwisko FROM Klienci AS k LEFT JOIN Zamowienia AS z ON k.ID = z.ID_klienta WHERE z.Numer IS NULL;
Access ma to samo w Kreatorze kwerend pod nazwą kwerenda wyszukująca niepasujące rekordy. Warto znać obie drogi: kreator jest szybszy, zapis SQL działa wszędzie.
5. Relacja wiele do wielu i tabela łącząca
Uczeń chodzi na kilka kursów, a na kurs chodzi wielu uczniów. Takiej relacji nie da się zapisać dwiema tabelami — potrzebna jest trzecia, przechowująca same pary identyfikatorów.
-- ilu uczniow zapisalo sie na kazdy kurs SELECT ku.Nazwa, COUNT(*) AS Uczestnikow FROM Zapisy AS za INNER JOIN Kursy AS ku ON za.ID_kursu = ku.ID GROUP BY ku.Nazwa ORDER BY Uczestnikow DESC;
6. Gdy na stanowisku jest LibreOffice Base
Lista oprogramowania CKE dopuszcza oba pakiety biurowe, a Base zachowuje się przy złączeniach inaczej niż Access — na tyle, że warto to zobaczyć raz przed egzaminem, a nie pierwszy raz przy stanowisku.
SELECT k."Nazwisko", p."Nazwa", z."Ilosc" FROM "Zamowienia" AS z INNER JOIN "Klienci" AS k ON z."ID_klienta" = k."ID" INNER JOIN "Produkty" AS p ON z."ID_produktu" = p."ID";
- Nawiasy przy trzeciej tabeli nie są potrzebne — Base używa standardowego SQL.
- Nazwy tabel i pól bierze się w cudzysłów prosty i rozróżnia wielkość liter, a teksty w apostrofy.
- Relacje ustawiasz w Narzędzia → Relacje, a rodzaj złączenia dwuklikiem na linii, dokładnie jak w Accessie.
- Zamiast
TOP 1obowiązujeLIMIT 1na końcu zapytania.
7. Maturalne miny
- Iloczyn kartezjański. Brak warunku złączenia daje każdy rekord z każdym: 200 klientów i 500 zamówień to 100 000 wierszy. Objaw jest natychmiastowy — kwerenda mieli i zwraca absurdalną liczbę rekordów.
- Złączenie po złym polu. Łatwo pomylić
IDzID_klientaalbo połączyć po nazwisku zamiast po identyfikatorze. Nazwiska się powtarzają, więc wynik będzie zawyżony. - Typy pól nie pasują. Klucz obcy zapisany jako tekst nie złączy się z kluczem liczbowym. To częsty skutek złego importu.
- Niejednoznaczna nazwa kolumny. Gdy obie tabele mają pole
Nazwa, zawsze pisz z przedrostkiem tabeli albo aliasem:k.Nazwa,p.Nazwa. - Duplikaty po złączeniu. Jeśli klient ma pięć zamówień, jego nazwisko pojawi się pięć razy. To poprawne zachowanie — jeśli polecenie chce listy klientów, użyj
DISTINCTalbo grupowania.
8. Kontrola wyniku w dwie minuty
- Liczba wierszy jest bliska liczbie rekordów w tabeli „wiele”, a nie jej wielokrotnością.
- Kolumny z obu tabel mają sensowne wartości, bez pustek tam, gdzie ich nie powinno być.
- Wynik zawiera tylko te pola, o które prosi polecenie — resztę odznacz w wierszu Pokaż.
- Kwerenda zapisana pod właściwą nazwą, a jeśli arkusz prosi o zapytanie, skopiuj je z Widoku SQL.
Plan pracy na 210 minut, kolejność rozwiązywania i format plików wynikowych, na którym najłatwiej stracić punkty.
Korepetycje z informatyki
Zdajesz maturę rozszerzoną z informatyki?
Prowadzimy indywidualne przygotowanie do matury z informatyki — algorytmy, Python i C++, bazy danych i arkusz kalkulacyjny. Zajęcia online, na arkuszach CKE. Zobacz program i cennik.
Zobacz korepetycje z informatykiUczysz się w technikum informatycznym? Prowadzimy też przygotowanie do kwalifikacji INF.02, INF.03 i INF.04. Zobacz egzaminy zawodowe →
Nadal czujesz się niepewnie?
To tylko jeden z pewniaków. Na kursie przechodzimy przez nie wszystkie, krok po kroku, aż poczujesz ten spokój.
Pomóżcie mi zdać maturę!