Baza danych

Dysponujemy bazą danych SQLite3 zapisaną w pliku uczniowie2.db. Ćwiczenia wykonamy w programie SQLiteStudio, ale można do tego celu użyć wiersza poleceń bazy SQLite3. Informacje na temat tych narzędzi zawarte zostały w materiale Definiowanie schematu bazy danych w języku SQL, etap IIPkXbedRKMDefiniowanie schematu bazy danych w języku SQL, etap II. Zapytania można również wykonać za pomocą skryptu języka Python, który omówiono w materiale Instrukcje wyszukiwania w języku SQL, etap IIIPkQh27XjUInstrukcje wyszukiwania w języku SQL, etap III.

Rc8tjUEGlXv6C

Przycisk do pobrania pliku DB z bazą danych.

Baza danych SQLite3 uczniowie2.db.
Plik DB o rozmiarze 832.00 KB w języku polskim

Po uruchomieniu programu SQLiteStudio wybierz polecenie Bazy danych | Dodaj bazę danych i wskaż położenie pliku uczniowie2.db. Następnie połącz się z bazą, dwukrotnie klikając nazwę bazy w panelu Bazy danych.

Program SQLiteStudio ułatwia poznanie schematu bazy danych, udostępniając wszystkie informacje potrzebne do poznania tabel i łączących je relacji. Po dwukrotnym kliknięciu wybranej tabeli w panelu po lewej stronie, w zakładce Struktura zobaczymy nazwy i typy danych pól zawartych w tabeli.

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

Jeżeli klikniemy zakładkę DDL, zobaczymy polecenie SQL, które zostało użyte do utworzenia danej tabeli i ewentualnych powiązań.

Rqp8BrJSzBKnG
Podgląd polecenia SQL DDL, które posłużyło do utworzenia tabeli w programie SQLiteStudio.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.
Ćwiczenie 1

Przeanalizuj schemat bazy, korzystając z informacji o tabelach widocznych na zakładkach Struktura i/lub DDL.

Grupowanie danych

Spróbujmy przeanalizować niektóre dane dotyczące uczniów zapisane w bazie danych.

Polecenie 1

Napiszmy kwerendę, która wyświetli liczbę uczniów mieszkających na tej samej ulicy.

Zacznijmy od zapytania zliczającego uczniów:

Linia 1. SELECT COUNT otwórz nawias okrągły id podkreślnik ucz zamknij nawias okrągły AS liczba podkreślnik uczniow. Linia 2. FROM uczniowie średnik.

Dzięki funkcji COUNT() dowiemy się, że w bazie zapisano dane 414 uczniów.

Jeśli jednak chcemy zobaczyć, ilu uczniów mieszka na tej samej ulicy, powinniśmy pogrupować uczniów według nazw ulic i dopiero później zliczyć poszczególne grupy.

Linia 1. SELECT ulica przecinek COUNT otwórz nawias okrągły id podkreślnik ucz zamknij nawias okrągły liczba podkreślnik uczniow. Linia 2. FROM uczniowie. Linia 3. GROUP BY ulica. Linia 4. ORDER BY liczba podkreślnik uczniow ASC średnik.

Na przykładzie tego zapytania widzimy, że do grupowania rekordów służy klauzula GROUP BY, po której podajemy nazwę pola. Ponadto w klauzuli SELECT uwzględniliśmy pole ulica, aby widzieć nazwy ulic, dla których zliczamy uczniów. Zapytanie pokazuje również, że klauzula AS jest opcjonalna, kiedy tworzymy aliasy pól. Klauzulę sortowania ORDER BY dodaliśmy dla czytelności wyników.

Początkowe zwrócone rekordy:

Linia 1. Kosmiczna 6. Linia 2. Worcella 6. Linia 3. Ksiezycowa 7. Linia 4. Baczynskiego 8. Linia 5. Kopernika 8.
Ważne!

Grupowanie poprzedza operacje wykonywane przez funkcje agregujące (np. COUNT()), które mogą działać na wszystkich rekordach, na jednej grupie lub na wielu grupach.

Polecenie 2

Napiszmy kwerendę, która poda liczbę uczniów w poszczególnych klasach.

Uzyskanie takiej informacji wymaga sięgnięcia tylko do jednej tabeli, czyli uczniowie. W klauzuli SELECT wybieramy pole klasa, według którego grupujemy rekordy, oraz pole id_ucz, które zliczamy. W ten sposób otrzymamy tabelę z liczbą uczniów w poszczególnych klasach.

Linia 1. SELECT klasa przecinek COUNT otwórz nawias okrągły id podkreślnik ucz zamknij nawias okrągły liczba podkreślnik uczniow. Linia 2. FROM uczniowie. Linia 3. GROUP BY klasa średnik.

Początkowe zwrócone rekordy:

Linia 1. 1a 30. Linia 2. 1b 29. Linia 3. 1c 30. Linia 4. 1d 27. Linia 5. 1e 32.
Polecenie 3

Napiszmy kwerendę, która wyświetli średnią ocen poszczególnych klas.

Problem sugeruje, że należy pogrupować uczniów według klas, a następnie policzyć średnią ich ocen. Źródłem kwerendy będzie zatem tabela uczniowie. Z niej wybieramy pole klasa, według którego będą grupowane rekordy. Drugą wymaganą tabelą będą oceny, z której dodajemy pole ocena i nakładamy na nie funkcję AVG() wyliczającą średnią. Zapis w języku SQL:

Linia 1. SELECT klasa przecinek AVG otwórz nawias okrągły ocena zamknij nawias okrągły srednia podkreślnik ocen. Linia 2. FROM oceny przecinek uczniowie. Linia 3. USING otwórz nawias okrągły id podkreślnik ucz zamknij nawias okrągły. Linia 4. GROUP BY klasa średnik.

Do złączenia tabel użyliśmy klauzuli USING, która może zastąpić klauzulę JOIN ON, jeżeli pola tworzące relację mają taką samą nazwę. Wyświetlone średnie ocen można zaokrąglić przy użyciu funkcji ROUND(), której argumentami są średnia ocena wyliczona przez funkcję AVG() oraz precyzja. Początek kwerendy będzie miał wtedy postać:

Linia 1. SELECT klasa przecinek ROUND otwórz nawias okrągły AVG otwórz nawias okrągły ocena zamknij nawias okrągły przecinek 2 zamknij nawias okrągły srednia podkreślnik ocen.

Początkowe zwrócone rekordy:

Linia 1. 1a 2 kropka 96. Linia 2. 1b 3. Linia 3. 1c 3 kropka 03. Linia 4. 1d 2 kropka 99. Linia 5. 1e 2 kropka 96.
Polecenie 4

Napiszmy zapytanie, które zwróci nazwę przedmiotu z najniższą średnią ocen.

Źródłem danych w zapytaniu będą tabele ocenyprzedmioty. Dane trzeba pogrupować według pola nazwa z tabeli przedmioty. W klauzuli SELECT obok nazwy przedmiotu umieścimy funkcję AVG(), której przekażemy jako argument pole ocena. Rekordy uporządkujemy rosnąco według średnich ocen, a ich liczbę ograniczymy do jednego.

Kod SQL prezentuje się następująco:

Linia 1. SELECT przedmioty kropka nazwa Przedmiot przecinek AVG otwórz nawias okrągły ocena zamknij nawias okrągły Średnia. Linia 2. FROM oceny przecinek przedmioty. Linia 3. WHERE oceny kropka id podkreślnik prz znak równości przedmioty kropka id podkreślnik prz. Linia 4. GROUP BY przedmioty kropka nazwa. Linia 5. ORDER BY Średnia ASC. Linia 6. LIMIT 1.

Operacja grupowania nie wyklucza sortowania w klauzuli ORDER BY ani ograniczania liczby zwracanych rekordów w klauzuli LIMIT.

Wynik kwerendy:

Linia 1. informatyka 2 kropka 93494228751312.
Ważne!

Sortowanie następuje po grupowaniu. Tym samym w klauzuli sortowania można podać pola, według których następuje grupowanie, lub pola, na których wykonywana jest funkcja agregująca.

Użycie podzapytań

Polecenie 5

Napiszmy zapytanie, które zwróci średnie ocen z poszczególnych przedmiotów podanej klasy, np. 1a.

Rozwiązanie zaczniemy od skonstruowania zapytania, które pobierze wszystkie oceny uczniów z podanej klasy. W wynikach kwerendy chcemy mieć nazwę klasy, nazwę przedmiotu oraz oceny, dlatego w klauzuli SELECT umieszczamy pola klasa, nazwaocena. Każde z tych pól jest w innej tabeli, warunki złączenia definiujemy za pomocą pól id_prz oraz id_ucz, które tworzą relację, w klauzuli WHERE. Dodajemy również warunek pozwalający wybrać rekordy klasy 1a. Kod SQL:

Linia 1. SELECT klasa przecinek nazwa przecinek ocena. Linia 2. FROM oceny przecinek przedmioty przecinek uczniowie. Linia 3. WHERE oceny kropka id podkreślnik prz znak równości przedmioty kropka id podkreślnik prz. Linia 4. AND oceny kropka id podkreślnik ucz znak równości uczniowie kropka id podkreślnik ucz. Linia 5. AND klasa znak równości apostrof 1a apostrof średnik.

Wynikiem kwerendy będzie tabela ocen podanej klasy. Początkowe rekordy:

Linia 1. 1a niemiecki 4. Linia 2. 1a angielski 3. Linia 3. 1a niemiecki 3. Linia 4. 1a niemiecki 4. Linia 5. 1a fizyka 4.

Teraz zaprojektujemy końcową kwerendę, która pogrupuje oceny według nazw przedmiotów, obliczy średnią dla każdej grupy i wyświetli nazwy przedmiotów oraz średnie ocen. Poprzednie zapytanie umieścimy w klauzuli FROM jako źródło końcowej kwerendy.

Kod SQL przyjmie postać:

Linia 1. SELECT nazwa przecinek AVG otwórz nawias okrągły ocena zamknij nawias okrągły. Linia 2. FROM. Linia 3. otwórz nawias okrągły SELECT klasa przecinek nazwa przecinek ocena. Linia 4. FROM oceny przecinek przedmioty przecinek uczniowie. Linia 5. WHERE oceny kropka id podkreślnik prz znak równości przedmioty kropka id podkreślnik prz. Linia 6. AND oceny kropka id podkreślnik ucz znak równości uczniowie kropka id podkreślnik ucz. Linia 7. AND klasa znak równości apostrof 1a apostrof zamknij nawias okrągły. Linia 8. GROUP BY nazwa średnik.
Ważne!

Kwerendy wykorzystywane wewnątrz innej kwerendy nazywamy podzapytaniami. Po podzapytaniach nie stawiamy średników, są one wykonywane w pierwszej kolejności.

Ćwiczenie 2

Dodaj do ostatniej kwerendy sortowanie malejące wyników według średniej ocen z przedmiotów.

Kwerenda parametryczna

Ostatnia kwerenda byłaby o wiele bardziej użyteczna, gdyby pozwalała na podawanie nazwy klasy przed wykonaniem. Taką możliwość łatwo uzyskać, przekształcając zapytanie w kwerendę parametrycznąkwerenda parametrycznakwerendę parametryczną. Wystarczy zamiast nazwy klasy wpisać znak zapytania. Zapytanie przyjmie następującą postać:

Linia 1. SELECT nazwa przecinek AVG otwórz nawias okrągły ocena zamknij nawias okrągły. Linia 2. FROM. Linia 3. otwórz nawias okrągły SELECT klasa przecinek nazwa przecinek ocena. Linia 4. FROM oceny przecinek przedmioty przecinek uczniowie. Linia 5. WHERE oceny kropka id podkreślnik prz znak równości przedmioty kropka id podkreślnik prz. Linia 6. AND oceny kropka id podkreślnik ucz znak równości uczniowie kropka id podkreślnik ucz. Linia 7. AND klasa znak równości znak zapytania zamknij nawias okrągły. Linia 8. GROUP BY nazwa średnik.
RzIH6SAyF2Ubk
Okno Parametry zapytania w programie SQLiteStudio.
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-ND 3.0.

Podane zapytanie wykona się w programie SQLiteStudio, który wyświetli okno dialogowe pozwalające podać odpowiednią wartość. Nazwę klasy należy wprowadzić w zakładce Tekst i kliknąć OK.

W wierszu poleceń bazy SQLite lub w zapytaniach wykonywanych przy użyciu skryptu Pythona kwerenda nie zadziała.

Filtrowanie grup rekordów

Polecenie 6

Napiszmy zapytanie, które zwróci nazwy i średnią ocen klas, jeżeli średnia ocen będzie większa od 3.

Problem postawiony w zadaniu podobny jest do zadania, w którym chcieliśmy otrzymać średnie oceny wszystkich klas. Rozwiązanie opiera się więc na poprzedniej kwerendzie:

Linia 1. SELECT klasa przecinek AVG otwórz nawias okrągły ocena zamknij nawias okrągły srednia podkreślnik ocen. Linia 2. FROM oceny przecinek uczniowie. Linia 3. USING otwórz nawias okrągły id podkreślnik ucz zamknij nawias okrągły. Linia 4. GROUP BY klasa. Linia 5. HAVING srednia podkreślnik ocen zamknij nawias ostrokątny 3 średnik.

Nowością jest klauzula HAVING, która może występować tylko po klauzuli grupującej. Używamy jej wtedy, kiedy nakładamy jakieś warunki na grupy rekordów.

Zwrócone rekordy:

Linia 1. 1c 3 kropka 03068783068783. Linia 2. 2a 3 kropka 02972195589645. Linia 3. 2d 3 kropka 04003724394786. Linia 4. 3b 3 kropka 01615074024226. Linia 5. 3e 3 kropka 02485795454545.

Warunki z klauzuli WHERE nakładane są przed grupowaniem. Tym samym odfiltrowane rekordy nie są brane pod uwagę przy grupowaniu. W powyższym przykładzie moglibyśmy wykluczyć z otrzymanego zestawienia, np. klasy o profilu matematycznym. Na potrzeby przykładu załóżmy, że są to wszystkie klasy z literą „a” w nazwie:

Linia 1. SELECT klasa przecinek AVG otwórz nawias okrągły ocena zamknij nawias okrągły srednia podkreślnik ocen. Linia 2. FROM oceny przecinek uczniowie. Linia 3. USING otwórz nawias okrągły id podkreślnik ucz zamknij nawias okrągły. Linia 4. WHERE klasa NOT LIKE apostrof procent a apostrof. Linia 5. GROUP BY klasa. Linia 6. HAVING srednia podkreślnik ocen zamknij nawias ostrokątny 3 średnik.

Zwrócone rekordy:

Linia 1. 1c 3 kropka 03068783068783. Linia 2. 2d 3 kropka 04003724394786. Linia 3. 3b 3 kropka 01615074024226. Linia 4. 3e 3 kropka 02485795454545.

Słownik

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

kwerenda parametryczna
kwerenda parametryczna

kwerenda, w której wartości w wyrażeniach warunkowych są parametrem podawanym przed wykonaniem zapytania; parametry oznaczane są znakami zapytania