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.
Ćwiczenia krok po kroku – JOIN w praktyce
Wyświetl listę wszystkich gier wraz z nazwą wydawcy. Wypisz tytuł, gatunek, cenę gry oraz nazwę wydawcy.
-- 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;
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.
-- 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;
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.
-- 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;
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.
-- 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;
Policz łączny przychód z gier dla każdego wydawcy oraz liczbę sprzedanych egzemplarzy. Wykorzystaj dane z tabel
wydawcy, gry i zakupy.
-- 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;
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.
-- 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
Quiz – sprawdź wiedzę o JOIN
gracze i zakupy?