🚀 Ćwiczenie: JOIN w MySQL

Łączenie tabel - podstawy i zaawansowane techniki

🎯 Cel ćwiczenia

Naucz się efektywnie łączyć tabele w MySQL! JOIN to jedna z najważniejszych funkcji SQL, która pozwala na pobieranie danych z wielu tabel w jednym zapytaniu.

Czego się nauczysz:

  • INNER JOIN - podstawowe łączenie tabel
  • LEFT JOIN i RIGHT JOIN - łączenie z zachowaniem wszystkich wierszy z jednej tabeli
  • FULL OUTER JOIN - łączenie z zachowaniem wszystkich wierszy
  • SELF JOIN - łączenie tabeli samej ze sobą
  • CROSS JOIN - iloczyn kartezjański
  • Łączenie wielu tabel w jednym zapytaniu
  • Optymalizacja zapytań z JOIN
Wymagania wstępne: Powinieneś znać podstawy SQL (SELECT, WHERE, GROUP BY). Będziemy pracować na bazie "szkola".

📥 Pobierz bazę danych do ćwiczeń

Baza "szkola" zawiera tabele: uczniowie, nauczyciele, przedmioty, oceny, klasy

Plik zawiera kompletną bazę z przykładowymi danymi

🔗 Część 1: Podstawy JOIN

JOIN pozwala na łączenie danych z wielu tabel na podstawie wspólnych kolumn.

Przykład 1: INNER JOIN - podstawowe łączenie

-- Pokaż uczniów wraz z ich ocenami SELECT u.imie, u.nazwisko, o.ocena, o.data FROM uczniowie u INNER JOIN oceny o ON u.id = o.uczen_id ORDER BY u.nazwisko, o.data;
Wyjaśnienie: INNER JOIN zwraca tylko te wiersze, dla których warunek łączenia jest spełniony w obu tabelach.

Przykład 2: LEFT JOIN - zachowaj wszystkie wiersze z lewej tabeli

-- Pokaż wszystkich uczniów, nawet tych bez ocen SELECT u.imie, u.nazwisko, o.ocena FROM uczniowie u LEFT JOIN oceny o ON u.id = o.uczen_id ORDER BY u.nazwisko;
Wyjaśnienie: LEFT JOIN zwraca wszystkie wiersze z lewej tabeli (uczniowie) i dopasowane wiersze z prawej tabeli (oceny). Jeśli nie ma dopasowania, zwraca NULL.

Przykład 3: RIGHT JOIN - zachowaj wszystkie wiersze z prawej tabeli

-- Pokaż wszystkie oceny, nawet jeśli nie ma przypisanego ucznia SELECT u.imie, u.nazwisko, o.ocena FROM uczniowie u RIGHT JOIN oceny o ON u.id = o.uczen_id ORDER BY o.data;

🔀 Część 2: Zaawansowane JOIN

Przykład 4: Łączenie wielu tabel

-- Pokaż uczniów, ich oceny i przedmioty SELECT u.imie, u.nazwisko, p.nazwa AS przedmiot, o.ocena FROM uczniowie u JOIN oceny o ON u.id = o.uczen_id JOIN przedmioty p ON o.przedmiot_id = p.id ORDER BY u.nazwisko, p.nazwa;

Przykład 5: SELF JOIN - łączenie tabeli samej ze sobą

-- Znajdź pary uczniów z tej samej klasy SELECT u1.imie AS uczen1, u1.nazwisko AS nazwisko1, u2.imie AS uczen2, u2.nazwisko AS nazwisko2, u1.klasa FROM uczniowie u1 JOIN uczniowie u2 ON u1.klasa = u2.klasa AND u1.id < u2.id ORDER BY u1.klasa, u1.nazwisko;
Wyjaśnienie: SELF JOIN jest używany, gdy chcemy porównać wiersze w tej samej tabeli. Warunek u1.id < u2.id zapobiega duplikatom.

Przykład 6: CROSS JOIN - iloczyn kartezjański

-- Utwórz wszystkie możliwe kombinacje uczniów i przedmiotów SELECT u.imie, u.nazwisko, p.nazwa AS przedmiot FROM uczniowie u CROSS JOIN przedmioty p ORDER BY u.nazwisko, p.nazwa;
Wyjaśnienie: CROSS JOIN tworzy iloczyn kartezjański - każdy wiersz z pierwszej tabeli jest łączony z każdym wierszem z drugiej tabeli.

Przykład 7: LEFT JOIN z warunkiem - znajdź uczniów bez ocen

-- Znajdź uczniów, którzy nie mają żadnych ocen SELECT u.imie, u.nazwisko, u.klasa FROM uczniowie u LEFT JOIN oceny o ON u.id = o.uczen_id WHERE o.id IS NULL;

✏️ ZADANIA PRAKTYCZNE - POZIOM PODSTAWOWY

Zadanie 1: Podstawowe JOIN

ŁATWY

Napisz zapytania używające JOIN:

  1. Wyświetl wszystkich uczniów wraz z ich klasami
  2. Pokaż oceny uczniów wraz z nazwami przedmiotów
  3. Wyświetl nauczycieli i przedmioty, których uczą
  4. Pokaż uczniów, którzy mają oceny z matematyki

Zadanie 2: LEFT JOIN i RIGHT JOIN

ŁATWY

Użyj LEFT JOIN i RIGHT JOIN:

  1. Znajdź uczniów, którzy nie mają żadnych ocen
  2. Pokaż wszystkie przedmioty, nawet te bez przypisanych nauczycieli
  3. Wyświetl wszystkich nauczycieli, nawet tych bez przypisanych przedmiotów
  4. Znajdź przedmioty, które nie mają żadnych ocen

✏️ ZADANIA PRAKTYCZNE - POZIOM ZAAWANSOWANY

Zadanie 3: Łączenie wielu tabel

ŚREDNI

Stwórz złożone zapytania łączące wiele tabel:

  1. Wyświetl uczniów, ich oceny, przedmioty i nauczycieli tych przedmiotów
  2. Pokaż średnią ocen każdego ucznia z każdego przedmiotu
  3. Wyświetl ranking klas według średniej ocen
  4. Pokaż nauczycieli i liczbę uczniów, których uczą

Zadanie 4: SELF JOIN i CROSS JOIN

ŚREDNI

Użyj SELF JOIN i CROSS JOIN:

  1. Znajdź pary uczniów z tej samej klasy (SELF JOIN)
  2. Utwórz plan zajęć - wszystkie możliwe kombinacje klas i przedmiotów (CROSS JOIN)
  3. Znajdź uczniów, którzy mają taką samą średnią ocen (SELF JOIN)
  4. Utwórz kalendarz ocen - wszystkie możliwe kombinacje uczniów i miesięcy (CROSS JOIN)

Zadanie 5: Analiza danych z JOIN

TRUDNY

Stwórz zaawansowane analizy:

  1. Pokaż uczniów, którzy mają oceny wyższe niż średnia ich klasy
  2. Wyświetl nauczycieli i średnią ocen z ich przedmiotów
  3. Znajdź pary przedmiotów, które mają podobną średnią ocen
  4. Pokaż trendy w ocenach - porównaj średnie z różnych miesięcy

💡 WSKAZÓWKI PRO

1. Używaj aliasów dla czytelności

-- Zamiast: SELECT uczniowie.imie, uczniowie.nazwisko, oceny.ocena FROM uczniowie INNER JOIN oceny ON uczniowie.id = oceny.uczen_id; -- Używaj aliasów: SELECT u.imie, u.nazwisko, o.ocena FROM uczniowie u INNER JOIN oceny o ON u.id = o.uczen_id;

2. Uważaj na duplikaty w JOIN

JOIN może tworzyć duplikaty, jeśli w jednej z tabel są powtarzające się wartości w kolumnie łączącej.

-- Użyj DISTINCT aby uniknąć duplikatów SELECT DISTINCT u.imie, u.nazwisko FROM uczniowie u JOIN oceny o ON u.id = o.uczen_id;

3. Optymalizuj zapytania z JOIN

  • Używaj WHERE do filtrowania przed JOIN
  • Twórz indeksy na kolumnach używanych w JOIN
  • Unikaj SELECT * - wybieraj tylko potrzebne kolumny
-- Zamiast: SELECT * FROM uczniowie u JOIN oceny o ON u.id = o.uczen_id; -- Wybierz tylko potrzebne kolumny: SELECT u.imie, u.nazwisko, o.ocena FROM uczniowie u JOIN oceny o ON u.id = o.uczen_id;

Częste błędy w JOIN:

  • ❌ Zapominanie o warunku JOIN - tworzy iloczyn kartezjański
  • ❌ Mylenie INNER JOIN z LEFT JOIN
  • ❌ Używanie WHERE zamiast ON dla warunków łączenia
  • ❌ Nieprawidłowe aliasy
  • ❌ Łączenie zbyt wielu tabel na raz - utrudnia czytelność

🏆 MEGA WYZWANIE - System Raportowania

Stwórz kompletny system raportowania używając JOIN:

  1. Raport uczniów: Pokaż wszystkich uczniów z ich średnimi ocen i liczbą ocen
  2. Raport klas: Wyświetl klasy z ich średnimi, najlepszymi uczniami i nauczycielami
  3. Raport nauczycieli: Pokaż nauczycieli z przedmiotami, średnimi ocen i liczbą uczniów
  4. Analiza trendów: Porównaj średnie ocen z różnych miesięcy
  5. Wykrywanie anomalii: Znajdź uczniów, których oceny znacząco odbiegają od średniej klasy

🎓 Test Wiedzy - JOIN w MySQL

Pytania kontrolne:

  1. Jaka jest różnica między INNER JOIN a LEFT JOIN? (Odp: INNER JOIN zwraca tylko pasujące wiersze, LEFT JOIN zwraca wszystkie wiersze z lewej tabeli)
  2. Do czego służy SELF JOIN? (Odp: Do łączenia tabeli samej ze sobą)
  3. Czym jest iloczyn kartezjański? (Odp: Każdy wiersz z pierwszej tabeli połączony z każdym wierszem z drugiej tabeli)
  4. Jak znaleźć rekordy, które nie mają pasujących rekordów w innej tabeli? (Odp: Użyć LEFT JOIN z warunkiem IS NULL)
  5. Dlaczego warto używać aliasów w JOIN? (Odp: Dla czytelności i skrócenia zapytania)

🎉 GRATULACJE!

Ukończyłeś ćwiczenie z JOIN w MySQL! Jesteś teraz w stanie:

  • ✅ Łączyć tabele za pomocą INNER JOIN, LEFT JOIN, RIGHT JOIN
  • ✅ Używać SELF JOIN do porównywania wierszy w tej samej tabeli
  • ✅ Tworzyć zapytania łączące wiele tabel
  • ✅ Znajdować rekordy bez pasujących wartości
  • ✅ Optymalizować zapytania z JOIN

JOIN to potężne narzędzie - wykorzystuj je mądrze! 🚀💪