Садржај
1.0 Базе: Увод у базе података
1.1 Базе: SQLite
1.2 Базе: Дизајнирање базе података
2.0 - SQL: Читање података из базе
2.1 SQL: Пројекција и селекција
2.2 SQL: Логички и релацијски оператори
2.3 SQL: Изрази и функције - Додатно
2.4 SQL: Сортирање, уклањање дупликата, ограничавање броја врста
2.5 SQL: Агрегатне функције и груписање
2.6 SQL: Спајање табела
2.7 SQL: Угнежђени упити
2.8 SQL: Сложенији угњеждени упити - Додатно
2.9 SQL: Погледи
3.0 SQL: Промена садржаја базе
3.1 SQL: Уписивање података у табеле
3.2 SQL: Ажурирање података у табелама
3.3 SQL: Брисање података из табела
Агрегатне функције (SUM, AVG, MIN, MAX, COUNT)¶
У применама је веoма често потребно да се израчунају одређене статистике серија података. То може да буде збир, производ, просек тј. аритметичка средина, најмања или највећа вредност и слично. Приликом израчунавања ових статистика од серије елемената (тј. од свих елемената једне колоне табеле) гради се један резултат, тј. сви подаци се агрегирају у јединствен резултат. Зато се ове функције називају агрегатне функције.
Илуструјмо набројане функције на неколико примера.
Збир елемената¶
Збир елемената неке колоне може да се добије агрегатном функцијом
SUM
.
Приказати укупан фонд часова свих предмета.
SELECT SUM(fond)
FROM predmet;
Извршавањем упита добија се следећи резултат:
SUM(fond) |
---|
130 |
Овај упит можемо да прочитамо као:
Примећујемо да је назив колоне резултата исти као израз употребљен
након речи SELECT
, овде SUM(fond)
. То можемо да променимо
навођењем тзв. алијаса након кључне речи AS
.
SELECT SUM(fond) AS ukupan_fond
FROM predmet;
Извршавањем упита добија се следећи резултат:
ukupan_fond |
---|
130 |
Агрегатне функције се веома често примењују након филтрирања (селекције само неких врста).
Приказати укупан фонд часова предмета из првог разреда.
SELECT SUM(fond) AS ukupan_fond
FROM predmet
WHERE razred = 1;
Извршавањем упита добија се следећи резултат:
ukupan_fond |
---|
33 |
Овај упит можемо да прочитамо као:
Агрегатне функције се могу применити и на изразе. Илуструјмо то следећим примером.
Под претпоставком да постоји 37 радних недеља, прикажи укупан годишњи фонд часова свих предмета у другом разреду.
SELECT SUM(37 * fond) AS ukupan_godisnji_fond
FROM predmet
WHERE razred = 2;
Извршавањем упита добија се следећи резултат:
ukupan_godisnji_fond |
---|
1221 |
Просек елемената¶
Просек (аритметичка средина) елемената неке колоне може да се добије
агрегатном функцијом AVG
.
Приказати просечну оцену из предмета са идентификатором 1.
SELECT AVG(ocena) AS prosecna_ocena
FROM ocena
WHERE id_predmet = 1;
Извршавањем упита добија се следећи резултат:
prosecna_ocena |
---|
3.407063197026022 |
Просечне вредности се обично заокружују на одређен број
децимала. Подсетимо се, заокруживање може да се изврши применом
функције round
. Приметимо да се у том случају гради израз у коме
учествује резултат агрегатне функције (на резултат агрегатне функције
се могу примењивати уобичајени оператори и функције).
SELECT round(AVG(ocena), 2) AS prosecna_ocena
FROM ocena
WHERE id_predmet = 1;
Извршавањем упита добија се следећи резултат:
prosecna_ocena |
---|
3.41 |
Најмања и највећа вредност¶
Најмању вредност у некој колони можемо да одредимо функцијом MIN
, а
највећу функцијом MAX
. Ове функције могу да се примене и на бројеве
и на ниске и на датуме (при чему је у случају примене на ниске веома
битно која колациона секвенца се користи).
Приказати најнижу оцену на писменом задатку из математике у првом разреду одржаном 15. октобра 2020. године (математика у првом разреду има идентификатор 1).
SELECT MIN(ocena) AS najniza_ocena
FROM ocena
WHERE id_predmet = 1 AND datum = '2020-10-15' AND vrsta = 'писмени задатак';
Извршавањем упита добија се следећи резултат:
najniza_ocena |
---|
1 |
Приказати датум када је у дневник уписана последња оцена из српског језика за први разред.
SELECT MAX(datum) AS poslednji_datum
FROM ocena
WHERE id_predmet = 2;
Извршавањем упита добија се следећи резултат:
poslednji_datum |
---|
2021-05-10 |
Прикажи име и презиме ученика у одељењу IV1 који је први у дневнику (ученици се сортирају по азбучном редоследу).
Агрегатне функције могу да се примене и на колоне које се израчунавају као вредности неког израза. У овом случају то је израз којим ће се надовезати ниске које чине презиме и име. Пошто се тражи поређење ниски по азбучном редоследу, а ова изведена колона нема подешену колациону секвенцу, то морамо урадити у оквиру самог упита.
SELECT MIN((prezime || ' ' || ime) COLLATE UNICODE) AS prvi_u_dnevniku
FROM ucenik
WHERE razred = 4 AND odeljenje = 1;
Извршавањем упита добија се следећи резултат:
prvi_u_dnevniku |
---|
Васиљевић Дејан |
Број елемената¶
Често желимо да одредимо број елемената неке серије. У случају упита
читања података из база то се најчешће своди на то да се изброје врсте
у резултату упита. За то се користи агрегатна функција
COUNT
. Пошто је број врста у резултату једнак броју елемената
сваке појединачне колоне, обично се уместо назива колоне, као аргумент
ове функције просто наводи звездица *
.
Приказати број ученика у табели ученика.
SELECT COUNT(*) AS broj_ucenika
FROM ucenik;
Извршавањем упита добија се следећи резултат:
broj_ucenika |
---|
346 |
Овај упит можемо да прочитамо као:
Исти резултат би се добио ако би се тражило пребројавање елемената било које конкретне колоне. На пример:
SELECT COUNT(ime) AS broj_ucenika
FROM ucenik;
Извршавањем упита добија се следећи резултат:
broj_ucenika |
---|
346 |
И пребројавање често иде у комбинацији са филтрирањем (селекцијом само неких врста).
Приказати укупан број предмета у првом разреду.
SELECT COUNT(*) AS broj_predmeta
FROM predmet
WHERE razred = 1;
Извршавањем упита добија се следећи резултат:
broj_predmeta |
---|
16 |
Агрегатне функције могу да се комбинују и са елиминисањем дупликата.
Приказати укупан број различитих презимена ученика.
SELECT COUNT(*) AS broj_ucenika, COUNT(DISTINCT prezime) AS broj_prezimena
FROM ucenik;
Извршавањем упита добија се следећи резултат:
broj_ucenika |
broj_prezimena |
---|---|
346 |
114 |
Вежба¶
Наредних неколико упита покушај да напишеш самостално. Решења можеш да тестираш овде, а можеш све задатке да урадиш и у систему SQLite Studio.
Одредити датум прве добијене оцене у дневнику и датум последње.
Одредити број јединица које су ученици добили на писменим задацима.
Одредити просечну оцену ученика на контролним вежбама одржаним током новембра 2020. године.
Одредити број предмета из којих је држан писмени задатак (колону
назвати broj_predmeta
).