INF.03 Moduł 21 Klasa 4 TI

SELECT JOIN na GameVault

Zapytania z łączeniami tabel, raporty i wyszukiwanie danych na przykładzie bazy GameVault.

SELECT INNER JOIN LEFT JOIN GROUP BY HAVING RELACJE 1‑wiele
Σ

Teoria – kluczowe konstrukcje SELECT i JOIN

SELECT ... FROM ... WHERE

Podstawowe zapytanie odczytujące dane z tabeli. Wybierasz kolumny, tabelę oraz opcjonalny warunek filtrowania w klauzuli WHERE. Możesz także sortować wyniki za pomocą ORDER BY.

INNER JOIN

Łączy wiersze z dwóch tabel tylko wtedy, gdy istnieje dopasowanie po obu stronach warunku łączenia. W GameVault służy np. do połączenia tabeli zakupy z gracze oraz gry, aby zobaczyć kto kupił jaką grę.

LEFT JOIN

Zwraca wszystkie wiersze z tabeli lewej oraz dopasowane wiersze z tabeli prawej, a gdy dopasowania brakuje – NULL. Dzięki temu można wyszukać np. graczy bez żadnych zakupów lub gry, które nie zostały jeszcze kupione.

GROUP BY, agregacje i HAVING

GROUP BY grupuje wiersze według wybranych kolumn, a funkcje agregujące (COUNT, SUM, AVG) wyliczają wartości dla każdej grupy. Klauzula HAVING filtruje już gotowe grupy, np. graczy z co najmniej dwoma zakupami.

🗄

Baza danych GameVault – przypomnienie schematu

Korzystamy z tej samej bazy GameVault, co w module o INSERT/UPDATE/DELETE. Jeśli nie masz jej jeszcze utworzonej, użyj skryptu inicjującego z poprzedniej lekcji.

GRACZE
gracz_id INT PK
nick VARCHAR
email VARCHAR
kraj VARCHAR
GRY
gra_id INT PK
tytul VARCHAR
gatunek VARCHAR
cena DECIMAL
wydawca_id FK
ZAKUPY
zakup_id INT PK
gracz_id FK
gra_id FK
data_zakupu DATE
cena_zakupu DECIMAL
WYDAWCY
wydawca_id INT PK
nazwa VARCHAR
kraj VARCHAR

Ćwiczenia krok po kroku – JOIN w praktyce

01
Lista gier z nazwą wydawcy
INNER JOIN
ZADANIE
Wyświetl listę wszystkich gier wraz z nazwą wydawcy. Wypisz tytuł, gatunek, cenę gry oraz nazwę wydawcy.
SQL
-- Wszystkie gry z nazwą wydawcy
SELECT g.tytul,
       g.gatunek,
       g.cena,
       w.nazwa AS wydawca
FROM gry AS g
INNER JOIN wydawcy AS w
    ON g.wydawca_id = w.wydawca_id;
02
Kto kupił jaką grę?
JOIN 3 TABEL
ZADANIE
Zbuduj raport zakupów: nick gracza, tytuł gry, data zakupu i cena zakupu. Połącz tabele zakupy, gracze i gry. Posortuj wyniki rosnąco według daty zakupu.
SQL
-- Raport: kto kupił jaką grę
SELECT gr.nick,
       g.tytul,
       z.data_zakupu,
       z.cena_zakupu
FROM zakupy AS z
JOIN gracze AS gr
    ON z.gracz_id = gr.gracz_id
JOIN gry AS g
    ON z.gra_id = g.gra_id
ORDER BY z.data_zakupu ASC;
03
Gracze bez zakupów
LEFT JOIN + IS NULL
ZADANIE
Znajdź wszystkich graczy, którzy nie kupili jeszcze żadnej gry. Użyj LEFT JOIN i sprawdź, dla których graczy brak powiązanych zakupów.
SQL
-- Gracze, którzy nie mają żadnych zakupów
SELECT gr.nick,
       gr.kraj
FROM gracze AS gr
LEFT JOIN zakupy AS z
    ON gr.gracz_id = z.gracz_id
WHERE z.zakup_id IS NULL;
04
Ile gier kupił każdy gracz?
GROUP BY
ZADANIE
Policz, ile gier kupił każdy gracz. Dla każdego gracza pokaż jego nick oraz liczbę zakupów. Wynik posortuj malejąco po liczbie zakupów.
SQL
-- Liczba zakupów na gracza (łącznie z zerem)
SELECT gr.nick,
       COUNT(z.zakup_id) AS liczba_zakupow
FROM gracze AS gr
LEFT JOIN zakupy AS z
    ON gr.gracz_id = z.gracz_id
GROUP BY gr.gracz_id, gr.nick
ORDER BY liczba_zakupow DESC;
05
Sprzedaż według wydawcy
JOIN + SUM
ZADANIE
Policz łączny przychód z gier dla każdego wydawcy oraz liczbę sprzedanych egzemplarzy. Wykorzystaj dane z tabel wydawcy, gry i zakupy.
SQL
-- Przychód i liczba sprzedanych gier dla każdego wydawcy
SELECT w.nazwa AS wydawca,
       SUM(z.cena_zakupu) AS przychod,
       COUNT(z.zakup_id) AS liczba_sprzedanych
FROM wydawcy AS w
JOIN gry AS g
    ON g.wydawca_id = w.wydawca_id
JOIN zakupy AS z
    ON z.gra_id = g.gra_id
GROUP BY w.wydawca_id, w.nazwa
ORDER BY przychod DESC;
06
Gry bez żadnego zakupu
LEFT JOIN
ZADANIE
Wyświetl gry, które nie zostały jeszcze kupione przez żadnego gracza. Użyj LEFT JOIN między gry i zakupy oraz warunku na brak zakupów.
SQL
-- Gry, które nie zostały jeszcze kupione
SELECT g.tytul,
       g.gatunek,
       g.cena
FROM gry AS g
LEFT JOIN zakupy AS z
    ON g.gra_id = z.gra_id
WHERE z.zakup_id IS NULL;
📊

Zadanie projektowe – raporty z GameVault

INF.03 PROJEKT KOŃCOWY

Raporty sprzedażowe z użyciem JOIN

Wykonaj poniższe zadania na bazie GameVault. Każde zapytanie SQL opatrz komentarzem --. Zapisz polecenia w jednym pliku raporty_gamevault.sql.

Quiz – sprawdź wiedzę o JOIN

Q1
Co zwraca INNER JOIN między tabelami gracze i zakupy?
A
Tylko graczy bez żadnych zakupów
B
Wszystkich graczy, niezależnie od zakupów
C
Tylko tych graczy, którzy mają przynajmniej jeden zakup
D
Tylko rekordy z tabeli zakupy
Q2
Do czego najczęściej używa się LEFT JOIN w GameVault?
A
Do usuwania rekordów z wielu tabel
B
Do wyszukiwania rekordów bez dopasowania w drugiej tabeli, np. graczy bez zakupów
C
Tylko do liczenia sumy przychodów
D
Do sortowania według ceny
Q3
Gdzie zapisujemy warunek łączenia tabel przy użyciu JOIN?
A
Zawsze w klauzuli WHERE
B
W klauzuli ON przy JOIN, a WHERE używamy do dodatkowego filtrowania
C
Nie ma znaczenia, ON i WHERE oznaczają to samo
D
Tylko w GROUP BY
Q4
Jak policzyć liczbę zakupów na gracza z uwzględnieniem graczy bez zakupów?
A
INNER JOIN oraz COUNT(*), bez GROUP BY
B
LEFT JOIN gracze–zakupy, GROUP BY gracz_id, COUNT(zakup_id)
C
SELECT * FROM gracze bez JOIN
D
DELETE FROM zakupy, a potem SELECT
Q5
Dlaczego warto używać aliasów (np. g, gr, z) przy wielu JOIN-ach?
A
Bo inaczej zapytanie się nie wykona
B
Alias skraca zapis i poprawia czytelność oraz pozwala łatwo odróżnić kolumny z różnych tabel
C
Alias automatycznie przyspiesza działanie bazy
D
Alias działa tylko w MySQL, więc nie ma sensu go używać
0/5

Checklista umiejętności – SELECT & JOIN

Postęp 0 / 8
Tworzę proste zapytania SELECT z warunkami WHERE.
Łączę tabele za pomocą INNER JOIN po kluczu obcym.
Używam LEFT JOIN, aby znaleźć rekordy bez dopasowania (np. gracze bez zakupów).
Stosuję aliasy tabel (g, gr, z), aby zwiększyć czytelność zapytań.
Grupuję wyniki za pomocą GROUP BY i funkcji agregujących (COUNT, SUM).
Używam HAVING do filtrowania gotowych grup (np. gracze z >= 2 zakupami).
Potrafię przygotować raport łączący dane z 3 tabel (gracze, gry, zakupy).
Sprawdzam zapytania SELECT z JOIN przed ich użyciem w widokach lub aplikacji.