Ажурирање података¶
Понекад желимо да изменимо неке податке у бази, тј. у табелама базе. У
језику SQL за то се користе упити UPDATE
. Основни облик ових упита је:
UPDATE naziv_tabele
SET kolona_1 = vrednost_1, ..., kolona_k = vrednost_k
WHERE uslov;
Клаузула WHERE
одређује који редови ће бити измењени – ако се она
изостави, биће измењени сви редови, што често није оно што
желимо. Илуструјмо ажурирање кроз неколико примера.
Ученику са идентификатором 1, Петру Петровићу, грешком је уписан датум рођења 1. јул 2006. године, а он је заправо рођен 2. јула 2006. године. Исправити ову грешку.
UPDATE ucenik
SET datum_rodjenja = '2006-07-02'
WHERE id = 1;
Условом може да се одабере и више врста.
Због ванредних околоности, одлучено је да ниједан ученик неће имати јединицу. Напиши упит који све јединице у табели оцена претвара у двојке.
UPDATE ocena
SET ocena = 2
WHERE ocena = 1;
Вредности које се уписују не морају бити константне.
Такође, одлучено је да се повећају све оцене за 1 (осим, наравно, петица, које остају петице).
UPDATE ocena
SET ocena = ocena + 1
WHERE ocena < 5;
На крају, у наредном, мало компликованијем примеру приказаћемо како
услови у клаузули WHERE
могу да буду прилично компликовани и могу
да садрже и угнежђене подупите.
Сви ученици из првог два су поправили оцене које су добили на писменом из математике одржаном 15. октобра 2020. Напиши упит који свим ученицима уместо јединице уписује двојку.
Кључни задатак код овог упита је одредити које су то врсте у табели
оцена, које одговарају оценама на том писменом задатку у том
одељењу. Потребно је, дакле, одредити клаузулу WHERE
која ће
издвојити само те врсте у табели оцена. Добра пракса је да се пре
ажурирања провери да ли су одабране добре врсте, тако што ће се иста
клаузула WHERE
употребити у склопу упита SELECT
.
Задатак можемо да решимо угнежђеним упитима, тако што ћемо у једном
подупиту прочитати из табеле ученика идентификаторе свих ученика из
одељења I2, а у другом ћемо прочитати идентификатор предмета
математика у првом разреду. Приметимо да нам угнежђени упити више
одговарају од спајања, јер се приликом упита UPDATE
наводи само
једна табела.
SELECT *
FROM ocena
WHERE id_ucenik IN (SELECT id
FROM ucenik
WHERE razred = 1 AND odeljenje = 2) AND
id_predmet = (SELECT id
FROM predmet
WHERE naziv = 'Математика' AND razred = 1) AND
datum = '2020-10-15' AND
vrsta = 'писмени задатак' AND
ocena = 1;
Извршавањем упита добија се следећи резултат:
id |
id_predmet |
id_ucenik |
ocena |
datum |
vrsta |
---|---|---|---|---|---|
40 |
1 |
7 |
1 |
2020-10-15 |
писмени задатак |
55 |
1 |
51 |
1 |
2020-10-15 |
писмени задатак |
57 |
1 |
53 |
1 |
2020-10-15 |
писмени задатак |
58 |
1 |
54 |
1 |
2020-10-15 |
писмени задатак |
66 |
1 |
62 |
1 |
2020-10-15 |
писмени задатак |
… |
… |
… |
… |
… |
… |
Када видимо да су редови добро одабрани, од упита SELECT
лако
можемо да направимо упит UPDATE
.
UPDATE ocena
SET ocena = 2
WHERE id_ucenik IN (SELECT id
FROM ucenik
WHERE razred = 1 AND odeljenje = 2) AND
id_predmet = (SELECT id
FROM predmet
WHERE naziv = 'Математика' AND razred = 1) AND
datum = '2020-10-15' AND
vrsta = 'писмени задатак' AND
ocena = 1;
Вежба¶
Покушај да наредних неколико упита напишеш самостално.
По новом плану и програму предмет рачунарство и информатика у првом разреду треба да има фонд од 3 уместо 2 часа. Напиши упит који ажурира базу у складу са тим.
Наставник је грешком уписао да је писмени задатак из предмета чији је идентификатор 1 одржан 15. октобра 2020. године, а одржан је заправо 16. октобра 2020. године. Напиши упит који исправља ову грешку.
По новом плану и програму фонд часова математике у сваком разреду се смањује за један. Напиши упит који реализује ову промену.
Разредни одељења II1 је од родитеља ученика сазнао да су сви изостанци које су ученици тог одељења направили, а који до сада нису регулисани, оправдани. Напиши упит који реализује ту промену.