Poniżej zadania dodatkowe (wykonujemy na bazie NORTHWIND)ze szczegółowym wyjaśnieniem działania parametru JOIN:
1. Wyświetl imię i nazwisko klienta oraz numer zamówienia, które złożył.
Połącz tabele klienci i zamówienia.
SELECT k.imie, k.nazwisko, z.id_zamowienia
FROM klienci k
INNER JOIN zamowienia z
ON k.id_klienta = z.id_klienta;
Przykład rozwiązania z wytłumaczeniem:
SELECT k.imie, k.nazwisko, z.id_zamowienia
FROM klienci k
INNER JOIN zamowienia z
ON k.id_klienta = z.id_klienta;
W SQL można nadać krótszą nazwę (alias) tabeli, żeby nie pisać za każdym razem jej pełnej nazwy.
Robi się to po prostu tak:
FROM klienci k
Tu:
klienci — to prawdziwa nazwa tabeli w bazie,
k — to alias, czyli tymczasowy „skrót” tej tabeli.
Od tej chwili w tym zapytaniu możesz odwoływać się do tej tabeli po aliasie k.
Bo kiedy łączymy wiele tabel, często w obu są kolumny o takich samych nazwach.
Np.:
w klienci masz id_klienta
w zamowienia też masz id_klienta
Jeśli napiszesz po prostu:
SELECT id_klienta
baza danych nie wie, z której tabeli chcemy wziąć tę kolumnę.
Dlatego musimy ją „doprecyzować”:
SELECT klienci.id_klienta
lub (krócej)
SELECT k.id_klientaWeźmy ten przykład z zadania 1:
SELECT k.imie, k.nazwisko, z.id_zamowienia
FROM klienci k
INNER JOIN zamowienia z
ON k.id_klienta = z.id_klienta;Tutaj:
k = alias tabeli klienci,
z = alias tabeli zamowienia.
Więc:
k.imie oznacza kolumnę imie z tabeli klienci,
k.nazwisko oznacza kolumnę nazwisko z tabeli klienci,
z.id_zamowienia oznacza kolumnę id_zamowienia z tabeli zamowienia.
To samo zapytanie bez aliasów wyglądałoby tak:
SELECT klienci.imie, klienci.nazwisko, zamowienia.id_zamowienia
FROM klienci
INNER JOIN zamowienia
ON klienci.id_klienta = zamowienia.id_klienta;
Zadanie 2. Wyświetl wszystkich klientów, nawet jeśli nie mają żadnych zamówień.
Użyj LEFT JOIN.
SELECT k.imie, k.nazwisko, z.id_zamowienia
FROM klienci k
LEFT JOIN zamowienia z
ON k.id_klienta = z.id_klienta;
Zadanie 3. Wyświetl imię i nazwisko pracownika oraz numer zamówienia, które obsługiwał.
Zadanie 4. Wyświetl nazwę produktu, nazwę kategorii i nazwę dostawcy.
Zadanie 5. Wyświetl wszystkie zamówienia wraz z nazwą klienta i nazwą spedytora.
Zadanie 6. Pokaż wszystkie produkty, które pojawiły się w szczegółach zamówień, wraz z ilością.
Zadanie 7. Wyświetl listę zamówień wraz z nazwiskiem klienta, nazwiskiem pracownika oraz nazwą firmy przewozowej.
SELECT z.id_zamowienia,
k.nazwisko AS klient,
p.nazwisko AS pracownik,
s.nazwa AS spedytor
FROM zamowienia z
INNER JOIN klienci k ON z.id_klienta = k.id_klienta
INNER JOIN pracownicy p ON z.id_pracownika = p.id_pracownik
INNER JOIN spedytorzy s ON z.id_spedytora = s.id_spedytora;
Zadanie 8. Pokaż nazwę produktu, ilość zamówioną i datę zamówienia.
Zadanie 9. Wyświetl nazwę działu (oddziału), imię i nazwisko pracownika, który w nim pracuje.
Zadanie 10. Pokaż zamówienia wraz z nazwą klienta i łączną wartością zamówienia (ilość × cena).
SELECT z.id_zamowienia,
k.nazwa_firmy AS klient,
SUM(sz.ilosc * pr.cena_jednostkowa) AS wartosc_zamowienia
FROM zamowienia z
INNER JOIN klienci k ON z.id_klienta = k.id_klienta
INNER JOIN szczegoly_zamowien sz ON z.id_zamowienia = sz.id_zamowienia
INNER JOIN produkty pr ON sz.id_produkt = pr.id_produkt
GROUP BY z.id_zamowienia, k.nazwa_firmy;