W dzisiejszej lekcji zagłębimy się w temat relacji między tabelami w bazach danych oraz nauczymy się, jak wykorzystywać instrukcje JOIN do łączenia danych z wielu tabel. Poznamy także klucze obce, które zapewniają spójność danych.
Bazy danych często składają się z wielu tabel, które przechowują powiązane dane. Na przykład, możemy mieć tabelę Klienci
i tabelę Zamówienia
. Relacja między nimi polega na tym, że jedno zamówienie należy do konkretnego klienta. Aby połączyć te informacje, musimy zrozumieć pojęcie kluczy.
Klucz główny (Primary Key) to unikalny identyfikator w tabeli (np. ID_Klienta
w tabeli Klienci
). Klucz obcy (Foreign Key) to kolumna w jednej tabeli, która odwołuje się do klucza głównego w innej tabeli (np. ID_Klienta
w tabeli Zamówienia
odwołuje się do ID_Klienta
w tabeli Klienci
). Klucze obce zapewniają spójność danych i pozwalają na efektywne łączenie danych.
Instrukcja JOIN
w SQL pozwala nam łączyć wiersze z dwóch lub więcej tabel na podstawie powiązanych kolumn. Najpopularniejsze typy JOIN
to:
INNER JOIN
: Zwraca tylko wiersze, dla których istnieje dopasowanie w obu tabelach. Jest to najbardziej powszechne i domyślne JOIN
.LEFT JOIN
(lub LEFT OUTER JOIN
): Zwraca wszystkie wiersze z lewej tabeli i pasujące wiersze z prawej tabeli. Jeśli w prawej tabeli nie ma dopasowania, zwraca wartości NULL
.RIGHT JOIN
(lub RIGHT OUTER JOIN
): Zwraca wszystkie wiersze z prawej tabeli i pasujące wiersze z lewej tabeli. Jeśli w lewej tabeli nie ma dopasowania, zwraca wartości NULL
.FULL OUTER JOIN
: Zwraca wszystkie wiersze z obu tabel. Jeśli w jednej tabeli nie ma dopasowania, zwraca wartości NULL
(w wielu bazach danych nie jest bezpośrednio wspierany, ale można go symulować za pomocą UNION
z LEFT
i RIGHT JOIN
).Przykład: Załóżmy, że mamy tabele Klienci
(ID_Klienta
, Imie
, Nazwisko
) i Zamówienia
(ID_Zamowienia
, ID_Klienta
, Data_Zamowienia
).
-- INNER JOIN: Pobranie imion klientów i dat zamówień
SELECT K.Imie, Z.Data_Zamowienia
FROM Klienci K
INNER JOIN Zamowienia Z ON K.ID_Klienta = Z.ID_Klienta;
-- LEFT JOIN: Pobranie wszystkich klientów i ich zamówień (jeśli istnieją)
SELECT K.Imie, Z.Data_Zamowienia
FROM Klienci K
LEFT JOIN Zamowienia Z ON K.ID_Klienta = Z.ID_Klienta;
Podstawowa składnia instrukcji JOIN
jest następująca:
SELECT kolumny
FROM tabela1
JOIN tabela2 ON tabela1.klucz_obcy = tabela2.klucz_glowny;
Gdzie:
* tabela1
i tabela2
to nazwy tabel, które chcesz połączyć.
* kolumny
to kolumny, które chcesz pobrać. Możesz użyć *
do wybrania wszystkich kolumn.
* JOIN
to typ połączenia (INNER
, LEFT
, RIGHT
, FULL
).
* ON
określa warunek łączenia (np. tabela1.klucz_obcy = tabela2.klucz_glowny
).
Ważne: Pamiętaj o aliasach tabel (np. K
dla Klienci
, Z
dla Zamowienia
) aby kod był czytelniejszy.
Explore advanced insights, examples, and bonus exercises to deepen understanding.
Witaj! Doskonale poradziliście sobie z dzisiejszymi podstawami relacji i instrukcji JOIN. Teraz rozszerzymy naszą wiedzę, zagłębiając się w bardziej zaawansowane aspekty i praktyczne zastosowania.
Pamiętacie cztery podstawowe typy JOIN: INNER JOIN
, LEFT JOIN
, RIGHT JOIN
i FULL OUTER JOIN
? Upewnijmy się, że w pełni je rozumiemy i potrafimy efektywnie wykorzystać.
INNER JOIN
: zwraca tylko te wiersze, które mają pasujące wartości w obu tabelach. To jak spotkanie tylko tych osób, które mają wspólnego znajomego.
LEFT JOIN
: zwraca wszystkie wiersze z lewej tabeli i pasujące wiersze z prawej tabeli. Jeżeli nie ma dopasowania w prawej tabeli, w kolumnach z prawej tabeli pojawią się wartości NULL
. To jak zaproszenie wszystkich na obiad, ale niektórzy znajomi mogą przyprowadzić gości.
-- Przykład: LEFT JOIN (Wyświetl wszystkich klientów i ich zamówienia)
SELECT klienci.imie, klienci.nazwisko, zamowienia.numer_zamowienia
FROM klienci
LEFT JOIN zamowienia ON klienci.id_klienta = zamowienia.id_klienta;
RIGHT JOIN
: działa odwrotnie do LEFT JOIN
- zwraca wszystkie wiersze z prawej tabeli i pasujące wiersze z lewej tabeli. NULL
w kolumnach z lewej tabeli, gdy brak dopasowania.
-- Przykład: RIGHT JOIN (Wyświetl wszystkie zamówienia i powiązanych z nimi klientów)
SELECT klienci.imie, klienci.nazwisko, zamowienia.numer_zamowienia
FROM klienci
RIGHT JOIN zamowienia ON klienci.id_klienta = zamowienia.id_klienta;
FULL OUTER JOIN
: zwraca wszystkie wiersze z obu tabel, uzupełniając brakujące wartości NULL
. Należy pamiętać, że nie wszystkie systemy baz danych obsługują FULL OUTER JOIN
bezpośrednio (np. MySQL wymaga obejścia). To jak zaproszenie wszystkich na przyjęcie, zarówno naszych, jak i obcych gości, niezależnie od tego, czy się znają.
-- Przykład: FULL OUTER JOIN (Wymaga obejścia w MySQL, np. przez UNION ALL)
SELECT klienci.imie, klienci.nazwisko, zamowienia.numer_zamowienia
FROM klienci LEFT JOIN zamowienia ON klienci.id_klienta = zamowienia.id_klienta
UNION ALL
SELECT klienci.imie, klienci.nazwisko, zamowienia.numer_zamowienia
FROM klienci RIGHT JOIN zamowienia ON klienci.id_klienta = zamowienia.id_klienta
WHERE klienci.id_klienta IS NULL; -- Wyeliminowanie duplikatów
Optymalizacja Zapytań z JOIN: wydajność zapytań jest kluczowa. Upewnij się, że:
WHERE
do filtrowania danych PRZED wykonaniem JOIN, aby zmniejszyć ilość danych do przetworzenia.Wykorzystaj poniższe schematy baz danych do wykonania ćwiczeń. Spróbuj samodzielnie stworzyć zapytania SQL.
Schemat 1:
-- Tabela: pracownicy (id_pracownika, imie, nazwisko, id_dzialu)
-- Tabela: dzialy (id_dzialu, nazwa_dzialu)
Schemat 2:
-- Tabela: produkty (id_produktu, nazwa_produktu, cena, id_kategorii)
-- Tabela: kategorie (id_kategorii, nazwa_kategorii)
Ćwiczenie 1: Napisz zapytanie, które wyświetli imiona i nazwiska wszystkich pracowników oraz nazwy ich działów. Użyj INNER JOIN
.
Ćwiczenie 2: Napisz zapytanie, które wyświetli wszystkie produkty i nazwy ich kategorii. Użyj LEFT JOIN
. Upewnij się, że wyświetlasz również produkty, które nie mają przypisanej kategorii.
Ćwiczenie 3: Załóżmy, że mamy tabelę "zamowienia" z kolumnami "id_zamowienia", "id_klienta" i "data_zamowienia". Napisz zapytanie, które użyje RIGHT JOIN
aby wyświetlić wszystkie zamówienia, oraz imiona i nazwiska klientów, którzy złożyli te zamówienia.
Relacje między tabelami i JOIN są fundamentem w wielu aplikacjach:
Praktycznie w każdym systemie, który przechowuje dane w sposób zorganizowany, relacje i JOIN są niezbędne.
Załóżmy, że chcesz zaimplementować prosty system rekomendacji produktów. Mając tabelę "użytkownicy" (id_uzytkownika, imie, preferencje) i "produkty" (id_produktu, nazwa_produktu, kategoria), oraz tabelę "historia_zakupow" (id_uzytkownika, id_produktu, data_zakupu):
JOIN
i, jeśli umiesz, funkcje agregujące).Zainteresowany dalszym rozwojem? Spróbuj:
Wykorzystując tabele `Klienci` (`ID_Klienta`, `Imie`, `Nazwisko`) i `Zamowienia` (`ID_Zamowienia`, `ID_Klienta`, `Data_Zamowienia`), napisz zapytanie, które pobiera imiona i nazwiska klientów oraz daty ich zamówień. Użyj `INNER JOIN`.
Napisz zapytanie, które pobiera wszystkich klientów i ich zamówienia (jeśli jakieś mają). Jeśli klient nie ma zamówień, wyświetl `NULL` dla daty zamówienia. Użyj `LEFT JOIN`.
Pomyśl o scenariuszu biznesowym (np. sklep internetowy, biblioteka). Jakie tabele byłyby w nim potrzebne i jakie relacje (z użyciem kluczy obcych) by między nimi istniały? Wymień co najmniej 3 tabele i ich relacje.
Rozwińmy nasz scenariusz z poprzedniego ćwiczenia. Dodaj tabelę `Produkty` (`ID_Produktu`, `Nazwa_Produktu`, `Cena`) i tabelę `Pozycje_Zamowienia` (`ID_Zamowienia`, `ID_Produktu`, `Ilosc`). Napisz zapytanie, które wyświetla imię i nazwisko klienta, nazwę produktu, ilość i cenę jednostkową dla wszystkich zamówień.
Załóżmy, że pracujesz w sklepie internetowym. Masz dostęp do bazy danych z tabelami `Klienci`, `Produkty` i `Zamówienia`. Musisz wygenerować raport, który pokaże, którzy klienci kupili najwięcej produktów (sumarycznie), a także listę tych produktów wraz z ich ilością. Jakie instrukcje SQL byś użył?
Przygotuj się na następną lekcję, która skupi się na agregacji danych w SQL: funkcjach agregujących (SUM, AVG, COUNT, MIN, MAX) oraz grupowaniu danych (GROUP BY). Postaraj się również przećwiczyć więcej zapytań JOIN.
We're automatically tracking your progress. Sign up for free to keep your learning paths forever and unlock advanced features like detailed analytics and personalized recommendations.