Садржај
2.8 SQL: Сложенији угњеждени упити - Додатно
3.0 SQL: Промена садржаја базе
3.2 SQL: Ажурирање података у табелама
3.3 SQL: Брисање података из табела
6.0 Библиотека Flask - пројектни задатак

Изрази

Након SELECT се најчешће наводе само називи колона, међутим, могуће је употребити и сложеније изразе који у себи укључују и вредности прочитане из одговарајућих колона. Изрази се граде применом оператора (аритметичких, попут +, -, *, /, % али и других) и библиотечких функција на називе колона и константне вредности (бројеве, константне ниске и слично). Тиме заправо пресликавамо вредности прочитане из колона табела применом одговарајућих функција. Илуструјмо ово кроз неколико примера.

Аритметички оператори имају своје уобичајено значење. Оператор дељења / када се примени на податке целобројног типа означава целобројно дељење, док се оператором % означава остатак при дељењу (нпр. вредност израза 14 / 4 је 3, а израза 14 % 4 је 2).

Приказати годишњи фонд часова за сваки предмет (претпоставља се да школска година има 37 радних недеља).

SELECT naziv, razred, 37 * fond
FROM predmet;

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

naziv

razred

37 * fond

Математика

1

148

Српски језик

1

148

Рачунарство и информатика

1

74

Математика

2

185

Психологија

2

74

Уместо назива колоне fond наведен је израз 37 * fond који подразумева да се вредност прочитана из колоне fond помножи са 37.

Приметимо да колона са годишњим фондом нема неко илустративно име. То можемо да променимо коришћењем тзв. алијаса, тако што ћемо колони променити име коришћењем кључне речи AS.

SELECT naziv, razred, 37 * fond AS godisnji_fond
FROM predmet;

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

naziv

razred

godisnji_fond

Математика

1

148

Српски језик

1

148

Рачунарство и информатика

1

74

Математика

2

185

Психологија

2

74

Изрази могу да буду и део услова приликом селекције, тј. могу да се наводе и у склопу клаузуле WHERE.

Приказати оне предмете код којих је годишњи фонд часова једнак 74.

SELECT *
FROM predmet
WHERE 37 * fond = 74;

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

id

naziv

razred

fond

3

Рачунарство и информатика

1

2

5

Психологија

2

2

6

Физика

1

2

10

Социологија

4

2

11

Филозофија

4

2

Алијас израза (име израза наведено након AS) можемо да употребимо и у склопу клаузуле WHERE.

SELECT naziv, razred, 37 * fond AS godisnji_fond
FROM predmet
WHERE godisnji_fond = 74;

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

naziv

razred

godisnji_fond

Рачунарство и информатика

1

74

Психологија

2

74

Физика

1

74

Социологија

4

74

Филозофија

4

74

За сваки предмет приказати назив, разред и смену у којој се предаје (прва и трећа година су у првој, а друга и четврта у другој смени).

Јасно је да смена зависи од парности разреда. Оператором % можемо израчунати остатак при дељењу разреда са 2 и тако за први и трећи разред добити вредност 1, а за други и четврти разред вредност 0. Смену затим можемо добити одузимањем те вредности од броја 2.

SELECT naziv, razred, 2 - razred % 2 AS smena
FROM predmet;

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

naziv

razred

smena

Математика

1

1

Српски језик

1

1

Рачунарство и информатика

1

1

Математика

2

2

Психологија

2

2

Аритметички оператори нису једини оператори који су подржани. Ниске се могу надовезати оператором ||.

Направити јединствену колону која садржи пуно име и презиме сваког ученика.

SELECT id, ime || ' ' || prezime AS ime_i_prezime
FROM ucenik

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

id

ime_i_prezime

1

Петар Петровић

2

Милица Јовановић

3

Лидија Петровић

4

Петар Миловановић

5

Ана Пекић

Напоменимо да се у неким другим системима за управљање базама података за надовезивање ниски уместо оператора || користи функција CONCAT.

Направити преглед регулисаних и нерегулисаних изостанака, тако што се уз идентификатор сваког изостанка прикаже да ли је нерегулисан или регулисан (било да је оправдан или неоправдан). Истаћи нерегулисане изостанке поруком „потребно да се регулише“.

Задатак ћемо решити употребом гранања. Основни облик гранања у језику SQL је израз CASE. Његова основна синтакса је облика:

CASE
   WHEN uslov1 THEN vrednost1
   WHEN uslov2 THEN vrednost2
   ...
   WHEN uslovk THEN vrednostk
   ELSE vrednost
END

Врши се провера испуњености једног по једног услова и ако је неки од њих испуњен, вредност израза CASE је вредност која је придружена том услову. У супротном је вредност израза CASE једнака вредности која је наведена уз ELSE. У нашем примеру, гранање можемо постићи на следећи начин:

SELECT id, CASE
              WHEN status = 'нерегулисан' THEN 'потребно да се регулише'
              ELSE 'регулисан'
           END AS status
FROM izostanak;

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

id

status

1

регулисан

2

регулисан

3

потребно да се регулише

4

потребно да се регулише

5

регулисан

Илуструјмо употребу CASE израза још једним примером.

Уз сваку оцену из табеле оцена приказати и њен текстуални опис (недовољан, довољан, добар, врлодобар, одличан).

SELECT id, ocena, CASE
                    WHEN ocena = 1 THEN 'недовољан'
                    WHEN ocena = 2 THEN 'довољан'
                    WHEN ocena = 3 THEN 'добар'
                    WHEN ocena = 4 THEN 'врлодобар'
                    WHEN ocena = 5 THEN 'одличан'
                  END AS opis_ocene
FROM ocena;

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

id

ocena

opis_ocene

11

3

добар

12

3

добар

13

2

довољан

15

3

добар

16

1

недовољан

Вежба

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

Ученици скупљају поене на основу оцена које су добили. За оцену два добијају 5 поена, за оцену три 10 поена, за оцену четири 15 поена и за оцену пет 20 поена. За сваку оцену у табели оцена приказати идентификатор ученика који је добио ту оцену и број поена који се добијају за ту оцену.



Прикажи све податке о изостанцима, при чему се уз оправдане изостанке као статус наводи вредност 1, уз неоправдане вредност 2, а уз нерегулисане 0 (та колона треба да се зове status).



(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+