Wykonując ćwiczenia przedstawione w tym e‑materiale, nabierzesz wprawy w posługiwaniu się kwerendamikwerendakwerendami w konkretnych sytuacjach problemowych. Tym razem zajmiemy się zapytaniami grupującymi dane, które wymagają także poprawnego zastosowania funkcji agregujących.
Pliki potrzebne do ćwiczeń
W e‑materiale Bazy danych – ćwiczenia, etap IPzdnHclWpBazy danych – ćwiczenia, etap I dowiedzieliśmy się, jak zainstalować pakiet XAMPP. Znaleźć tam można również pliki baz danych potrzebne do wykonania ćwiczeń w całej serii oraz opis struktury tabel, czyli ich przeznaczenie oraz typ wartości każdej kolumny we wszystkich wykorzystywanych bazach danych.
Ważne!
Wykorzystywane bazy danych pochodzą z zadań maturalnych.
Zadania oraz bazy zostały opracowane przez Centralną Komisję Egzaminacyjną i pojawiły się na egzaminach maturalnych z informatyki (poziom rozszerzony, cz. ):
w maju roku (baza vod),
w maju roku (baza rekrutacja),
w czerwcu roku (baza jezyki).
Wszystkie arkusze egzaminacyjne można znaleźć na stronie internetowej CKE.
Polecenia do zrealizowania
Ta część e‑materiału zawiera zestaw poleceń do wykonania, wyniki działania kwerend, przykładowe rozwiązania zadań oraz wnioski z każdego wykonanego ćwiczenia.
Polecenie 1
Baza danych: vod
Kinomani korzystający z usługi VOD chcą się dowiedzieć, jaki jest średni koszt wypożyczenia filmów z każdego dostępnego gatunku. Wyniki uporządkuj rosnąco, zaczynając od gatunku, dla którego wypożyczenie filmu kosztuje średnio najmniej.
Poprawne wyniki kwerendy – zwróconych rekordów: 10
Gatunek
SredniKoszt
horror
6.3402
komedia
6.3614
fantazy
6.5000
thriller
6.5652
familijny
6.7647
przygodowy
6.7907
SF
6.8148
wojenny
6.9403
dramat
7.0000
melodramat
7.0000
Przykładowa poprawna kwerenda:
Linia 1. SELECT Gatunek przecinek AVG otwórz nawias okrągły Cena podkreślnik w podkreślnik zl zamknij nawias okrągły AS SredniKoszt.
Linia 2. FROM filmy przecinek wypozyczenia WHERE.
Linia 3. filmy kropka ID podkreślnik filmu znak równości wypozyczenia kropka ID podkreślnik filmu.
Linia 4. GROUP BY Gatunek ORDER BY SredniKoszt.
Wnioski płynące z tego zapytania:
Funkcja agregująca AVG() pozwala obliczyć średnią wartość we wskazanej jako argument kolumnie – w analizowanym przez nas przypadku jest to atrybut: Cena_w_zl, zaś rekordy grupujemy oczywiście według kolumny Gatunek.
W zapytaniu użyto dodatkowo aliasu definiowanego klauzulą AS, który nadał nowo utworzonej wirtualnej kolumnie nazwę: SredniKoszt.
Pomiędzy użytymi w zapytaniu dwoma tabelami istnieje powiązanie: ID_filmu w tabeli filmy (klucz podstawowy) jest powiązany z atrybutem o tej samej nazwie w tabeli wypozyczenia (klucz obcy). Jest to relacja typu jeden do wielu.
Nowego atrybutu o nazwie SredniKoszt również można użyć do uporządkowania wyników. Sam fakt, że jest to kolumna wirtualna, stworzona tylko na potrzeby tej kwerendy, nie przeszkodzi w żaden sposób klauzuli ORDER BY dokonać sortowania.
Zwróćmy uwagę, że obliczona średnia cena niejednokrotnie jest wartością rozwiniętą do czterech miejsc po przecinku – to dość niepraktyczne w kontekście zajmowania się walutą. Najmniejszą częścią złotówki jest przecież grosz, stanowiący setną część całości. Aby uniknąć tego problemu, można zastosować w kwerendzie zaokrąglenie wartości na przykład poprzez użycie funkcji ROUND() z dodatkowym parametrem o wartości 2, określającym, do ilu miejsc dziesiętnych zaokrąglić liczbę (patrz zapytanie poniżej):
Wersja alternatywna, z zaokrągleniem wyników:
Linia 1. SELECT Gatunek przecinek ROUND otwórz nawias okrągły AVG otwórz nawias okrągły Cena podkreślnik w podkreślnik zl zamknij nawias okrągły przecinek 2 zamknij nawias okrągły AS SredniKoszt.
Linia 2. FROM filmy przecinek wypozyczenia WHERE.
Linia 3. filmy kropka ID podkreślnik filmu znak równości wypozyczenia kropka ID podkreślnik filmu.
Linia 4. GROUP BY Gatunek ORDER BY SredniKoszt.
Polecenie 2
Baza danych: vod
Wypisz tytuły poszczególnych filmów „mocnych wrażeń” (horrorów lub thrillerów) oraz łączną liczbę ich wypożyczeń w całej bazie danych. Rekordy ułóż, zaczynając od pozycji najczęściej wybieranej przez użytkowników, przy czym interesują nas jedynie trzy najpopularniejsze filmy z tych gatunków.
Poprawne wyniki kwerendy – zwróconych rekordów: 3
Tytul
IleWypozyczen
Czysta krew
24
Gothica
13
1408
11
Przykładowa poprawna kwerenda:
Linia 1. SELECT Tytul przecinek COUNT otwórz nawias okrągły ID podkreślnik wyp zamknij nawias okrągły AS IleWypozyczen.
Linia 2. FROM filmy przecinek wypozyczenia WHERE.
Linia 3. otwórz nawias okrągły Gatunek znak równości cudzysłów horror cudzysłów OR Gatunek znak równości cudzysłów thriller cudzysłów zamknij nawias okrągły.
Linia 4. AND filmy kropka ID podkreślnik filmu znak równości wypozyczenia kropka ID podkreślnik filmu GROUP BY Tytul.
Linia 5. ORDER BY IleWypozyczen DESC LIMIT 3.
Wnioski płynące z tego zapytania:
Funkcja agregująca COUNT() pozwala zliczać rekordy (wiersze) spełniające zadane przez nas kryteria, zaś zgrupować musimy je tym razem według tytułów filmów.
Warto zwrócić uwagę, że argumentem funkcji COUNT() może być dowolny atrybut (kolumna) rekordu; można też ewentualnie użyć zapisu: COUNT(*).
W zapytaniu użyto dodatkowo aliasu definiowanego klauzulą AS, który nadał nowo utworzonej wirtualnej kolumnie nazwę: IleWypozyczen.
Warunki logiczne połączone spójnikiem OR zamknięto w nawiasach okrągłych z powodu hierarchii operatorów logicznych - spójnik AND jest silniejszy niż OR.
Pomiędzy użytymi w zapytaniu dwoma tabelami istnieje powiązanie: ID_filmu w tabeli filmy (klucz podstawowy) jest powiązany z atrybutem o tej samej nazwie w tabeli wypozyczenia (klucz obcy). Jest to relacja typu jeden do wielu.
Sortowanie w sposób malejący osiągnięto dopisaniem modyfikatora DESC do klauzuli ORDER BY.
Ograniczenie maksymalnej liczby zwracanych rekordów do trzech można osiągnąć klauzulą LIMIT 3, dopisaną koniecznie na końcu kwerendy.
Polecenie 3
Baza danych: vod
Stwórz zapytanie, które zgrupuje wypożyczenia filmów według użytkowników, którzy wydali w wypożyczalni najwięcej pieniędzy. Wybrane numery PESEL tych klientów oraz dotychczasowe wydatki poniesione przez każdego z nich mają zostać ułożone malejąco według wielkości tych kosztów, zaczynając od kinomana, który łącznie wydał najwięcej. Interesuje nas tylko pięciu najwierniejszych klientów.
Poprawne wyniki kwerendy – zwróconych rekordów: 5
Pesel
IleWydano
89122589754
77
90051902315
50
88022685902
45
83081788913
43
78061600937
42
Przykładowa poprawna kwerenda:
Linia 1. SELECT Pesel przecinek SUM otwórz nawias okrągły Cena podkreślnik w podkreślnik zl zamknij nawias okrągły AS IleWydano.
Linia 2. FROM filmy przecinek wypozyczenia WHERE.
Linia 3. filmy kropka ID podkreślnik filmu znak równości wypozyczenia kropka ID podkreślnik filmu.
Linia 4. GROUP BY Pesel ORDER BY IleWydano DESC LIMIT 5.
Wnioski płynące z tego zapytania:
Funkcja agregująca SUM() pozwala obliczyć łączną sumę wartości we wskazanej jako argument kolumnie. U nas musi to być atrybut: Cena_w_zl, zaś grupujemy rekordy koniecznie według kolumny Pesel, gdyż zależy nam na sumie wydatków poszczególnych osób.
W zapytaniu użyto dodatkowo aliasu definiowanego klauzulą AS, który nadał nowo utworzonej wirtualnej kolumnie nazwę: IleWydano.
Nie trzeba w zapytaniu używać tabeli klienci, ponieważ atrybut Pesel znajduje się także w tabeli wypozyczenia. Natomiast trzeba koniecznie użyć tabeli filmy ze względu na obecność w niej niezbędnego atrybutu Cena_w_zl.
Pomiędzy użytymi w zapytaniu dwoma tabelami istnieje powiązanie: ID_filmu w tabeli filmy (klucz podstawowy) jest powiązany z atrybutem o tej samej nazwie w tabeli wypozyczenia (klucz obcy). Jest to relacja typu jeden do wielu.
Sortowanie w sposób malejący osiągnięto dopisaniem modyfikatora DESC do klauzuli ORDER BY.
Ograniczenie maksymalnej liczby zwracanych rekordów do pięciu można osiągnąć klauzulą LIMIT 5, dopisaną koniecznie na końcu kwerendy.
Polecenie 4
Baza danych: rekrutacja
Uporządkuj przedszkola malejąco według popularności ich wybierania przez rodziców. Podaj nazwę przedszkola oraz liczbę dzieci zapisanych na pierwszą preferencję dla pięciu najbardziej obleganych placówek.
Poprawne wyniki kwerendy – zwróconych rekordów: 5
Nazwa_przedszkola
IleZgloszen
Przedszkole nr 75
168
Przedszkole nr 84
122
Niepubliczne Przedszkole Cogito
110
Przedszkole nr 74
105
Przedszkole nr 85
90
Przykładowa, poprawna kwerenda:
Linia 1. SELECT Nazwa podkreślnik przedszkola przecinek COUNT otwórz nawias okrągły Id zamknij nawias okrągły AS IleZgloszen.
Linia 2. FROM przedszkola przecinek preferencje WHERE Numer podkreślnik preferencji znak równości 1.
Linia 3. AND przedszkola kropka Id podkreślnik przedszkola znak równości preferencje kropka Id podkreślnik przedszkola.
Linia 4. GROUP BY Nazwa podkreślnik przedszkola ORDER BY IleZgloszen DESC LIMIT 5.
Wnioski płynące z tego zapytania:
Funkcja agregująca COUNT() pozwala zliczać rekordy (wiersze) spełniające zadane przez nas kryteria, zaś zgrupować musimy tym razem według nazw przedszkoli.
Warto zwrócić uwagę, iż argumentem funkcji COUNT() może być dowolny atrybut (kolumna) rekordu, można też ewentualnie użyć zapisu: COUNT(*).
W zapytaniu użyto dodatkowo aliasu definiowanego klauzulą AS, który nadał nowo utworzonej, wirtualnej kolumnie nazwę: IleZgloszen.
Pomiędzy użytymi w zapytaniu dwoma tabelami istnieje powiązanie: Id_przedszkola w tabeli przedszkola (klucz podstawowy) jest powiązany z atrybutem o tej samej nazwie w tabeli preferencje (klucz obcy). Jest to relacja typu jeden do wielu.
Sortowanie w sposób malejący uzyskano przez dopisanie modyfikatora DESC do klauzuli ORDER BY.
Ograniczenie maksymalnej liczby zwracanych rekordów do pięciu można osiągnąć klauzulą LIMIT 5, dopisaną koniecznie na końcu kwerendy.
Polecenie 5
Baza danych: jezyki
Ułóż państwa azjatyckie w kolejności malejącej według liczby używanych w nich języków, ale tylko nieurzędowych. Kwerenda powinna zwrócić 10 nazw państw wraz z liczbą używanych w każdym z nich nieoficjalnie języków.
Poprawne wyniki kwerendy – zwróconych rekordów: 10
Panstwo
IleJezykow
Indie
58
Indonezja
44
Chiny
33
Wietnam
20
Birma
18
Filipiny
17
Tajlandia
9
Pakistan
8
Turcja
8
Afganistan
7
Przykładowa poprawna kwerenda:
Linia 1. SELECT uzytkownicy kropka Panstwo przecinek COUNT otwórz nawias okrągły Id zamknij nawias okrągły AS IleJezykow.
Linia 2. FROM panstwa przecinek uzytkownicy WHERE Kontynent znak równości cudzysłów Azja cudzysłów.
Linia 3. AND Urzedowy znak równości cudzysłów nie cudzysłów AND.
Linia 4. panstwa kropka Panstwo znak równości uzytkownicy kropka Panstwo.
Linia 5. GROUP BY uzytkownicy kropka Panstwo.
Linia 6. ORDER BY IleJezykow DESC LIMIT 10.
Wnioski płynące z tego zapytania:
Funkcja agregująca COUNT() pozwala zliczać rekordy (wiersze) spełniające zadane przez nas kryteria, zaś zgrupować musimy tym razem według nazwy państwa, w dodatku unikając wieloznaczności atrybutu zapisem uzytkownicy.Panstwo zamiast Panstwo. Oczywiście zapis: panstwa.Panstwo również okaże się jednoznaczny i można go użyć.
Warto zwrócić uwagę, że argumentem funkcji COUNT() może być dowolny atrybut (kolumna) rekordu; można też ewentualnie użyć zapisu: COUNT(*).
W zapytaniu użyto dodatkowo aliasu definiowanego klauzulą AS, który nadał nowo utworzonej, wirtualnej kolumnie nazwę: IleJezykow.
Wartość atrybutu Urzedowy jako łańcuch koniecznie należy zamknąć w cudzysłowie lub ewentualnie w apostrofach.
Pomiędzy użytymi w zapytaniu dwoma tabelami istnieje powiązanie: Panstwo w tabeli panstwa (klucz podstawowy) jest powiązany z atrybutem o tej samej nazwie w tabeli uzytkownicy (klucz obcy). Jest to relacja typu jeden do wielu.
Sortowanie w sposób malejący osiągnięto dopisaniem modyfikatora DESC do klauzuli ORDER BY.
Ograniczenie maksymalnej liczby zwracanych rekordów do dziesięciu można osiągnąć klauzulą LIMIT 10, dopisaną koniecznie na końcu kwerendy.
Polecenie 6
Baza danych: jezyki
Dla każdej rodziny językowej, której nazwa rozpoczyna się na literę „a”, wyznacz łączną populację ludności posługującej się językami należącymi do tej rodziny. Wyniki uporządkuj alfabetycznie według nazwy rodziny językowej.
Poprawne wyniki kwerendy – zwróconych rekordów: 5
Rodzina
IluLudzi
abchasko‑adygijska
2.000000014901161
afroazjatycka
335.6000004336238
algijska
0.10000000149011612
austroazjatycka
85.60000318288803
austronezyjska
303.400003015995
Przykładowa poprawna kwerenda:
Linia 1. SELECT Rodzina przecinek SUM otwórz nawias okrągły Uzytkownicy zamknij nawias okrągły AS IluLudzi.
Linia 2. FROM jezyki przecinek uzytkownicy WHERE Rodzina LIKE cudzysłów a procent cudzysłów.
Linia 3. AND jezyki kropka Jezyk znak równości uzytkownicy kropka Jezyk.
Linia 4. GROUP BY Rodzina ORDER BY Rodzina.
Wnioski płynące z tego zapytania:
Funkcja agregująca SUM() pozwala obliczyć łączną sumę wartości we wskazanej jako argument kolumnie – u nas musi to być atrybut: Uzytkownicy. Natomiast grupujemy rekordy koniecznie według kolumny Rodzina, gdyż zależy nam na liczbie osób posługujących się językami należącymi do danej rodziny językowej.
W zapytaniu użyto dodatkowo aliasu definiowanego klauzulą AS, który nadał nowo utworzonej, wirtualnej kolumnie nazwę: IluLudzi.
Klauzula LIKE posłużyła do znalezienia nazwisk rozpoczynających się na literę „a”. Ponieważ musi to być pierwsza litera nazwy rodziny językowej, operator % zapisano wyłącznie po prawej stronie litery. Operator ten oznacza: „brak znaku, jakikolwiek jeden znak lub wiele znaków” (w przeciwieństwie do operatora: _ reprezentującego zawsze dokładnie jeden znak).
Pomiędzy użytymi w zapytaniu dwoma tabelami istnieje powiązanie: Jezyk w tabeli jezyki (klucz podstawowy) jest powiązany z atrybutem o tej samej nazwie w tabeli uzytkownicy (klucz obcy). Jest to relacja typu jeden do wielu.
Niewielka niedokładność wyników, objawiająca się w wartościach występujących po kilku miejscach po przecinku, wynika z zastosowania zapisu mantysowo‑wykładniczego, czyli standardu o nazwie IEEE 754, służącego do reprezentowania liczb zmiennoprzecinkowych – sumowana kolumna o nazwie Uzytkownicy jest typu FLOAT. Oczywiście nic nie stoi na przeszkodzie, aby zastosować w kwerendzie zaokrąglenie wartości, np. za pomocą funkcji ROUND(), do jednego miejsca po przecinku (patrz zapytanie poniżej):
Wersja alternatywna, z zaokrągleniem wyników:
Linia 1. SELECT Rodzina przecinek ROUND otwórz nawias okrągły SUM otwórz nawias okrągły Uzytkownicy zamknij nawias okrągły przecinek 1 zamknij nawias okrągły AS IluLudzi.
Linia 2. FROM jezyki przecinek uzytkownicy WHERE Rodzina LIKE cudzysłów a procent cudzysłów.
Linia 3. AND jezyki kropka Jezyk znak równości uzytkownicy kropka Jezyk.
Linia 4. GROUP BY Rodzina ORDER BY Rodzina.
Słownik
kwerenda
kwerenda
(ang. query – zapytanie) – zapisane z użyciem języka SQL polecenie skierowane do systemu bazodanowego, którego celem może być: pobranie, dodanie, modyfikacja lub usunięcie danych albo sposobu ich przechowywania w systemie
pole
pole
(inaczej: kolumna tabeli) – jednostkowa cecha opisująca element (obiekt) tabeli, np. pole „Nazwisko” może być jedną z kolumn tabeli „Uczeń”
rekord
rekord
(inaczej: wiersz tabeli lub krotka) – pojedynczy kompletny zestaw danych dotyczący konkretnego elementu (obiektu) w tabeli
SZBD
SZBD
System Zarządzania Bazą Danych – narzędzie/aplikacja do tworzenia bazy danych (np. MySQL, PostgreSQL, Firebird, Oracle, Microsoft Access)
tabela
tabela
podstawowa struktura logiczna relacyjnej bazy danych definiowana jako zestaw pól (kolumn) opisujących właściwości obiektów, które ma przechowywać