Садржај
1.0 Базе: Увод у базе података
Шта су базе података?
Табеларна организација података
Повезане табеле
Базе и табеле - квиз
1.1 Базе: SQLite
SQLite и SQLite Studio
Креирање базе у SQLite Studio
SQLite и SQLite Studio - квиз
Креирање базе у SQLite Studio - задаци за вежбу
1.2 Базе: Дизајнирање базе података
База компаније за продају дигиталних композиција - подаци о композицијама
База компаније за продају дигиталних композиција - подаци о продаји
Дизајнирање базе података - квиз
2.0 - SQL: Читање података из базе
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: Брисање података из табела
Брисање података
Брисање података - квиз

Груписање и израчунавање статистика појединачних група (GROUP BY)

У претходном поглављу смо видели како агрегатне функције могу да се примене на филтриране податке (податке који задовољавају неки услов). Видели смо, на пример, како можемо да израчунамо укупан фонд часова предмета у првом разреду или како можемо да одредимо просек свих датих оцена из неког појединачног предмета. Често се јавља потреба да се иста врста упита понови за сваку вредност у некој колони. На пример, сасвим је природно пожелети да се одреди фонд часова предмета не само у првом, већ у сваком од четири разреда, или да се израчуна просечна оцена из сваког појединачног предмета. Уместо да се поставља више сродних упита, овакве статистике је могуће израчунати коришћењем груписања и израчунавања статистика по групама. У језику SQL се за то користи клаузула GROUP BY. Прикажимо њену употребу на неколико примера.

Приказати укупан фонд часова у сваком од четири разреда.

SELECT razred, SUM(fond) as fond_casova
FROM predmet
GROUP BY razred;

Извршавањем упита добија се следећи резултат:

razred

fond_casova

1

33

2

33

3

31

4

33

Извршавање овог упита можемо себи да представимо на следећи начин.

  • Скуп свих врста у табели предмета (свака од њих одговара једном предмету) се подели у групе које одговарају појединим разредима. При томе, за сваку групу важи да сви редови те групе имају исту вредност колоне razred.

  • Агрегатна функција SUM се примени засебно на сваку групу.

  • За сваку групу се добија (и приказује) по један ред резултата.

Груписање и израчунавање збира елемената сваке групе

У примеру приказаном на слици се добијају 4 групе, од којих свака одговара по једном разреду.

Напоменимо да СУБП, може ради постизања веће ефикасности, да ове операције извршава и другачијим редоследом, али резултат мора да буде исти као када се рачунање обавља онако како је овде описано. На пример, могуће је да се формирање група и рачунање збирова по групама извршава једновремено (користећи по потреби и неке напредније структуре података).


Приказати најмању оцену из сваког предмета.

SELECT id_predmet, MIN(ocena) as min_ocena
FROM ocena
GROUP BY id_predmet;

Извршавањем упита добија се следећи резултат:

id_predmet

min_ocena

1

1

2

1

3

2

4

1

5

1

У овом упиту се врсте табеле ocena поделе у групе на основу предмета, тј. њихових идентификатора. У свакој групи се, дакле, налазе све оцене из неког предмета. Затим се у оквиру сваке групе засебно проналази минимална оцена и на крају резултат садржи идентификатор предмета (заједнички за све оцене у групи) и минималну оцену у групи.

Груписање може да се изврши и по вредности н-торке колона.


Приказати број ученика у сваком од одељења.

SELECT razred, odeljenje, COUNT(*) as broj_ucenika
FROM ucenik
GROUP BY razred, odeljenje;

Извршавањем упита добија се следећи резултат:

razred

odeljenje

broj_ucenika

1

1

28

1

2

33

1

3

29

2

1

32

2

2

26

У овом случају се за сваки пар вредности (razred, odeljenje) креира посебна група врста и затим се одреди број елемената (врста) у свакој од тих група.

Груписање и израчунавање статистика по групама може да се обави и након филтрирања (тј. селекције неких врста).


Приказати број девојчица у сваком разреду.

SELECT razred, COUNT(*) as broj_devojcica
FROM ucenik
WHERE pol = 'ж'
GROUP BY razred;

Извршавањем упита добија се следећи резултат:

razred

broj_devojcica

1

56

2

51

3

34

4

44

У овом упиту се из табеле ученика бирају само оне врсте које описују девојчице (код којих је вредност у колони pol једнака ж), а затим се те врсте групишу у четири групе на основу разреда и затим се одређује број елемената у свакој од те четири групе.

Груписани резултати се могу сортирати, може се ограничавати број врста у резултату и слично.

Приказати три најчешћа презимена.

SELECT prezime, COUNT(*) AS broj_ucenika
FROM ucenik
GROUP BY prezime
ORDER BY broj_ucenika DESC
LIMIT 3;

Извршавањем упита добија се следећи резултат:

prezime

broj_ucenika

Милић

8

Цветковић

7

Ристић

7

Вежба

Покушај да самостално напишеш наредних неколико упита. Решења можеш да тестираш овде, а можеш све задатке да урадиш и у систему SQLite Studio.

Прикажи укупан број изостанака за сваки статус изостанака (оправдане, неоправдане, нерегулисане).



Прикажи највећи фонд часова неког предмета за сваки од разреда (приказати редни број разреда и максимални фонд у колони под називом najveci_fond).



Прикажи три датума у којима је остварено највише изостанака (уз датум приказати и број изостанака у колони под називом broj_izostanaka).



Претходна лекција
Следећа лекција
A- A+
Тема
Темa

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.