INF.03 · Bazy danych i SQL

Wypożyczalnia filmów, część 3: zapytania JOIN

Cztery tabele tej bazy mają sens dopiero razem. Sam numer klienta i numer filmu w tabeli wypożyczeń niczego nie mówi człowiekowi. Połączysz je zapytaniami JOIN, a przy okazji zobaczysz, że wynik pusty też bywa poprawną odpowiedzią.

  • około 40 minut
  • INNER JOIN · LEFT JOIN · GROUP BY
  • trzy tabele naraz

Po tej lekcji: napiszesz złączenia dwóch i trzech tabel, LEFT JOIN z IS NULL oraz zestawienie z grupowaniem.

1 · Sytuacja

Raporty z czterech tabel

Pracujesz na wypozyczalnia_filmow. Narysuj na kartce, które tabele łączysz i po jakich kolumnach: przy trzech tabelach łatwo się pogubić. Dodawaj złączenia po jednym: napisz JOIN dwóch tabel, sprawdź wynik i dopiero wtedy dołóż następną.

Pytanie 3 (filmy nigdy niewypożyczone) wymaga LEFT JOIN. Sprawdź wynik i zastanów się, czy pusty wynik jest prawidłowy.

2 · Do wykonania

Zadania do wykonania

  1. Pokaż imię i nazwisko klienta oraz tytuł wypożyczonego filmu dla każdego wypożyczenia.
    Oczekiwany wynik15 wierszy
  2. Pokaż tytuł filmu razem z nazwą jego gatunku.
    Oczekiwany wynik12 wierszy
  3. Pokaż filmy, które nigdy nie zostały wypożyczone (LEFT JOIN i IS NULL).Sprawdź, czy wynik pusty jest tu poprawny: porównaj z tabelą wypożyczeń.
    Oczekiwany wynik0 wierszy
  4. Pokaż klientów razem z liczbą filmów, które aktualnie mają niezwrócone.
    Oczekiwany wynik4 wiersze
  5. Pokaż, ile razy każdy gatunek został wypożyczony (trzy tabele i GROUP BY).
    Oczekiwany wynik5 wierszypierwszy wiersz: Akcja · 5

3 · Sprawdź się

Czy Twoje wyniki się zgadzają?

To szybka kontrola, a nie ocena. Liczba wierszy jest pierwszym sygnałem, że warunek albo złączenie działa tak, jak trzeba.

Ta interakcja wymaga włączonego JavaScriptu.

4 · Zanim się pomylisz

Cztery pomyłki w złączeniach

Rozwiń każdą z nich.

Wynik pusty uznany za błąd
Tak nie
-- „na pewno jest jakiś niewypożyczony film”

W tej bazie każdy z 12 filmów był wypożyczony co najmniej raz, więc zapytanie zwraca 0 wierszy. To poprawny wynik.

Tak
Sprawdź kontrolnie: SELECT COUNT(DISTINCT id_filmu) FROM Wypozyczenia; (12).

Zanim uznasz zapytanie za błędne, zweryfikuj dane.

INNER JOIN zamiast LEFT JOIN
Tak nie
FROM Filmy f JOIN Wypozyczenia w ON ...
WHERE w.id_wypozyczenia IS NULL

Zawsze pusty wynik, bo INNER JOIN gubi wiersze bez dopasowania.

Tak
FROM Filmy f LEFT JOIN Wypozyczenia w ON ...
WHERE w.id_wypozyczenia IS NULL

Szukasz braku dopasowania, więc potrzebujesz LEFT JOIN.

Filtr zwrotu w złym miejscu
Tak nie
WHERE w.data_zwrotu = NULL

Zero wierszy.

Tak
WHERE w.data_zwrotu IS NULL

IS NULL, nie = NULL.

Zła kolumna w ON
Tak nie
ON w.id_filmu = g.id_gatunku

Łączysz numer filmu z numerem gatunku i wynik jest bez sensu.

Tak
ON f.id_gatunku = g.id_gatunku

Klucz obcy łącz z kluczem głównym, który mu odpowiada.

5 · Sprawdź sam siebie

Zanim oddasz pracę

Ta lista odpowiada temu, co sprawdza komisja egzaminacyjna: poprawną bazę, poprawne wyniki i dokumentację.

Podsumowanie

Co warto zapamiętać

  1. Przy trzech tabelach łącz po jednej i sprawdzaj wynik.
  2. Brak dopasowania znajdziesz przez LEFT JOIN i IS NULL.
  3. Pusty wynik może być poprawną odpowiedzią.
  4. Suma z grup powinna zgadzać się z liczbą wszystkich wypożyczeń.

Dalej na swoim koncie

Rozgrzewki, quiz i zadania są w biurku ucznia.

Teoria jest otwarta dla wszystkich. Żeby rozwiązywać zadania, zapisywać szkice i widzieć swój postęp, zaloguj się.

Zaloguj się →
Źródła i dalsza nauka