W załączonych plikach znajdziesz bazę danych Uczniowie w formacie przeznaczonym dla programu LibreOffice Base (rozszerzenie .odb) oraz Microsoft Access (rozszerzenie .accdb). Pobierz odpowiedni plik i zapisz na dysku.
R3uP93Ta7Xjzp
Baza danych "Uczniowie" w formacie LibreOffice Base
W wybranym programie otwórz odpowiednią bazę. Wykorzystaj widok projektu tabeli oraz widok relacji, aby poznać schemat bazy danych.
Baza zawiera cztery tabele.
W tabeli uczniowie występują pola:
id – INTEGER, liczba całkowita, klucz główny,
imie, nazwisko – TEXT, krótki tekst,
plec – BOOLEAN, tak/nie, wartość PRAWDA (Tak) oznacza kobietę.
id_klasy – INTEGER, liczba całkowita, klucz obcy,
egz_hum, egz_mat, egz_jez – DECIMAL, Podwójna precyzja, dwa miejsca dziesiętne po przecinku.
W tabeli klasy występują pola:
id – INTEGER, liczba całkowita, klucz główny,
nazwa – TEXT, krótki tekst,
rok_naboru, rok_matury – INTEGER, liczba całkowita.
W tabeli przedmioty występują pola:
id – INTEGER, liczba całkowita, klucz główny,
nazwa, imie_naucz, nazw_naucz – TEXT, krótki tekst,
plec – BOOLEAN, tak/nie, wartość PRAWDA (Tak) oznacza kobietę.
W tabeli oceny występują pola:
id – INTEGER, liczba całkowita, klucz główny,
id_ucznia, id_przedmiotu – INTEGER, liczba całkowita, klucze obce,
data – DATE, data/godzina,
ocena – DECIMAL, Podwójna precyzja, dwa miejsca dziesiętne po przecinku.
Tabele klasy i uczniowie łączy relacja jeden‑do‑wielu. Tabele uczniowie i przedmioty łączy relacja wiele‑do‑wielu definiowana przez relację jeden‑do‑wielu z każdej z tych tabel do tabeli oceny.
Podane dalej polecenia SQL wykonujemy po otwarciu projektu kwerendy w widoku SQL.
Funkcje agregujące
Język SQL zawiera zestaw użytecznych funkcji agregującychfunkcje agregującefunkcji agregujących, które służą do wykonywania obliczeń bądź innych operacji na grupach rekordów. Są to:
COUNT() – zwraca liczbę rekordów spełniających podane kryteria;
AVG() – zwraca średnią wartość wyliczoną dla pól zawierających liczby;
SUM() – oblicza sumę dla pól zawierających liczby;
MIN() – zwraca wartość minimalną zapisaną we wskazanych polach liczbowych i tekstowych;
MAX() – zwraca wartość maksymalną zapisaną we wskazanych polach liczbowych i tekstowych.
Funkcji agregujących możemy używać między innymi do:
wykonywania obliczeń na wynikach zwracanych przez inne klauzule,
liczenia zgrupowanych rekordów,
wyliczania średniej albo sumy wartości z wybranej kolumny,
znajdowania wartości skrajnych we wskazanej kolumnie.
Wykorzystamy przedstawione funkcje do przeanalizowania informacji z przykładowej bazy.
Na początku sprawdźmy, ile kobiet i ilu mężczyzn zostało zapisanych w bazie. Informację na temat płci znajdziemy w tabeli uczniowie – jest to pole typu BOOLEAN, czyli przechowujące wartość TRUE (PRAWDA, Tak) lub FALSE (FAŁSZ, Nie). W naszym przypadku wartość PRAWDA (Tak) oznacza płeć żeńską.
Zacznijmy od kwerendy zliczającej wszystkie rekordy:
Przykład 1
Linia 1. SELECT COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły.
Linia 2. FROM uczniowie średnik.
SELECT COUNT(*)
FROM uczniowie;
Znak „*” jako argument funkcji COUNT() oznacza zliczanie wszystkich rekordów, w tym zawierających wartość NULL.
Wynikiem będzie liczba 156 oraz nagłówek pola COUNT(*) (LibreOffice Base) lub Expr1000 (Microsoft Access).
Do poprzedniego zapytania dodamy warunek, dzięki któremu z tabeli wybrane zostaną rekordy, w których pole plec będzie miało wartość PRAWDA:
Przykład 2
Linia 1. SELECT COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły AS liczba podkreślnik kobiet.
Linia 2. FROM uczniowie.
Linia 3. WHERE plec znak równości TRUE średnik.
SELECT COUNT(*) AS liczba_kobiet
FROM uczniowie
WHERE plec = TRUE;
Wynikiem będzie liczba 65 oraz nagłówek pola liczba_kobiet dzięki użyciu klauzuli AS, która pozwala podawać aliasy pól.
Ważne!
W zależności od systemu bazodanowego, a także od narzędzia, którego używamy do budowania zapytań, warunki nakładane na pola typu BOOLEAN można wyrażać w inny sposób, np.: plec = 1 (działa w LibreOffice Base) lub plec IS TRUE.
Zliczać można również tylko wybrane pola, co jest przydatne np. wtedy, kiedy szukamy wartości unikalnych. Wtedy używamy klauzuli DISTINCT:
Przykład 3
Użycie klauzuli DISTINCT w LibreOffice Base:
Linia 1. SELECT COUNT otwórz nawias okrągły DISTINCT imie zamknij nawias okrągły AS liczba podkreślnik imion.
Linia 2. FROM uczniowie.
Linia 3. WHERE plec znak równości TRUE średnik.
SELECT COUNT(DISTINCT imie) AS liczba_imion
FROM uczniowie
WHERE plec = TRUE;
Użycie klauzuli DISTINCT w Microsoft Access:
Linia 1. SELECT COUNT otwórz nawias okrągły asterysk zamknij nawias okrągły AS liczba podkreślnik imion.
Linia 2. FROM.
Linia 3. otwórz nawias okrągły SELECT DISTINCT imie FROM uczniowie WHERE plec znak równości TRUE zamknij nawias okrągły średnik.
SELECT COUNT(*) AS liczba_imion
FROM
(SELECT DISTINCT imie FROM uczniowie WHERE plec = TRUE);
W Microsoft Access klauzula DISTINCT występuje w podzapytaniupodzapytaniepodzapytaniu, którego wyniki stają się źródłem dla kwerendy zliczającej.
Wynikiem kwerendy będzie wartość 31, czyli liczba niepowtarzających się imion żeńskich zapisanych w tabeli.
Warunki służące do wskazania zliczanych wierszy można formułować nie tylko za pomocą klauzuli WHERE. Oto przykłady użycia instrukcji warunkowychinstrukcja warunkowainstrukcji warunkowych:
Przykład 4
Użycie instrukcji CASE warunek THEN wartość_prawda END w LibreOffice Base:
Linia 1. SELECT.
Linia 2. COUNT otwórz nawias okrągły CASE WHEN plec znak równości 1 THEN plec END zamknij nawias okrągły AS liczba podkreślnik kobiet przecinek.
Linia 3. COUNT otwórz nawias okrągły CASE WHEN plec znak równości 0 THEN plec END zamknij nawias okrągły AS liczba podkreślnik mezczyzn.
Linia 4. FROM uczniowie średnik.
SELECT
COUNT(CASE WHEN plec = 1 THEN plec END) AS liczba_kobiet,
COUNT(CASE WHEN plec = 0 THEN plec END) AS liczba_mezczyzn
FROM uczniowie;
Jeżeli warunek po klauzuli WHEN jest prawdziwy, zwracana jest podana wartość_prawda.
W programie Microsoft Access korzystamy z funkcji IIF lub SWITCH w podzapytaniu:
Linia 1. SELECT COUNT otwórz nawias okrągły lk zamknij nawias okrągły AS liczba podkreślnik kobiet przecinek COUNT otwórz nawias okrągły lm zamknij nawias okrągły AS liczba podkreślnik mezczyzn.
Linia 2. FROM.
Linia 3. otwórz nawias okrągły SELECT IIf otwórz nawias okrągły plec znak równości TRUE przecinek 1 zamknij nawias okrągły AS lk przecinek IIf otwórz nawias okrągły plec znak równości FALSE przecinek 0 zamknij nawias okrągły AS lm FROM uczniowie zamknij nawias okrągły średnik.
SELECT COUNT(lk) AS liczba_kobiet, COUNT(lm) AS liczba_mezczyzn
FROM
(SELECT IIf(plec = TRUE, 1) AS lk, IIf(plec = FALSE, 0) AS lm FROM uczniowie);
Linia 1. SELECT COUNT otwórz nawias okrągły lk zamknij nawias okrągły AS liczba podkreślnik kobiet przecinek COUNT otwórz nawias okrągły lm zamknij nawias okrągły AS liczba podkreślnik mezczyzn.
Linia 2. FROM.
Linia 3. otwórz nawias okrągły SELECT SWITCH otwórz nawias okrągły plec znak równości TRUE przecinek 1 zamknij nawias okrągły AS lk przecinek SWITCH otwórz nawias okrągły plec znak równości FALSE przecinek 0 zamknij nawias okrągły AS lm FROM uczniowie zamknij nawias okrągły średnik.
SELECT COUNT(lk) AS liczba_kobiet, COUNT(lm) AS liczba_mezczyzn
FROM
(SELECT SWITCH(plec = TRUE, 1) AS lk, SWITCH(plec = FALSE, 0) AS lm FROM uczniowie);
Ogólna składnia funkcji warunkowych dostępnych w Microsoft Access to: IIF (wyrażenie, wartość_prawda, wartość_fałsz) oraz SWITCH (wyrażenie, wartość_prawda). Jeżeli wyrażenie jest prawdziwe, zwracana jest podana wartość_prawda.
W powyższych kwerendach jako wartość_prawda możemy podawać dowolne wartości, które mogą być później zliczone.
Wszystkie podane kwerendy zwrócą wyniki: 65 i 91.
Informację o liczbie kobiet i mężczyzn można również uzyskać za pomocą klauzuli GROUP BY, która na początku grupuje rekordy (w tym wypadku według wartości prawda i fałsz), a później przekazuje je do funkcji agregującej:
Linia 1. SELECT plec przecinek COUNT otwórz nawias okrągły plec zamknij nawias okrągły AS liczba.
Linia 2. FROM uczniowie.
Linia 3. GROUP BY plec średnik.
SELECT plec, COUNT(plec) AS liczba
FROM uczniowie
GROUP BY plec;
Jeszcze innym sposobem uzyskania informacji dotyczącej liczby kobiet jest użycie funkcji SUM(). Ponieważ typ BOOLEAN jest podtypem liczbowym, możemy przekształcić go na liczbę i zsumować.
Przykład 5
W LO Base:
Linia 1. SELECT SUM otwórz nawias okrągły CAST otwórz nawias okrągły plec AS INT zamknij nawias okrągły zamknij nawias okrągły AS liczba podkreślnik kobiet.
Linia 2. FROM uczniowie średnik.
SELECT SUM(CAST (plec AS INT)) AS liczba_kobiet
FROM uczniowie;
W LO Base reprezentacją liczbową logicznej wartości TRUE jest wartość 1. Instrukcja CAST pozwala przekształcać typy danych na inne, o ile to możliwe. W tym wypadku typ BOOLEAN zamieniamy na liczbę całkowitą, tj. typ INT.
W MS Access:
Linia 1. SELECT ABS otwórz nawias okrągły SUM otwórz nawias okrągły INT otwórz nawias okrągły plec zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły AS liczba podkreślnik kobiet.
Linia 2. FROM uczniowie średnik.
SELECT ABS(SUM(INT(plec))) AS liczba_kobiet
FROM uczniowie;
W MS Access reprezentacją liczbową logicznej wartości TRUE jest wartość -1. Funkcja INT() jest specyficzna dla MS Access. W podanym przykładzie można ją pominąć, ponieważ instrukcja SUM(plec) dokonuje konwersji automatycznie. Funkcja ABS() zwraca wartość bezwzględną liczby.
Teraz spróbujmy się dowiedzieć, jakie są średnie wyniki egzaminów z różnych przedmiotów:
Przykład 6
Linia 1. SELECT AVG otwórz nawias okrągły egz podkreślnik hum zamknij nawias okrągły przecinek AVG otwórz nawias okrągły egz podkreślnik mat zamknij nawias okrągły przecinek AVG otwórz nawias okrągły egz podkreślnik jez zamknij nawias okrągły.
Linia 2. FROM uczniowie średnik.
SELECT AVG(egz_hum), AVG(egz_mat), AVG(egz_jez)
FROM uczniowie;
Po wykonaniu kwerendy może się okazać, że dokładność wyników (liczba cyfr po przecinku) znacznie przekracza nasze potrzeby. Możemy jednak w prosty sposób ograniczyć długość części ułamkowej – użyjemy w tym celu funkcji ROUND():
Przykład 7
Linia 1. SELECT ROUND otwórz nawias okrągły AVG otwórz nawias okrągły egz podkreślnik hum zamknij nawias okrągły przecinek 2 zamknij nawias okrągły.
Linia 2. FROM uczniowie średnik.
SELECT ROUND(AVG(egz_hum), 2)
FROM uczniowie;
Oprócz wyniku średniego możemy wyświetlić wynik minimalny i maksymalny:
Przykład 8
Linia 1. SELECT MIN otwórz nawias okrągły egz podkreślnik hum zamknij nawias okrągły przecinek ROUND otwórz nawias okrągły AVG otwórz nawias okrągły egz podkreślnik hum zamknij nawias okrągły przecinek 2 zamknij nawias okrągły przecinek MAX otwórz nawias okrągły egz podkreślnik hum zamknij nawias okrągły.
Linia 2. FROM uczniowie średnik.
SELECT MIN(egz_hum), ROUND(AVG(egz_hum), 2), MAX(egz_hum)
FROM uczniowie;
Dzięki funkcjom MIN() i MAX() wyszukamy też najlepsze i najgorsze oceny wśród uczniów wskazanej płci (w tym wypadku kobiet):
Przykład 9
Linia 1. SELECT MIN otwórz nawias okrągły egz podkreślnik hum zamknij nawias okrągły przecinek MAX otwórz nawias okrągły egz podkreślnik hum zamknij nawias okrągły.
Linia 2. FROM uczniowie.
Linia 3. WHERE plec znak równości TRUE średnik.
SELECT MIN(egz_hum), MAX(egz_hum)
FROM uczniowie
WHERE plec = TRUE;
Klauzula GROUP BY
Chcemy dowiedzieć się, jaka jest średnia ocen z wybranego przedmiotu we wskazanej klasie. W wynikach kwerendy chcemy zobaczyć nazwę przedmiotu, nazwę klasy i średnią ocen. Zacznijmy od kwerendy wybierającej odpowiednie pola z różnych tabel:
W LibreOffice Base napiszemy:
Linia 1. SELECT przedmioty kropka nazwa przecinek klasy kropka nazwa przecinek ocena.
Linia 2. FROM oceny.
Linia 3. INNER JOIN uczniowie ON uczniowie kropka id znak równości oceny kropka id podkreślnik ucznia.
Linia 4. INNER JOIN przedmioty ON przedmioty kropka id znak równości oceny kropka id podkreślnik przedmiotu.
Linia 5. INNER JOIN klasy ON klasy kropka id znak równości uczniowie kropka id podkreślnik klasy.
Linia 6. WHERE przedmioty kropka nazwa znak równości apostrof polski apostrof AND klasy kropka nazwa znak równości apostrof 3A apostrof średnik.
SELECT przedmioty.nazwa, klasy.nazwa, ocena
FROM oceny
INNER JOIN uczniowie ON uczniowie.id = oceny.id_ucznia
INNER JOIN przedmioty ON przedmioty.id = oceny.id_przedmiotu
INNER JOIN klasy ON klasy.id = uczniowie.id_klasy
WHERE przedmioty.nazwa='polski' AND klasy.nazwa='3A';
lub:
Linia 1. SELECT przedmioty kropka nazwa przecinek klasy kropka nazwa przecinek ocena.
Linia 2. FROM oceny przecinek przedmioty przecinek uczniowie przecinek klasy.
Linia 3. WHERE oceny kropka id podkreślnik przedmiotu znak równości przedmioty kropka id.
Linia 4. AND oceny kropka id podkreślnik ucznia znak równości uczniowie kropka id.
Linia 5. AND uczniowie kropka id podkreślnik klasy znak równości klasy kropka id.
Linia 6. AND przedmioty kropka nazwa znak równości apostrof polski apostrof.
Linia 7. AND klasy kropka nazwa znak równości apostrof 3A apostrof średnik.
SELECT przedmioty.nazwa, klasy.nazwa, ocena
FROM oceny, przedmioty, uczniowie, klasy
WHERE oceny.id_przedmiotu = przedmioty.id
AND oceny.id_ucznia = uczniowie.id
AND uczniowie.id_klasy = klasy.id
AND przedmioty.nazwa = 'polski'
AND klasy.nazwa = '3A';
Warunki złączeń w kwerendach wybierających dane z wielu tabel mogą być definiowane za pomocą klauzul JOIN lub WHERE.
W Microsoft Access składnia jest bardziej skomplikowana, musimy uwzględnić nawiasy po klauzuli FROM:
Linia 1. SELECT przedmioty kropka nazwa przecinek klasy kropka nazwa przecinek ocena.
Linia 2. FROM otwórz nawias okrągły klasy INNER JOIN uczniowie ON klasy kropka id znak równości uczniowie kropka id podkreślnik klasy zamknij nawias okrągły.
Linia 3. INNER JOIN otwórz nawias okrągły przedmioty INNER JOIN oceny ON przedmioty kropka id znak równości oceny kropka id podkreślnik przedmiotu zamknij nawias okrągły ON uczniowie kropka id znak równości oceny kropka id podkreślnik ucznia.
Linia 4. WHERE przedmioty kropka nazwa znak równości cudzysłów polski cudzysłów AND klasy kropka nazwa znak równości cudzysłów 3A cudzysłów średnik.
SELECT przedmioty.nazwa, klasy.nazwa, ocena
FROM (klasy INNER JOIN uczniowie ON klasy.id = uczniowie.id_klasy)
INNER JOIN (przedmioty INNER JOIN oceny ON przedmioty.id = oceny.id_przedmiotu) ON uczniowie.id = oceny.id_ucznia
WHERE przedmioty.nazwa="polski" AND klasy.nazwa="3A";
W powyższych kwerendach warto zauważyć, że pola zawierające nazwę przedmiotu i klasy mają taką samą nazwę, dlatego musieliśmy je poprzedzić nazwami tabel. Drugą ważną rzeczą jest uwzględnienie w warunkach złączeń tabeli uczniowie. Mimo że nie wybieramy z niej żadnego pola, tylko dzięki niej możemy odczytać oceny podanej klasy.
Kiedy mamy listę ocen, wystarczy je zgrupować według pól podanych w klauzuli SELECT, czyli nazwy przedmiotu i klasy, i użyć funkcji AVG() na polu ocena.
W LibreOffice Base:
Linia 1. SELECT przedmioty kropka nazwa przecinek klasy kropka nazwa 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.
Linia 2. FROM oceny.
Linia 3. INNER JOIN uczniowie ON uczniowie kropka id znak równości oceny kropka id podkreślnik ucznia.
Linia 4. INNER JOIN przedmioty ON przedmioty kropka id znak równości oceny kropka id podkreślnik przedmiotu.
Linia 5. INNER JOIN klasy ON klasy kropka id znak równości uczniowie kropka id podkreślnik klasy.
Linia 6. WHERE przedmioty kropka nazwa znak równości apostrof polski apostrof AND klasy kropka nazwa znak równości apostrof 3A apostrof.
Linia 7. GROUP BY przedmioty kropka nazwa przecinek klasy kropka nazwa średnik.
SELECT przedmioty.nazwa, klasy.nazwa, ROUND(AVG(ocena), 2)
FROM oceny
INNER JOIN uczniowie ON uczniowie.id = oceny.id_ucznia
INNER JOIN przedmioty ON przedmioty.id = oceny.id_przedmiotu
INNER JOIN klasy ON klasy.id = uczniowie.id_klasy
WHERE przedmioty.nazwa='polski' AND klasy.nazwa='3A'
GROUP BY przedmioty.nazwa, klasy.nazwa;
W Microsoft Access:
Linia 1. SELECT przedmioty kropka nazwa przecinek klasy kropka nazwa 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.
Linia 2. FROM otwórz nawias okrągły klasy INNER JOIN uczniowie ON klasy kropka id znak równości uczniowie kropka id podkreślnik klasy zamknij nawias okrągły INNER JOIN otwórz nawias okrągły przedmioty INNER JOIN oceny ON przedmioty kropka id znak równości oceny kropka id podkreślnik przedmiotu zamknij nawias okrągły ON uczniowie kropka id znak równości oceny kropka id podkreślnik ucznia.
Linia 3. WHERE przedmioty kropka nazwa znak równości cudzysłów polski cudzysłów AND klasy kropka nazwa znak równości cudzysłów 3A cudzysłów.
Linia 4. GROUP BY przedmioty kropka nazwa przecinek klasy kropka nazwa średnik.
SELECT przedmioty.nazwa, klasy.nazwa, ROUND(AVG(ocena), 2)
FROM (klasy INNER JOIN uczniowie ON klasy.id = uczniowie.id_klasy) INNER JOIN (przedmioty INNER JOIN oceny ON przedmioty.id = oceny.id_przedmiotu) ON uczniowie.id = oceny.id_ucznia
WHERE przedmioty.nazwa="polski" AND klasy.nazwa="3A"
GROUP BY przedmioty.nazwa, klasy.nazwa;
Funkcja ROUND() zaokrągla podaną wartość do podanej liczby miejsc po przecinku, w tym wypadku dwóch. Wynik podanych kwerend to: polski, 3A, 3,5.
Ważne!
W zapytaniach grupujących dane pola, które wybieramy w klauzuli SELECT i które nie są objęte funkcjami agregującymi, muszą wystąpić również w klauzuli GROUP BY.
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
instrukcja warunkowa
instrukcja warunkowa
instrukcja, która pozwala nakładać warunki na wybierane rekordy; w zależności od systemu bazodanowego można korzystać z następujących funkcji: CASE WHEN warunek1 THEN wynik1 ELSE wynik2 END (mySQL, LibreOffice Base), IFF (wyrażenie, wartość_jeżeli_prawda, wartość_jeżeli_fałsz), SWITCH (wyrażenie, wartość) (MicrosoftS Access)
podzapytanie
podzapytanie
zapytanie SELECT umieszczone wewnątrz innego zapytania SELECT, podzapytanie wykonywane w pierwszej kolejności, a jego wyniki są źródłem dla zewnętrznego zapytania