Baza danych

W pliku firma.sql.zip zapisano schemat oraz dane bazy danych firma. Pobieramy plik i zapisujemy w wybranym katalogu.

RWurtRPL0qGDI

Przycisk do pobrania pliku ZIP z treścią zadania.

Plik firma.sql.zip
Plik ZIP o rozmiarze 184.53 KB w języku polskim

Uruchamiamy środowisko XAMPP, otwieramy przeglądarkę i w polu adresu wpisujemy localhost. Po załadowaniu się strony powitalnej klikamy link phpMyAdmin w prawym górnym rogu.

Wykonujemy import bazy firma. W tym celu klikamy zakładkę Import, a następnie przycisk Przeglądaj i wskazujemy zapisany plik firma.sql. Następnie klikamy przycisk Import na dole strony. Po wykonaniu operacji zobaczymy komunikat „Import zakończony sukcesem, wykonano 43 zapytań. (firma.sql)”. Ewentualne komunikaty o błędach pomijamy.

W przypadku problemów ze środowiskiem XAMPP analizowane zapytania SQL można również wykonać w:

  • programie SQLiteStudio,

  • wierszu poleceń bazy SQLite3,

  • skryptach języka Python.

Informacje na temat instalacji i korzystania z tych narzędzi zamieszczone zostały w materiałach: Definiowanie schematu bazy danych w języku SQL, etap IIPkXbedRKMDefiniowanie schematu bazy danych w języku SQL, etap II oraz Instrukcje wyszukiwania w języku SQL, etap IIIPkQh27XjUInstrukcje wyszukiwania w języku SQL, etap III.

RZLsWheAcGoa7

Przycisk do pobrania pliku DB z treścią zadania.

Plik firma.db
Plik DB o rozmiarze 920.00 KB w języku polskim

Schemat bazy

Utworzoną bazę danych wybieramy w lewym panelu aplikacji phpMyAdmin. Po wybraniu nazwy tabeli zobaczymy zawarte w niej pola i dane, w zakładce Struktura znajdziemy informacje na temat typów danych i ewentualnych ograniczeń.

R1A2LYkk4fAa0
Podgląd struktury tabeli w aplikacji phpMyAdmin.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Relacje między tabelami możemy podejrzeć po wybraniu opcji Widok relacyjny w zakładce Struktura.

R1FcLxisN7WQS
Podgląd relacji między tabelami w aplikacji phpMyAdmin.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

Baza zawiera pięć tabel.

W tabeli klienci występują pola:

  • id_kCHAR, tekstowy identyfikator klienta, klucz główny,

  • imie, nazwiskoVARCHAR,

  • id_us, id_wINT, liczba całkowita, pola identyfikatora urzędu skarbowego i identyfikatora województwa, klucze obce,

  • nipCHAR,

  • kod, miejscowosc, ulica, nr_domuCHARVARCHAR, pola tekstowe z informacjami adresowymi.

W tabeli produkty występują pola:

  • id_pCHAR, tekstowy identyfikator produktu, klucz główny,

  • nazwa_p, jednVARCHAR, pola tekstowe z nazwą i jednostką produktu,

  • jedn_cenaDECIMAL, cena za jednostkę produktu.

W tabeli transakcje występują pola:

  • id_tCHAR, tekstowy identyfikator transakcji, klucz główny,

  • id_k, id_pCHAR, tekstowe identyfikatory klienta i produktu, klucze obce,

  • iloscINT,

  • data_tDATE.

W tabeli uskarbowe występują pola:

  • id_usINT, liczba całkowita, identyfikator urzędu skarbowego, klucz główny,

  • nazwa_usVARCHAR.

W tabeli wojewodztwa występują pola:

  • id_wINT, liczba całkowita, identyfikator województwa, klucz główny,

  • nazwa_wVARCHAR.

Tabele klienciuskarbowe łączy relacja jeden‑do‑wielu. Tabele klienciwojewództwa łączy relacja jeden‑do‑wielu. Tabele klienciprodukty łączy relacja wiele‑do‑wielu definiowana przez relacje jeden‑do‑wielu z każdej z tych tabel do tabeli pośredniej transakcje.

Podane zapytania wprowadzamy do pola tekstowego po wybraniu bazy firma w lewym panelu i otworzeniu zakładki SQL – powinniśmy widzieć w niej komunikat „Wykonanie zapytania/zapytań SQL do bazy danych firma:”. Wpisane lub wklejone zapytanie zostanie wykonane po kliknięciu przycisku Wykonaj na dole strony. Po wyświetleniu wyników zapytania należy kliknąć przycisk Pokaż okno zapytań, aby powrócić do okna Wykonanie zapytania.

Analiza danych

Polecenie 1

Przygotuj zapytanie zwracające identyfikatory, nazwy i liczbę sprzedaży produktów. Dane uporządkuj malejąco według liczby sprzedaży.

Skonstruujemy kwerendę krok po kroku.

Linia 1. SELECT asterysk FROM produkty średnik.

Prosta kwerenda wybierająca pokaże informacje o towarach. Spróbujmy policzyć, który sprzedawał się najczęściej.

Linia 1. SELECT COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły. Linia 2. FROM transakcje. Linia 3. WHERE id podkreślnik p znak równości apostrof EG apostrof średnik.

Zapytanie zwróci wartość 1333.

Powyższe zapytanie używa funkcji agregującejfunkcje agregującefunkcji agregującej COUNT() do zliczenia rekordów z tabeli transakcje, w których identyfikator produktu ma wartość EG. Ale czy musimy wykonywać taką kwerendę dla każdego produktu? Nie.

Język SQL definiuje klauzulę GROUP BY kolumna, służącą do zgrupowaniagrupowaniezgrupowania rekordów według powtarzających się wartości w podanej kolumnie. Spróbujemy wykorzystać ją do pogrupowania rekordów z tabeli transakcje według identyfikatorów produktów, a następnie zliczymy każdą grupę. Słowo kluczowe AS pozwala na nadanie nazwy kolumnie, w której znajdą się wyniki zliczania.

Linia 1. SELECT id podkreślnik p przecinek COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły AS liczba podkreślnik sprzedazy. Linia 2. FROM transakcje. Linia 3. GROUP BY id podkreślnik p średnik.

Wyniki możemy dodatkowo posortować malejąco, umieszczając na końcu zapytania klauzulę ORDER BY liczba_sprzedazy DESC. Zwróćmy uwagę, że nazwa pola liczba_sprzedazy jest aliasem funkcji agregującej.

Nadal nie mamy nazw produktów, dlatego warto rozszerzyć kwerendę o dane z tabeli produkty.

Linia 1. SELECT id podkreślnik p przecinek nazwa podkreślnik p przecinek COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły liczba podkreślnik sprzedazy. Linia 2. FROM transakcje. Linia 3. JOIN produkty USING otwórz nawias okrągły id podkreślnik p zamknij nawias okrągły. Linia 4. GROUP BY id podkreślnik p. Linia 5. ORDER BY liczba podkreślnik sprzedazy DESC średnik.

Domyślnym typem łączenia tabel jest łączenie wewnętrzne, dlatego klauzulę INNER można pominąć. Jeżeli pola łączące obydwie tabele mają taką samą nazwę (id_p), możemy zastosować alternatywną dla klauzuli ON instrukcję USING. Warto również zauważyć, że podczas tworzenia aliasów możemy pomijać klauzulę AS.

Początkowe zwrócone rekordy:

Linia 1. M Mial weglowy 1806. Linia 2. EGS Wegiel Eko Groszek SILESIAN 1800. Linia 3. OO Olej opalowy 1353. Linia 4. EG Wegiel Eko Groszek PROMETEUSZ 1333. Linia 5. K Wegiel – Koks 907.
Polecenie 2

Skonstruuj zapytanie, które wyliczy i pokaże wartość sprzedaży poszczególnych produktów. W wynikach posortowanych malejąco według wartości sprzedaży powinny znaleźć się również pola identyfikatora, nazwy i ceny jednostkowej produktu.

Wbrew pozorom nie musimy pisać zupełnie nowej kwerendy, wystarczy, że zmodyfikujemy poprzednią. Możemy to zrobić np. w ten sposób:

Linia 1. SELECT id podkreślnik p przecinek nazwa podkreślnik p przecinek jedn podkreślnik cena przecinek otwórz nawias okrągły COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły asterysk jedn podkreślnik cena zamknij nawias okrągły AS wartosc podkreślnik sprzedazy. Linia 2. FROM transakcje. Linia 3. JOIN produkty USING otwórz nawias okrągły id podkreślnik p zamknij nawias okrągły. Linia 4. GROUP BY id podkreślnik p. Linia 5. ORDER BY wartosc podkreślnik sprzedazy DESC średnik.

Wyrażenie (COUNT(*) * jedn_cena) tworzy tzw. pole wyliczeniowe, którego wartość jest obliczana w trakcie wykonywania kwerendy.

Początkowe zwrócone rekordy:

Linia 1. OO Olej opalowy 3520 4762560. Linia 2. EGS Wegiel Eko Groszek SILESIAN 919 1654200. Linia 3. EG Wegiel Eko Groszek PROMETEUSZ 859 1145047. Linia 4. K Wegiel – Koks 1159 1051213. Linia 5. M Mial weglowy 569 1027614.
Polecenie 3

Napisz zapytanie, które zwróci nazwy produktów o wartości sprzedaży większej niż milion. Wyniki uporządkuj malejąco według wartości sprzedaży.

Poprzednie zapytanie pokazało wartość sprzedaży wszystkich produktów. Jeżeli chcemy nałożyć na tę wartość jakiś warunek, nie możemy tego zrobić w klauzuli WHERE, ponieważ jest ona wykonywana przed grupowaniem rekordów, a wartość sprzedaży, czyli funkcja agregująca, jest w tym przypadku wykonywana po grupowaniu. W takich sytuacjach używamy klauzuli HAVING, w której podajemy warunki nakładane na pogrupowane rekordy.

Linia 1. SELECT id podkreślnik p przecinek nazwa podkreślnik p przecinek jedn podkreślnik cena przecinek otwórz nawias okrągły COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły asterysk jedn podkreślnik cena zamknij nawias okrągły AS wartosc podkreślnik sprzedazy. Linia 2. FROM transakcje. Linia 3. JOIN produkty USING otwórz nawias okrągły id podkreślnik p zamknij nawias okrągły. Linia 4. GROUP BY id podkreślnik p. Linia 5. HAVING wartosc podkreślnik sprzedazy zamknij nawias ostrokątny 1000000. Linia 6. ORDER BY wartosc podkreślnik sprzedazy DESC średnik.

Zwrócone rekordy:

Linia 1. OO Olej opalowy 3520 4762560. Linia 2. EGS Wegiel Eko Groszek SILESIAN 919 1654200. Linia 3. EG Wegiel Eko Groszek PROMETEUSZ 859 1145047. Linia 4. K Wegiel – Koks 1159 1051213. Linia 5. M Mial weglowy 569 1027614.
Polecenie 4

Przygotuj kwerendę pokazującą imiona, nazwiska klientów i liczbę dokonanych przez nich zakupów. Uporządkowane malejąco według liczby zakupów wyniki powinny zawierać dane tylko tych osób, które kupowały w firmie więcej niż 10 razy.

Zaczynamy od zliczenia transakcji poszczególnych klientów:

Linia 1. SELECT id podkreślnik k przecinek COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły AS liczba podkreślnik zakupow. Linia 2. FROM transakcje. Linia 3. GROUP BY id podkreślnik k. Linia 4. HAVING liczba podkreślnik zakupow zamknij nawias ostrokątny 10. Linia 5. ORDER BY liczba podkreślnik zakupow DESC średnik.

Zapytanie wybiera rekordy z tabeli transakcje, grupuje według identyfikatorów klientów i zlicza każdą grupę. Dodamy teraz dane osobowe klientów, dołączając tabelę klienci:

Linia 1. SELECT imie przecinek nazwisko przecinek COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły AS liczba podkreślnik zakupow. Linia 2. FROM transakcje. Linia 3. JOIN klienci USING otwórz nawias okrągły id podkreślnik k zamknij nawias okrągły. Linia 4. GROUP BY transakcje kropka id podkreślnik k. Linia 5. HAVING liczba podkreślnik zakupow zamknij nawias ostrokątny 10. Linia 6. ORDER BY liczba podkreślnik zakupow DESC średnik.

Początkowe zwrócone rekordy:

Linia 1. Tworzyslawa Romanuszko 16. Linia 2. Wrocislawa Pergulak 14. Linia 3. Sulislawa Pierzchat 14. Linia 4. Selma Chalminski 14. Linia 5. Nina Wedolski 14.

Widzimy już imiona i nazwiska, spróbujmy dowiedzieć się czegoś więcej o klientach firmy.

Polecenie 5

Przygotuj kwerendę, która wyświetli liczbę klientów z poszczególnych województw. Wyniki powinny zostać uporządkowane malejąco według liczby klientów.

Interesujące nas dane znajdują się w tabelach klienciwojewodztwa. Żeby policzyć klientów z poszczególnych województw, dane należy pogrupować według identyfikatorów województw lub ich nazw:

Linia 1. SELECT nazwa podkreślnik w przecinek COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły AS liczba podkreślnik klientow. Linia 2. FROM klienci. Linia 3. INNER JOIN wojewodztwa USING otwórz nawias okrągły id podkreślnik w zamknij nawias okrągły. Linia 4. GROUP BY id podkreślnik w. Linia 5. ORDER BY COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły DESC średnik.

W klauzuli ORDER BY możemy podawać funkcje agregujące lub ich aliasy.

Początkowe zwrócone rekordy:

Linia 1. mazowieckie 224. Linia 2. slaskie 182. Linia 3. lodzkie 119. Linia 4. wielkopolskie 112. Linia 5. dolnoslaskie 105.

Najwięcej klientów jest z województwa mazowieckiego. Duża liczba klientów z poszczególnych województw niekoniecznie musi się jednak przekładać na liczbę zamówień. Sprawdźmy.

Polecenie 6

Utwórz kwerendę, która pokaże, z których województw firma ma najwięcej zamówień.

Uzyskanie potrzebnych informacji wymaga użycia trzech tabel źródłowych: transakcje, klienciwojewodztwa. Interesuje nas liczba transakcji zawartych przez klientów z poszczególnych województw, dlatego dane pogrupujemy według ich identyfikatorów (lub nazw). Dołączamy tabelę klienci, ponieważ kojarzy klientów z województwami, które z kolei odczytujemy z drugiej dołączonej tabeli wojewodztwa.

Linia 1. SELECT nazwa podkreślnik w przecinek COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły AS liczba podkreślnik zamowien. Linia 2. FROM transakcje. Linia 3. INNER JOIN klienci USING otwórz nawias okrągły id podkreślnik k zamknij nawias okrągły. Linia 4. INNER JOIN wojewodztwa USING otwórz nawias okrągły id podkreślnik w zamknij nawias okrągły. Linia 5. GROUP BY id podkreślnik w. Linia 6. ORDER BY COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły DESC średnik.

Początkowe zwrócone rekordy:

Linia 1. mazowieckie 1533. Linia 2. slaskie 1165. Linia 3. lodzkie 809. Linia 4. dolnoslaskie 729. Linia 5. wielkopolskie 721.

Wyniki zapytania pozwalają stwierdzić, że na pierwszych pięciu miejscach liczba klientów idzie w parze z liczbą transakcji. Wniosek ten wymaga jednak sprawdzenia.

Polecenie 7

Skonstruuj kwerendę wyświetlającą nazwy województw i odpowiadające im liczby transakcji i klientów.

Podobnie jak w dwóch poprzednich zapytaniach rekordy z tabeli transakcje pogrupujemy według województw. Liczbę transakcji uzyskamy, zliczając identyfikatory klientów, które mogą się w tabeli powtarzać. Dlatego użyjemy klauzuli DISTINCT, aby uzyskać liczbę unikalnych klientów.

Linia 1. SELECT nazwa podkreślnik w przecinek COUNT otwórz nawias okrągły id podkreślnik k zamknij nawias okrągły liczba podkreślnik transakcji przecinek COUNT otwórz nawias okrągły DISTINCT otwórz nawias okrągły id podkreślnik k zamknij nawias okrągły zamknij nawias okrągły liczba podkreślnik klientow. Linia 2. FROM transakcje. Linia 3. INNER JOIN klienci USING otwórz nawias okrągły id podkreślnik k zamknij nawias okrągły. Linia 4. INNER JOIN wojewodztwa USING otwórz nawias okrągły id podkreślnik w zamknij nawias okrągły. Linia 5. GROUP BY id podkreślnik w. Linia 6. ORDER BY COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły DESC średnik.

Początkowe zwrócone rekordy:

Linia 1. mazowieckie 1533 213. Linia 2. slaskie 1165 168. Linia 3. lodzkie 809 110. Linia 4. dolnoslaskie 729 100. Linia 5. wielkopolskie 721 107.

Jeżeli przeanalizujemy wyniki poprzedniej kwerendy, która zwracała liczbę klientów z poszczególnych województw, zauważymy, że klientów z województwa mazowieckiego było 224, a ze śląskiego 182. Jednak ostatnia kwerenda w polu liczba_klientow podaje inne wyniki: 213 i 168 odpowiednio. Dlaczego?

Polecenie 8

Skonstruuj zapytanie pozwalające sprawdzić, czy są w bazie klienci, którzy nie zakupili żadnego towaru. Kwerenda powinna zwrócić liczbę takich klientów.

Żeby odpowiedzieć na to pytanie, użyjemy innego niż zazwyczaj typu złączenia. Najczęstsze złączenie INNER JOIN dopasowuje rekordy na podstawie takiej samej wartości w polach tworzących relację między tabelami. Są zwracane tylko pasujące rekordy.

Mamy jednak również złączenia lewo- i prawostronne, czyli LEFT lub RIGHT JOIN. Dane pobierane są wtedy z obydwu tabel, rekordy są dopasowywane, ale zapytanie zwraca również rekordy, dla których nie znaleziono danych w drugiej tabeli. Pola z tej tabeli są wypełniane wartościami NULL. Spróbujmy wykonać poniższą kwerendę:

Linia 1. SELECT DISTINCT otwórz nawias okrągły nazwisko zamknij nawias okrągły przecinek klienci kropka id podkreślnik k przecinek transakcje kropka id podkreślnik k. Linia 2. FROM klienci. Linia 3. LEFT JOIN transakcje USING otwórz nawias okrągły id podkreślnik k zamknij nawias okrągły. Linia 4. ORDER BY transakcje kropka id podkreślnik k średnik.

Wybieramy rekordy z tabeli klienci i dopasowujemy je do rekordów z tabeli transakcje. Jest to złączenie lewostronne, więc zostają zwrócone wszystkie rekordy z tabeli klienci, również tych klientów, których identyfikatory nie wystąpiły w tabeli transakcje. Pola z tabeli transakcje dla klientów, którzy niczego nie kupili, są wypełniane wartościami NULL.

Początkowe zwrócone rekordy:

Linia 1. Baluszewski AdBa399 NULL. Linia 2. Pihulak AgPi19586 NULL. Linia 3. Cierbi AnCi6725 NULL. Linia 4. Jaskowiec BeJa6450 NULL. Linia 5. Kosmeda BeKo3804 NULL.

Rekordy z wartościami NULL możemy wybrać, korzystając z warunku w klauzuli WHERE, a na koniec wystarczy je zliczyć przy użyciu funkcji agregującej. Zapytanie może wyglądać następująco:

Linia 1. SELECT COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły klienci podkreślnik bez podkreślnik zamowien. Linia 2. FROM klienci. Linia 3. LEFT JOIN transakcje USING otwórz nawias okrągły id podkreślnik k zamknij nawias okrągły. Linia 4. WHERE transakcje kropka id podkreślnik k IS NULL średnik.

W ten sposób dowiemy się, że mamy w bazie 77 klientów, którzy nie złożyli żadnego zamówienia.

Ważne!

Bazy SQLite3 obsługują tylko złączenia LEFT JOIN.

Ćwiczenie 1

Podczas używania złączeń lewostronnych należy pamiętać o właściwej kolejności tabel w klauzulach FROMJOIN.

Wykonaj „odwróconą” kwerendę i wyjaśnij, czym uwarunkowany jest jej wynik.

Linia 1. SELECT COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły. Linia 2. FROM transakcje. Linia 3. LEFT JOIN klienci USING otwórz nawias okrągły id podkreślnik k zamknij nawias okrągły. Linia 4. WHERE klienci kropka id podkreślnik k IS NULL średnik.
Polecenie 9

Przygotuj zapytanie pozwalające odpowiedzieć na pytanie, ilu klientów z województwa mazowieckiego nie kupiło żadnego produktu.

Rozbudowujemy poprzednią kwerendę o złączenie INNER JOIN z tabelą wojewodztwa i dodajemy warunek w klauzuli WHERE:

Linia 1. SELECT nazwa podkreślnik w przecinek COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły. Linia 2. FROM klienci. Linia 3. INNER JOIN wojewodztwa USING otwórz nawias okrągły id podkreślnik w zamknij nawias okrągły. Linia 4. LEFT JOIN transakcje USING otwórz nawias okrągły id podkreślnik k zamknij nawias okrągły. Linia 5. WHERE transakcje kropka id podkreślnik k IS NULL AND nazwa podkreślnik w znak równości apostrof mazowieckie apostrof średnik.

Dostajemy odpowiedź. Dla 11 klientów nie ma żadnego wpisu w tabeli transakcje. Wynik zgadza się z wcześniejszymi obserwacjami. Liczba klientów z mazowieckiego, którzy zawarli transakcje, wyniosła 213. Jeżeli dodamy 11, uzyskamy wynik 224, czyli liczbę wszystkich klientów z tego województwa.

Słownik

funkcje agregujące
funkcje agregujące

funkcje umożliwiające wykonywanie obliczeń na grupach rekordów oraz wyszukiwanie i zliczanie rekordów spełniających określone warunki

grupowanie
grupowanie

tworzenie zbiorów rekordów na podstawie takich samych wartości z podanej kolumny; grupowanie zazwyczaj poprzedza zastosowanie funkcji agregującej, która przeprowadza obliczenia na grupie rekordów