INF.03 · Bazy danych i SQL
Sklep komputerowy, część 5: zamówienia i zapytania JOIN
Dotąd klienci i produkty istniały osobno: nikt jeszcze niczego nie kupił. Teraz łączysz je piątą tabelą, Zamowienia, i uczysz się odpowiadać na pytania, które wymagają danych z kilku tabel naraz. To też pierwsze zadanie, w którym LEFT JOIN rzeczywiście zmienia wynik.
- około 50 minut
- CREATE TABLE · INSERT · JOIN · LEFT JOIN
- 5 tabel razem
Po tej lekcji: dodasz tabelę z kluczami obcymi, wypełnisz ją i odpowiesz zapytaniami łączącymi trzy tabele, w tym takimi, które pokazują brak dopasowania.
1 · Sytuacja
Tabela Zamowienia i piętnaście zamówień
Najpierw dodaj tabelę Zamowienia (struktura poniżej), potem wpisz piętnaście zamówień z tabeli danych. Sprawdź SELECT * FROM Zamowienia; przed pierwszym JOIN. Złączenia buduj stopniowo: najpierw dwie tabele, a dopiero potem trzecia.
W zapytaniach z LEFT JOIN pamiętaj o warunku IS NULL, żeby wyłowić brakujące dopasowania.
Tabela Zamowienia do utworzenia
| Kolumna | Wymagania |
|---|---|
id_zamowienia | klucz główny, numerowany automatycznie |
id_klienta | liczba całkowita, obowiązkowa, klucz obcy do Klienci |
id_produktu | liczba całkowita, obowiązkowa, klucz obcy do Produkty |
ilosc | liczba całkowita, obowiązkowa, większa od 0 |
data_zamowienia | data, obowiązkowa |
Dane do wpisania (15 zamówień)
| id_zamowienia | id_klienta | id_produktu | ilosc | data_zamowienia |
|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 2026-01-05 |
| 2 | 1 | 7 | 2 | 2026-01-05 |
| 3 | 2 | 4 | 1 | 2026-01-12 |
| 4 | 2 | 10 | 1 | 2026-01-12 |
| 5 | 3 | 2 | 1 | 2026-01-20 |
| 6 | 3 | 8 | 2 | 2026-01-20 |
| 7 | 4 | 13 | 2 | 2026-02-02 |
| 8 | 4 | 5 | 1 | 2026-02-02 |
| 9 | 5 | 11 | 3 | 2026-02-10 |
| 10 | 5 | 14 | 1 | 2026-02-14 |
| 11 | 6 | 3 | 1 | 2026-02-18 |
| 12 | 6 | 12 | 1 | 2026-02-18 |
| 13 | 7 | 6 | 1 | 2026-03-01 |
| 14 | 7 | 7 | 4 | 2026-03-01 |
| 15 | 1 | 13 | 1 | 2026-03-03 |
2 · Do wykonania
Zadania do wykonania
-
Sprawdź liczbę zamówień:
SELECT COUNT(*) FROM Zamowienia;Oczekiwany wynik1 wierszpierwszy wiersz: 15 -
Pokaż imię, nazwisko klienta, nazwę produktu, ilość i datę dla każdego zamówienia (trzy tabele, bez samych numerów).Oczekiwany wynik15 wierszy
-
Pokaż łączną kwotę wydaną przez każdego klienta (nazwisko i suma ilość razy cena) od największej kwoty.Oczekiwany wynik7 wierszypierwszy wiersz: Kamiński · 6595.00
-
Znajdź produkty, które nigdy nie zostały zamówione. Użyj
LEFT JOINiIS NULL.Oczekiwany wynik2 wiersze -
Znajdź klienta, który wydał w sklepie najwięcej pieniędzy (jeden wiersz).Oczekiwany wynik1 wierszpierwszy wiersz: Kamiński · 6595.00
-
Pokaż wszystkich klientów razem z liczbą złożonych zamówień, także tych, którzy nic nie zamówili (liczba 0).Oczekiwany wynik8 wierszy
-
Pokaż wszystkie produkty z liczbą zamówień, w których występują (
COUNT), także te, których nikt nie zamówił (liczba 0). Posortuj rosnąco po liczbie zamówień, a przy remisie po nazwie produktu.Oczekiwany wynik15 wierszypierwszy wiersz: Monitor 32" 4K · 0
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.
4 · Zanim się pomylisz
Cztery pomyłki w złączeniach
Rozwiń każdą z nich.
INNER JOIN tam, gdzie potrzebny LEFT JOIN
SELECT p.nazwa FROM Produkty p
JOIN Zamowienia z ON z.id_produktu = p.id_produktu
WHERE z.id_zamowienia IS NULL;Pusty wynik. INNER JOIN zostawia tylko pary dopasowane, więc produkty bez zamówień znikają, zanim IS NULL je zobaczy.
SELECT p.nazwa FROM Produkty p
LEFT JOIN Zamowienia z ON z.id_produktu = p.id_produktu
WHERE z.id_zamowienia IS NULL;Brakujące dopasowania pokazuje tylko LEFT JOIN.
COUNT(*) przy LEFT JOIN
SELECT k.nazwisko, COUNT(*)
FROM Klienci k LEFT JOIN Zamowienia z ON z.id_klienta = k.id_klienta
GROUP BY k.id_klienta;Klient bez zamówień ma liczbę 1, bo jego wiersz z NULL też jest liczony.
SELECT k.nazwisko, COUNT(z.id_zamowienia)
FROM ...COUNT(kolumna z drugiej tabeli) pomija NULL, więc dla Olgi daje 0.
Zła kolejność w FROM przy LEFT JOIN
FROM Zamowienia z LEFT JOIN Klienci k ON ...Zachowujesz wszystkie zamówienia, a chciałeś wszystkich klientów.
FROM Klienci k LEFT JOIN Zamowienia z ON ...Zachowywana jest tabela po lewej stronie zapisu.
Brak ON
FROM Zamowienia z JOIN Klienci k;Powstaje iloczyn kartezjański: 15 × 8 = 120 wierszy zamiast 15.
FROM Zamowienia z JOIN Klienci k ON z.id_klienta = k.id_klienta;Zawsze porównuj liczbę wierszy wyniku z liczbą zamówień.
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ć
- Tabela pośrednicząca z dwoma kluczami obcymi łączy klientów z produktami.
INNER JOINpomija wiersze bez pary, aLEFT JOINje zachowuje (z NULL).- Brakujące dopasowania znajdziesz przez
LEFT JOIN ... WHERE ... IS NULL. - Przy
LEFT JOINliczCOUNT(kolumna z prawej tabeli), a nieCOUNT(*).
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ę →