You are on page 1of 378

Normalizacija

I, II i III Normalna forma


Prva normalna forma

mr Miloš Pejanović, dipl.inž.

Sekcija 6 L 2
Normalizacija i Prva Normalna Forma

Šta se dešava kada je podatak smešten


na više od jednog mesta u bazi
podataka?
Šta ako neko promeni informaciju na
jednom mestu ali ne i na ostalim?
Kako ćete znati koja informacija je
tačna?
Normalizacija je proces koji
rešava ovakve probleme.
Sekcija 6 L 2
Normalizacija i Prva Normalna Forma

Vaš cilj kao dizajnera baze podataka je da


„skladištite podatke na jednom mestu i
najboljem mestu“.

Praćenje pravila normalizacije pomaže vam


da postignete taj cilj.

Sekcija 6 L 2
• Naizgled dobro formirana NARUDŽBENICA

Sifra Šifra
Ime Lokacija Telefon Naziv Cena Količina
kupca artikla

 Ipak loša – nije normalizovana


Sifra Ime Lokacija Telefon Šifra Naziv Cena Količina
kupca artikla
K1 LEONA Novi Sad 024-455-44 A1 Penkala 120 din 200
K1 LEONA Novi Sad 024-455-44 A2 Spajalice 50 din 1000

K2 ZORA Čačak 032-345-67 A1 Penkala 120 din 85


K3 GALEB Beograd 011-234-345 A3 Mastilo 350 din 800

... ... ... ... ... ... ... ...

K1 LEONA Novi Sad 024-455-44 A3 Mastilo 350 din 20

Sekcija 5 L 2
Redundancija  Anomalije podataka

1. Anomalija ažuriranja.
2. Anomalija dodavanja.
3. Anomalija brisanja najvise
Normalizacija i Prva Normalna Forma

Prva Normalna Forma (1NF)


Prva Normalna Forma zahteva da nema
viševrednosnih atributa.
Da biste proverili da li je zadovoljena
1NF, potvrdite da svaki atribut ima samo
jednu vrednost za svaku instancu
entiteta.

Sekcija 6 L 2
Normalizacija i Prva Normalna Forma

Prva Normalna Forma (1NF)


Postoji mnogo učionica u
zgradi škole, dakle to je
atribut koji se ponavlja.
Ovo je narušavanje 1NF.
Ako atribut ima vrednosti
koje su višestruke,
napravite novi entitet i
Atribut učionica će povežete ga sa
imati više vrednosti za početnim entitetom
jednu školsku zgradu.
pomoću veze
Ovaj entitet nije u više prema jedan (M:1).
Prvoj Normalnoj Formi
Sekcija 6 L 2
Normalizacija i Prva Normalna Forma

Prva Normalna Forma (1NF)

UČIONICA je sada poseban entitet. Svi


atributi imaju samo jednu vrednost u
instanci.
Oba entiteta su u prvoj normalnoj formi.
Sekcija 6 L 2
Normalizacija i Prva Normalna Forma

NARUŠAVANJE 1NF

PRIMERI

U sledećih nekoliko zadataka proučite


entitete i proverite da li su u prvoj
normalnoj formi.

Sekcija 6 L 2
Normalizacija i Prva Normalna Forma

NARUŠAVANJE 1NF
PRIMER 1
Na slici je prikazan entitet KLIJENT sa atributima
broj, ime, prezime i događaj koji je vezan za
klijenta

Atribut događaj narušava


prvu normalnu formu jer za
jednog klijenta može biti
vezano više događaja.
Iz tog razloga ...
Sekcija 3 L 1
Normalizacija i Prva Normalna Forma

NARUŠAVANJE 1NF
REŠENJE PRIMERA 1
... atribut događaj postaje entitet DOGAĐAJ koji
je povezan sa KLIJENTOM preko veze tipa M:1.

Sekcija 3 L 1
Normalizacija i Prva Normalna Forma

NARUŠAVANJE 1NF
PRIMER 2
Na slici je prikazan
entitet TRŽNI
CENTAR sa
atributima id, ime,
adresa, ime
prodavnice i sprat
na kome se
prodavnica nalazi.
Sekcija 3 L 1
Normalizacija i Prva Normalna Forma

NARUŠAVANJE 1NF
REŠENJE PRIMERA 2
Atributi ime prodavnice i sprat prodavnice
narušavaju 1NF jer u jednom TRŽNOM CENTRU
može biti više prodavnica i spratova pa vrednosti
ovih atributa ne bi bile atomske (jednoznačne).

Zato te atribute izdvajamo


u entitet RADNJA Sekcija 3 L 1
Normalizacija i Prva Normalna Forma

NARUŠAVANJE 1NF
PRIMER 3
Na slici je prikazan ER dijagram koji se sastoji iz
dva entiteta, TIM i LIGA.

Sekcija 3 L 1
Normalizacija i Prva Normalna Forma

NARUŠAVANJE 1NF
REŠENJE RIMERA 3

Entitet LIGA je u 1NF, dok entitet


TIM ima viševrednosni atribut
igrač i nije u 1NF. Zato će atribut
igrač postati entitet IGRAČ.
Sekcija 3 L 1
Druga Normalna Forma

mr Miloš Pejanović, dipl.inž.

Sekcija 6 L 3
Druga Normalna Forma

Šta ću naučiti?
Naučićete da:
• Definišete pravilo druge normalne forme u
procesu normalizacije
• Ispitate nenormalizovane entitete i utvrdite
koje pravilo (ili pravila) normalizacije su
narušena
• Primenite pravilo druge normalne forme i
tako otklonite narušavanje normalizacije u
modelu Sekcija 6 L 3
Druga Normalna Forma

Proučite entitet DOBAVLJAČ.


UID je kombinacija broja
dobavljača i broja proizvoda.
A šta je sa atributom “ime
dobavljača”? Ako jedan U
I
dobavljač dostavlja 5 različitih D
proizvoda, šta se dešava kad
dobavljač promeni ime?
Ime se mora promeniti na 5
različitih instanci entiteta. Šta
ako neke instance ažuriramo,
a druge ne? Koja bi bila tačna
vrednost za ime dobavljača?
Sekcija 6 L 3
Druga Normalna Forma

Druga normalna forma zahteva


• da je zadovoljena prva normalna forma
• da svaki atribut koji nije jedinstveni
identifikator zavisi od celog jedinstvenog
identifikatora.

Sekcija 6 L 3
Druga Normalna Forma

To znači da svi atributi koji nisu deo jedinstvenog


identifikatora moraju zavisiti od celog UID. To se
posebno odnosi na entitete koji imaju UID koji se
sastoji od više atributa ili kombinacije atributa i
veze (veza). To se zove potpuna funkcionalna
zavisnost od jedinstvenog identifikatora.
Dakle, druga normalna forma zahteva potpunu
funkcionalnu zavisnost od jedinstvenog
identifikatora.

Sekcija 6 L 3
Druga Normalna Forma

stanje

Da li je ovim modelom obuhvaćeno


dovoljno informacija o nečijem računu
u banci?

Sekcija 6 L 3
Druga Normalna Forma

stanje

Isti brojevi RAČUNa postoje u različitim


BANKAma pa i je veza deo jedinstvenog
identifikatora.
To je prikazano crticom na vezi
(barirana veza).
Sekcija 6 L 3
Druga Normalna Forma
U ovom ER dijagramu, atribut lokacija banke je na
pogrešnom mestu.
On zavisi SAMO od banke.
RAČUN se nalazi BANKA
# broj računa # id-broj
* datum otvaranja ima * naziv
* lokacija banke * lokacija
* stanje
Ovo je narušavanje druge normalne forme. Šta bi
se desilo ako bi se lokacija banke promenila?
Svi računi u banci bi morali da budu promenjeni.
 Lokacija banke nije modelovana na pravom
mestu
 Mesto atributa lokacija
Sekcija 6 L 3
je u entitetu BANKA
Druga Normalna Forma

Za svaki događaj, DJ je odgovoran za


pripremanje kolekcije pesama koja će biti
izvedena na tom događaju. Svaka pesma
može biti puštena na više od jednog
događaja, i na svakom događaju će biti
pušteno više od jedne pesme. Da
pogledamo kako DJ priprema repertoar.

Sekcija 6 L 3
Druga Normalna Forma
Pogledajmo ovaj
ER-dijagram DJ-posla.
Šta nije u redu sa
njim?  komentar
* datum događaja
Atributi vreme trajanja  trajanje
i datum događaja su
na pogrešnom mestu.
Vrema trajanja zavisi
jedino od pesme, a
datum događaja zavisi
samo od događaja.
Ovo je narušavanje

druge normalne forme 
(II NF). Sekcija 6 L 3
Druga Normalna Forma

Model ćemo
normalizovati 
izmeštanjem atributa
koji narušavaju II NF.
Izmeštanjem atributa
datum u entitet
DOGAĐAJ i atributa
trajanje u entitet
PESMA preveli smo 
  trajanje
model u drugu * datum
normalnu formu. Sekcija 6 L 3
Druga Normalna Forma

NARUŠAVANJE 2NF
PRIMER
Identifikator knjige u biblioteci uključuje i lokaciju
police. Da li ovaj ER dijagram zadovoljava pravilo
Druge Normalne Forme? Ako uočite
narušavanje, ispravite ga.

Sekcija 5 L 2
Druga Normalna Forma
NARUŠAVANJE 2NF
REŠENJE RIMERA
Nacrtani ER dijagram ne zadovoljava pravilo Druge
Normalne Forme jer atribut veličina police na zavisi od
celog UID već samo od barirane veze. Zbog toga je
potrebno atribut veličina police premestiti u entitet
POLICA. Rešenje je prikazano sa ovoj slici:

Sekcija 5 L 2
Druga Normalna Forma

Primer:
Model podataka o studentima celog univerziteta

STUDENT
# šifra fakulteta
Narušena
# godina upisa
# broj upisa
* ime
* prezime
! druga
normalna
forma
* datum rođenja
* naziv fakulteta
* sedište fakulteta
Sekcija 5 L 2
Druga Normalna Forma

Normalizacija:
Model podataka o studentima celog univerziteta

STUDENT
# šifra fakulteta
# godina upisa FAKULTET
# broj upisa
* ime
* prezime
* datum rođenja
* naziv fakulteta
* sedište fakulteta
Sekcija 5 L 2
Druga Normalna Forma

Rešenje:
Model podataka o studentima celog univerziteta

STUDENT studira
# godina upisa
# broj upisa
* ime
* prezime ima
* datum rođenja
FAKULTET
# šifra
* naziv
* sedište
Sekcija 5 L 2
Druga Normalna Forma
Implementacija:
Relaciona baza podataka o studentima
STUDENTI
godina upisa broj upisa ime prezime datum rođenja fakultet
2005 382 Ana Todorić 24.08.1986. TFČ
2006 382 Toše Manev 13.03.1087. UFU
2005 382 Ana Todorić 24.08.1986. UFU
2005 124 Milko Perić 29.12.1986. TFČ
2007 83 Milko Perić 30.12.1988. TFČ

FAKULTETI
šifra naziv sedište
TFČ Tehnički fakultet Čačak
UFJ Učiteljski fakultet Jagodina
UFU Učiteljski fakultet Užice
Sekcija 5 L 2
Druga Normalna Forma

Naučili ste da:


• Objasnite zašto je potrebna normalizacija
• Definišete pravilo druge normalne forme u
procesu normalizacije
• Ispitate nenormalizovane entitete i utvrdite
koje pravilo, ili koja pravila normalizacije
su narušena
• Noramalizujete model, odnosno da ga
prevedete u II NF da biste otklonili
anomalije u radu sa podacima
Sekcija 6 L 3
Normalizacija
Treća normalna forma

mr Miloš Pejanović, dipl.inž.


Treća Normalna Forma

Šta treba naučiti?


Naučićete da:
• Identifikujete tranzitivnu zavisnost u
modelu podataka
• Definišete pravilo treće normalne forme u
procesu normalizacije
• Proučite nenormalizovane entitete i
odredite koje pravilo ili pravila
normalizacije su narušena
• Primenite pravilo treće normalne forme da
biste otklonili anomalije na modelu
Treća Normalna Forma

Pravilo treće normalne forme (3NF)


kaže da nijedan ne-UID atribut
ne može zavisiti od drugog ne-UID
atributa.

Da bi entitet bio u trećoj normalnoj formi, treba


da bude u drugoj NF i da zadovoljava pravilo
treće NF.
Treća normalna forma zabranjuje tranzitivnu
zavisnost. Tranzitivna zavisnost postoji
kada bilo koji atribut entiteta zavisi od bilo
kog drugog ne-UID atrubuta u tom entitetu.
Treća Normalna Forma

Zamislite neku
informaciju koju želite
da sačuvate o vašoj
CD kolekciji. Da li
informacija o radnji u
kojoj ste kupili CD
pripada istom entitetu?
Ako se promeni adresa
radnje, morate da
promenite taj podatak Narušavanje III
na svim CD koje ste normalne forme
kupili u toj radnji.
Treća Normalna Forma

Adresa radnje je
zavisna od broja CD-a,
koji je UID entiteta CD.
Dakle ovaj entitet je u
1NF i u 2NF.
Ali adresa radnje je
takođe zavisna i od
imena radnje, koja je
ne-UID atribut.
Ovo je primer tranzitivne Narušavanje III
zavisnosti i narušavanja normalne forme
Treće Normalne Forme.
Treća Normalna Forma

Normalizacija:
napravljen je novi entitet RADNJA, koji je
u vezi sa entitetom CD.

važi III normalna forma


Treća Normalna Forma
NARUŠAVANJE 3 NF
PRIMER 1
Razmislite o sistemu
koji prati informacije o
gradovima – veličina,
broj stanovnika,
gradonačelnik, i tako
dalje.
Ovaj model pokazuje
entitet koji uključuje
informaciju o državi.
Treća Normalna Forma
ANALIZA PRIMERA 1

III Normalna forma

Iako je država
atribut grada,
državni grb je,
u stvarnosti,
atribut države.
Treća Normalna Forma
REŠENJE PRIMERA 1

III normalna forma

Drugi model, sa novim entitetom DRŽAVA


je u trećoj normalnoj formi.
Treća Normalna Forma

PRIMER 2

FAKTURA STAVKA
pripada FAKTURE
# broj fakture
* datum sadrži # broj stavke
* šifra kupca * šifra artikla
* naziv * naziv
* cena
* količina
* iznos

Da li je dati ER-model u III normalnoj formi?


Treća Normalna Forma

PRIMER 2

FAKTURA pripada STAVKA


# broj fakture FAKTURE
* datum sadrži # broj stavke
* šifra kupca * šifra artikla
* naziv * naziv
* cena

izvedeni atribut
* količina}
* iznos

Narušavanje III normalne forme


Treća Normalna Forma

REŠENJE PRIMERA 2
FAKTURA pripada STAVKA FAKTURE
# broj fakture # broj stavke
sadrži
* datum * količina
zadužuje sadrži

III normalna forma

sadržan
plaća
ARTIKAL
KUPAC # šifra artikla
# šifra kupca * naziv
* naziv * cena
Primer
NORMALIZACIJA RELACIJE
STUDENTI:
1NF
1NF
2NF

Relacija je u drugoj normalnoj formi ako je relacija u


prvoj normalnoj formi i svi atributi potpuno
funkcionalno zavise od primarnog ključa, a ne od
nekog njegovog dela.

2NF je uvek ispunjena kada je primarni ključ prost


atribut, odnosno kada se primarni ključ sastoji samo
od jednog atributa.
2NF
3NF
Kaže se da je relacija u trećoj normalnoj formi ako je u
prvoj i drugoj normalnoj formi i ako svaki atribut koji nije
deo primarnog ključa zavisi samo od primarnog ključa,
odnosno ne postoji zavisnost između ne –ključnih atributa.

Može se reći da je relacija u 3NF ako je u 2NF i ako


svi njeni ne-ključni atributi zavise od primarnog ključa.

Za 3NF se zahteva da svaka tabela sadrži podatke o


samo jednom tipu entiteta.
3NF
Relacija Studenti1 ne zadovoljava uslove 3NF jer postoji
zavisnost između ne-ključnih atributa SifraSmera i Smer.

Ova dva atributa su tranzitivno zavisna od primarnog ključa


BrojIndeksa.
PRIMER

Preduzeće „NewCo“ ugovara i izvodi projekte tako da svaki


projekat ugovara sa tačno jednim naručiocem. Trenutno stanje
ugovorenih projekata dato je tabelom PROJEKTI.

U kojoj normalnoj formi se nalazi relacija (tabela) PROJEKTI?


Na osnovu date tabele nacrtati deo ER modela, tako da bude u 3NF
МОДЕЛОВАЊЕ РЕЛАЦИОНИХ БАЗА ПОДАТАКА

мр Милош Пејановић, дипл.инж.


Шта је денормализација?
 Денормализација је поступак побољшања
перформанси базе података додавањем
редундантних података, уз нарушавање нормалних
форми.

 Денормализација представља поступак “спуштања”


релација из више у нижу нормалну форму.

 Денормализација се врши над потпуно


нормализованим концептуалним моделом.
 Nad potpuno normalizovanim modelom se vrši
denormalizacija i pri tome se:

 narušavaju normalne forme,


 uvodi redundansa podataka i
 narušava integritet podataka.
Posledica
 Zbog uvedene redundanse i narušavanja integriteta
podataka, neophodno je:

 kroz aplikacioni kôd kompenzovati posledice


denormalizacije, tj. omogućiti očuvanje integriteta i
konzistentnosti redundantnih podataka

 (Primer: upotreba trigera nad denormalizovanim


tabelama u bazi podataka).
Пример денормализације
Последице денормализације
 нарушавају се нормалне форме,

 уводи се редунданса података,

 нарушава се интегритет података,

 имплементација постаје сложенија,

 смањује се флексибилност система и

 успорава се ажурирање.
Зашто онда вршити
денормализацију?
 Понекад нормализована база података не пружа
максималну ефикасност

 Постоје ситуације у којима је неопходно


прихватити губитак појединих предности потпуне
нормализације због перформанси система

 Може смањити број табела у бази

 Смањује број JOIN наредби


Зашто онда вршити
денормализацију?
 На пример, некада су корисницима потребни
подаци који се налазе у две или више повезаних
табела.

 Да би се ти подаци обезбедили неопходно је


извршити спајање табела.

 Како се број табела за спајање повећава, трошкови


приступа се повећавају, у зависности од величине
табела, индекса итд.
Зашто онда вршити
денормализацију?
 На пример, ако индекси нису доступни, спајање
многих великих табела може трајати предуго.

 У том случају денормализација је пожељна.

 Денормализација је намерно дуплирање колона у


више табела, чиме се уводи редунданса података,
али се побољшавају перформансе упита.
Пожељно је денормализовати
ако:
 је брзина базе података тј. извршавања упита
неприхватљива.

 се предвиђа врло мало INSERT, UPDATE или


DELETE акција.

 се предвиђа пуно SELECT упита у којима се


удружују табеле.
Како се врши денормализација?
1. Над потпуно нормализованим моделом, изабране
релације се спуштају у нижу нормалну форму.

2. Црта се ER дијаграм за денормализован


модел.
Како се врши денормализација?
3. Због уведене редундансе и нарушавања
интегритета података, неопходно је кроз
апликациони кoд компензовати последице
денормализације, тј. омогућити очување
интегритета и конзистентности
редундантних података (нпр. употребом
тригера над денормализованим табелама у бази
података).
Triger se može definisati kao proceduralni kod koji se
automatski izvršava svaki put kada se desi definisani
događaj nad određenom tabelom ili pogledom
Како се врши денормализација?
4. Пре саме имплементације тригера, потребно је
дати њихову спецификацију у виду табеле. У
оквиру табеле спецификације тригера наводе се
сви неопходни тригери и даје се кратак опис
акција које ти тригери извршавају као одговоре
на ДМЛ операције над табелама које су
учествовале у денормализацији.
 Specifikacija trigera daje se za sve slučajeve u kojima
može doći do narušavanja integriteta baze podataka, a
pri čemu ti slučajevi nisu već obuhvaćeni
referencijalnim integritetom
Општа структура табеле
спецификације тригера је:
Табела спецификације тригера
 Спецификација тригера даје се за све случајеве у
којима може доћи до нарушавања интегритета базе
података, а при чему ти случајеви нису већ
обухваћени референцијалним интегритетом

 Нпр. брисање надтабеле за коју постоји бар једна


вредност у подтабели је обухваћено
референцијалним интегритетом, па због тога се не
наводи као акција која ће бити обухваћена
тригером
Врсте денормализације
 Денормализација 2нф

 Pre-joining

 Денормализација 3нф

 Pre-joining

 Short-circuit keys (Кратак спој кључева)


Pre-joining
 Врста денормализације у којој се некључни
атрибут из референциране релације додаје у
референцирајућу релацију, преко спољног кључа
у референцирајућој релацији или дела примарног
кључа референцирајуће релације.

 Користи се у случају када желимо да укључимо неку


некључну колону у којој су нама битне
информације.

 Може се нарушити 2нф или 3нф.


Pre-joining
 Вредност се спушта на основу примарног, односно спољног
кључа
 Друга нормална форма – на основу примарног кључа
 Трећа нормална форма – на основу спољног кључа
 Предности:
 Операција спајања табела се изоставља

 Недостаци:
 Додатне ДМЛ операције и дефинисање тригера

 Додатни меморијски простор


Short-circuit keys
 Врста денормализације у којој се примарни кључ
из референциране релације додаје у
референцирајућу релацију као спољни кључ, тј. у
којој се креира нова веза између две табеле које су
већ спојене посредовањем треће табеле.

 Може се нарушити 3нф.


Short-circuit keys
 Често се користи у базама података у којима су подаци подељени у више
нивоа
 Омогућава повезивање података са највишег и најнижег нивоа
 Директно повезивање омогућава нови спољни кључ
 Предности:
 Смањује број табела које је неопходно повезати да би се добили жељени
подаци
 Недостаци:
 Потреба за креирањем новог спољног кључа

 Неопходно додатно кôдирање како би се обезбедила конзистентност


података; дефинисање тригера
Препоруке за денормализацију:
 Увек прво направити концептуални модел података
који је потпуно нормализован.
 Користити денормализацију као последњу опцију за
побољшање перформанси.
 Никада не претпостављати да ће денормализација бити
потребна.
 Да би се испунили циљеви учинка, пожељно је
извршити денормализацију у процесу дизајна базе
података.
 Када се испуне циљеви учинка, не треба спроводити
даље денормализацију.
 Потпуно документовати сву денормализацију, наводећи
шта је урађено у табелама, који код је додат да би се
очувао нарушени интегритет и разлози за и против
денормализације.
Примери
Денормализација 2НФ
Пример 1
Кориснику је уз ставке рецепата потребно увек приказати назив
рецепта.
Денормализовати модел тако да при овом захтеву не буде потребно
спајање табела.
Пример 1
Денормализован модел:
Пример 1
Физички модел:
Тип
Табела Колона Потребан Шта треба да се уради?
тригера

Insert НЕ

Recepti Update naziv_rec ДА

Delete НЕ

Insert ДА

naziv_rec ДА
Stavke
Update
Recepta
recept_id ДА

Delete НЕ
Тип
Табела Колона Потребан Шта треба да се уради?
тригера

Insert НЕ

Приликом измене вредности колоне


naziv_rec у табели Recepti, покреће се тригер
Recepti Update naziv_rec ДА
који измењену вредност ажурира у табели
StavkeRecepta

Delete НЕ

Тригер ажурира вредност колоне naziv_rec на


Insert ДА
основу унете вредности колоне recept_id

Тригер брани директно ажурирање колоне


naziv_rec ДА
naziv_rec
Stavke
Update
Recepta
Тригер ажурира вредност колоне naziv_rec на
recept_id ДА
основу унете вредности колоне recept_id

Delete НЕ
Пример 1
У односу на денормализовани модел, акције које могу
нарушити интегритет података су:
Измена вредности атрибута naziv_rec у релацији Recepti.
Неопходно је да се иста измена изврши и у релацији
StavkeRecepta.

Додавање нове StavkeRecepta. Не сме се дозволити


произвољни унос вредности атрибута naziv_rec у
релацији StavkeRecepta, већ се његова вредност поставља
на основу унете вредности атрибута recept_id у оквиру
исте релације.
Пример 1
 Измена вредности атрибута naziv_rec у релацији
StavkeRecepta. Ова измена не сме бити дозвољена,
обзиром да би довела до неконзистентности са исправном
вредношћу атрибута naziv_rec у релацији Recepti.

 Измена вредности атрибута recept_id у релацији


StavkeRecepta, уколико је дозвољена. При измени
вредности атрибута recept_id у релацији StavkeRecepta,
односно, при измени рецепта на који се одређена ставка
односи, мора се извршити ажурирање вредности атрибута
naziv_rec у истој релацији, како би одговарао називу
новоизабраног рецепта.
Primer denormalizacije 2NF
normalizovani model
 posle izvršene denormalizacije, relacija
Porudžbenica sadrži i redundantan atribut
NazivKupca, koji se takođe nalazi i u relaciji
Kupac.
Akcije koje mogu narušiti integritet podataka su
Trigeri
 Vrsta denormalizacije u kojoj se neključni
atribut iz referencirane relacije (u ovom
primeru, Kupac) dodaje u referencirajuću
relaciju (u ovom primeru, Porudžbenica), preko
spoljnog ključa u referencirajućoj relaciji ili dela
primarnog ključa referencirajuće relacije,
naziva se Pre – joining
 izvršena je denormalizacija Druge normalne forme. Naime, za
normalizovanu relaciju Porudžbenica važila je sledeća
funkcionalna zavisnost:

 ŠifraKupca, BrojPorudžbenice -> Datum, ŠifraRadnika

 Posle denormalizacije, za denormalizovanu relaciju


Porudžbenica važe sledeće funkcionalne zavisnosti:

 ŠifraKupca, BrojPorudžbenice -> Datum, NazivKupca, ŠifraRadnika


 ŠifraKupca -> NazivKupca
 Očigledno je da atribut NazivKupca, dodat u relaciju
Porudžbenica tokom denormalizacije,nepotpuno
funkcionalno zavisi od složenog atributa ŠifraKupca,
BrojPorudžbenice,

 jer je funkcionalno zavisan i od njega i od njegovog


dela (ŠifraKupca), što se može videti po drugoj
funkcionalnoj zavisnosti koja se javila posle
denormalizacije relacije Porudžbenica

 relacija Porudžbenica više nije u Drugoj normalnoj


formi
Денормализација 3НФ
Пример 2
Кориснику је веома често потребан приказ назива јединице мере за
одабрани производ.
Денормализовати модел тако да при овом захтеву не буде потребно
спајање табела.
Пример 2
Денормализован модел:
Пример 2
Физички модел:
Тип
Табела Колона Потребан Шта треба да се уради?
тригера

Insert НЕ

Jedinice
Update naziv_jm ДА
Mere

Delete НЕ

Insert ДА

naziv_jm ДА
Proizvodi Update
sif_jm ДА

Delete НЕ
Тип
Табела Колона Потребан Шта треба да се уради?
тригера

Insert НЕ

Приликом измене вредности колоне


Jedinice naziv_jm у табели JediniceMere, покреће се
Update naziv_jm ДА
Mere тригер који измењену вредност ажурира у
табели Proizvodi

Delete НЕ

Тригер ажурира вредност колоне naziv_jm


Insert ДА
на основу унете вредности колоне sif_jm

Тригер брани директно ажурирање колоне


naziv_jm ДА
naziv_jm
Proizvodi Update
Тригер ажурира вредност колоне naziv_jm
sif_jm ДА
на основу унете вредности колоне sif_jm

Delete НЕ
Пример 2
У односу на денормализовани модел, акције које
могу нарушити интегритет података су:
Измена вредности атрибута naziv_jm у релацији
JediniceMere. Неопходно је да се иста измена изврши
и у релацији Proizvodi.

Додавање новог реда у табелу Proizvodi. Не сме се


дозволити произвољни унос вредности атрибута
naziv_jm у релацији Proizvodi, већ се његова вредност
поставља на основу унете вредности атрибута sif_jm у
оквиру исте релације.
Пример 2
 Измена вредности атрибута naziv_jm у релацији
Proizvodi. Ова измена не сме бити дозвољена, обзиром
да би довела до неконзистентности са исправном
вредношћу атрибута naziv_jm у релацији JediniceMere.

 Измена вредности атрибута sif_jm у релацији Proizvodi,


уколико је дозвољена. При измени вредности атрибута
sif_jm у релацији Proizvodi, односно, при измени
јединице мере за одређени производ, мора се извршити
ажурирање вредности атрибута naziv_jm у истој
релацији, како би одговарао називу новоизабране
јединице мере.
Пример 3
Корисник често захтева приказ ставке поруџбенице са јединицом
мере за производ на који се та ставка односи.
Денормализовати модел тако да се при овом захтеву смањи бројх
спајања табела.
Пример 3
Денормализован модел:
Пример 3
Физички модел:
Тип
Табела Колона Потребан Шта треба да се уради?
тригера

Insert НЕ

Proizvodi Update id_jm ДА

Delete НЕ

Insert ДА

id_jm ДА
Stavke
porudzbe Update
nice
id_pr ДА

Delete НЕ
Тип
Табела Колона Потребан Шта треба да се уради?
тригера

Insert НЕ

Уколико постоји StavkaPorudzbenice


која се односи на Proizvod који се ажурира,
Proizvodi Update id_jm ДА тригер ажурира id_jm у табели
StavkaPorudzbenice на основу нове вредности
у табели Proizvod

Delete НЕ

Тригер ажурира вредност колоне id_jm на


Insert ДА
основу унете вредности колоне id_pr

Тригер брани директно ажурирање колоне


id_jm ДА
Stavke id_jm
porudzbe Update
nice Тригер ажурира вредност колоне id_jm на
id_pr ДА
основу унете вредности колоне id_pr

Delete НЕ
Пример 3
У односу на денормализовани модел, акције које могу
нарушити интегритет података су:
Измена вредности атрибута id_jm у релацији Proizvodi.
Неопходно је да се иста измена изврши и у релацији
StavkaPorudzbenice .

Додавање новог реда у табелу StavkaPorudzbenice . Не


сме се дозволити произвољни унос вредности атрибута
id_jm у релацији StavkaPorudzbenice, већ се његова
вредност поставља на основу унете вредности атрибута
id_pr у оквиру исте релације.
Пример 3
 Измена вредности атрибута id_jm у релацији
StavkaPorudzbenice. Ова измена не сме бити дозвољена,
обзиром да би довела до неконзистентности са исправном
вредношћу атрибута id_jm у релацији Proizvodi.

 Измена вредности атрибута id_pr у релацији


StavkaPorudzbenice, уколико је дозвољена. При измени
вредности атрибута id_pr у релацији StavkaPorudzbenice,
односно, при измени производа на који се ставка
поруџбенице односи, мора се извршити ажурирање
вредности атрибута id_jm у истој релацији, како би
одговарао називу новоизабране јединице мере.
ПИТАЊА ?
Програмирање база података

23 March 2021 mr Miloš Pejanović, dipl.inž. 1


Језици СУБП-а
 DDL (Data Definition Language) – описује структуру
података; служи за креирање, мењање и брисање
објеката базе података (табеле, колоне, ограничења,
индекс, ...).
 DML (Data Manipulation Language) – језик за
претраживање, додавање, ажурирање и брисање
података.
 DCL (Data Control Language) – језик за контролу
привилегија у бази.
 TCL (Transaction Control) – груписање DML исказа у
трансакције

23 March 2021 mr Miloš Pejanović, dipl.inž. 2


DML
 INSERT – убацује податке у табелу

 SELECT – враћа податке из табеле

 UPDATE – ажурира податке

 DELETE – брише податке

23 March 2021 mr Miloš Pejanović, dipl.inž. 3


INSERT
 INSERT
INTO table_name
VALUES (value1,value2,value3,...);

 INSERT
INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);

 INSERT INTO suppliers (supplier_id, supplier_name)


VALUES (24553, 'IBM');
23 March 2021 mr Miloš Pejanović, dipl.inž. 4
SELECT
 SELECT *
FROM table_name;

 SELECT column_name,column_name
FROM table_name;

 SELECT *
FROM employees;

 SELECT employee_id, salary


FROM employees;
23 March 2021 mr Miloš Pejanović, dipl.inž. 5
INSERT SELECT
 INSERT INTO table
SELECT *
FROM table1
[WHERE condition];

 INSERT INTO table


(column_name(s))
SELECT column_name(s)
FROM table1
[WHERE condition];

23 March 2021 mr Miloš Pejanović, dipl.inž. 6


UPDATE
 UPDATE table_name
SET column1=value1,column2=value2,... ;

 UPDATE Customers
SET ContactName='Alfred Schmidt', City='Hamburg';

23 March 2021 mr Miloš Pejanović, dipl.inž. 7


DELETE
 DELETE FROM table_name;

 DELETE * FROM table_name;

23 March 2021 mr Miloš Pejanović, dipl.inž. 8


Алијаси
 SELECT column_name AS alias_name
FROM table_name;

 SELECT column_name(s)
FROM table_name alias_name;

 SELECT first_name as Name, last_name as Surname


FROM products p;

23 March 2021 mr Miloš Pejanović, dipl.inž. 9


WHERE

23 March 2021 mr Miloš Pejanović, dipl.inž. 10


WHERE
 SELECT column_name,column_name
FROM table_name
WHERE condition;

 UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;

 DELETE FROM table_name


WHERE some_column=some_value;
23 March 2021 mr Miloš Pejanović, dipl.inž. 11
Оператори у WHERE клаузули
Симбол Значење
= Једнако
< Мање
<= Мање или једнако
> Веће
>= Веће или једнако
<> Није једнако
!= Није једнако
BETWEEN У наведеном опсегу
LIKE Уклапа се у наведени патерн
IN Једна од наведених вредности
IS NULL/IS NOT NULL Да ли је NULL или не
EXISTS Супротно од IS NULL
23 March 2021 mr Miloš Pejanović, dipl.inž. 12
Математички оператори
 SELECT *
FROM employees
WHERE salary >= 15000;
 SELECT name
FROM employees
WHERE name < ‘David’;
 SELECT first_name, last_name
FROM employees
WHERE hire_date > ’01/02/1998’;
23 March 2021 mr Miloš Pejanović, dipl.inž. 13
BETWEEN
 WHERE column_name BETWEEN value1 AND value2;

 SELECT * FROM Products


WHERE Price BETWEEN 10 AND 20;

23 March 2021 mr Miloš Pejanović, dipl.inž. 14


LIKE
 WHERE column_name LIKE pattern;

Симбол Значење
Allows you to match any string of any
%
length (including zero length)
Allows you to match on a single
_
character

 SELECT last_name FROM customers


WHERE last_name LIKE '%e%';

23 March 2021 mr Miloš Pejanović, dipl.inž. 15


IN
 WHERE column_name IN (value1,value2,...);

 UPDATE Products
SET sale_code = ‘2’
WHERE city IN ('Paris','London');

23 March 2021 mr Miloš Pejanović, dipl.inž. 16


IS [NOT] NULL
 WHERE column_name IS [NOT] NULL;

 SELECT LastName,FirstName,Address FROM Persons


WHERE Address IS NULL

 SELECT LastName,FirstName,Address FROM Persons


WHERE Address IS NOT NULL

23 March 2021 mr Miloš Pejanović, dipl.inž. 17


Аритметички оператори
Симбол
+
-
*
/
^

23 March 2021 mr Miloš Pejanović, dipl.inž. 18


Аритметички оператори
 SELECT price, disc_perc, price-price*disc_perc/100
FROM products
WHERE price > 3000;

 DELETE
FROM products
WHERE price-price*disc_perc/100 >3000

23 March 2021 mr Miloš Pejanović, dipl.inž. 19


Логички оператори

Симбол Значење
AND Ред мора да испуни све услове
OR Ред мора да испуни бар један услов
NOT Може да стоји испред било ког услова

23 March 2021 mr Miloš Pejanović, dipl.inž. 20


AND, OR
 SELECT * FROM Customers
WHERE Country='Germany'
AND City='Berlin';
 SELECT * FROM Customers
WHERE City='Berlin'
OR City='München';
 SELECT * FROM Customers
WHERE Country='Germany'
AND (City='Berlin' OR City='München');

23 March 2021 mr Miloš Pejanović, dipl.inž. 21


NOT
 SELECT * FROM product WHERE code NOT 213;

 SELECT * FROM customers WHERE customer_name


IS NOT NULL;

 SELECT supplier_name FROM suppliers WHERE


supplier_name NOT LIKE 'T%';

 SELECT * FROM suppliers WHERE supplier_id NOT


BETWEEN 5000 AND 5500;

23 March 2021 mr Miloš Pejanović, dipl.inž. 22


DISTINCT
 SELECT DISTINCT expressions
FROM tables
[WHERE conditions];

 SELECT DISTINCT city


FROM employees;

23 March 2021 mr Miloš Pejanović, dipl.inž. 23


Агрегатне функције
Симбол Значење
COUNT Број редова
MIN
MAX
SUM Збир
AVG Просек

23 March 2021 mr Miloš Pejanović, dipl.inž. 24


COUNT
 SELECT COUNT(aggregate_expression) FROM tables
[WHERE conditions];

 SELECT COUNT(*) AS "Number of employees" FROM


employees WHERE salary > 25000;

 SELECT COUNT(DISTINCT department) AS "Unique


departments" FROM employees WHERE salary >
25000;

23 March 2021 mr Miloš Pejanović, dipl.inž. 25


MIN, MAX, SUM, AVG
 SELECT min (salary) as min_plata,
max (salary) as max_plata,
avg (salary) as pros_plata,
sum (salary) as zbir_plata
FROM employees;

23 March 2021 mr Miloš Pejanović, dipl.inž. 26


NUMERIC функције
 ABS(num_col_name)
 ROUND(num_col_name, precision)

23 March 2021 mr Miloš Pejanović, dipl.inž. 27


DATE функције
 ADD_MONTHS(date, number)
 TO_CHAR(date_col, date_format)
 TO_DATE('2000-01-02', 'YYYY-MM-DD') -
TO_DATE('2000-01-01', 'YYYY-MM-DD') AS DateDiff
 BETWEEN TO_DATE ('1995/02/01', 'yyyy/mm/dd')
AND TO_DATE ('1999/02/28', 'yyyy/mm/dd');

 Date formats:
 YYYY, YY, MM, DD
 YEAR, MONTH, DAY
 MON, DY
 https://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_
elements004.htm
23 March 2021 mr Miloš Pejanović, dipl.inž. 28
CHAR функције
 TO_CHAR(col_name [, format])
 INSTR( string, substring [, start_position [,
appearance_num ] ] )
 CONCAT(char1, char2)
 LOWER(col_name)
 UPPER(col_name)
 REPLACE(col_name, search_str, replace_str)
 SUBSTR(col_name, position, substr_length)

23 March 2021 mr Miloš Pejanović, dipl.inž. 29


ORDER BY

23 March 2021 mr Miloš Pejanović, dipl.inž. 30


ORDER BY
 SELECT column_name, column_name
FROM table_name
ORDER BY column_name ASC|DESC,
column_name ASC|DESC, ... ;

 SELECT * FROM Employees


ORDER BY first_name ASC, last_name DESC;

23 March 2021 mr Miloš Pejanović, dipl.inž. 31


GROUP BY

23 March 2021 mr Miloš Pejanović, dipl.inž. 32


GROUP BY
 SELECT column_name,
aggregate_function(column_name)
FROM table_name
[WHERE condition]
GROUP BY column_name_1, column_name_2, ... ;

 SELECT department, SUM(sales) AS "Total sales"


FROM order_details GROUP BY department;

 SELECT department, COUNT(*) AS "Number of


employees" FROM employees WHERE salary > 25000
GROUP BY department;
23 March 2021 mr Miloš Pejanović, dipl.inž. 33
GROUP BY
 SELECT department, MIN(salary) AS "Lowest salary"
FROM employees
GROUP BY department;

 SELECT department, MAX(salary) AS "Highest


salary"
FROM employees
GROUP BY department;

23 March 2021 mr Miloš Pejanović, dipl.inž. 34


RELACIONE BAZE PODATAKA

SQL:
SELECT ..FROM, WHERE, ORDER BY, GROUP BY, HAVING
OPERATORI
OPERACIJE, UGRAĐENE FUNKCIJE
 UPITI NAD JEDNOM TABELOM
NAREDBE ZA RUKOVANJE PODACIMA omogućavaju izveštavanje iz baze
podataka (izdvajanje postojećih i izračunavanje novih informacija) i ažuriranje baze
podataka u širem smislu.

Izveštavanje iz baze podataka:


 SELECT – pristup podacima, prikaz pronađenih ili izračunatih sadržaja iz baze
podataka.

Ažuriranje baze podataka:


 INSERT – unošenje podataka, dodavanje novih redova u tabelu,
 DELETE – brisanje podataka, izbacivanje redova iz tabele,
 UPDATE – ažuriranje, izmena vrednosti podataka u koloni.

23-Mar-21 mr Miloš Pejanović, dipl.inž. 2


SELECT ([ALL | DISTINCT] <lista_atributa1> ) | *
FROM <lista_tabela>
[ WHERE <lista_uslova1> ]
[ GROUP BY <lista_atributa2> ]
[ HAVING <lista_uslova2> ]
[ ORDER BY <lista_atributa3> ]
SELECT koji atributi
FROM iz kojih tabela
WHERE uslov nad zapisima date tabele
GROUP BY grupisanje po atributima
HAVING uslovi za kreirane grupe
ORDER BY sortiranje po atributima
23-Mar-21 mr Miloš Pejanović, dipl.inž. 3
 Ključna reč
Ključna reč ukazuje na poseban SQL-iskaz. Ključne reči su: SELECT, FROM, WHERE,
GROUP BY, HAVING, ORDER BY
 Klauzula
Klauzula je deo SQL-rečenice. Na primer, klauzule su:
- SELECT id, plata
- WHERE plata=3000
- FROM radnici
- ORDER BY plata
 Rečenica (naredba)
Rečenica je jedna klauzula ili kombinacija dve ili više klauzula, kojom se izvršava neka
operacija nad bazom podataka. Završava se znakom ;
- SELECT ime FROM radnici;
- SELECT * FROM radnici;
- SELECT id_radnik, ime, plata FROM radnici ORDER BY plata;
23-Mar-21 mr Miloš Pejanović, dipl.inž. 4
U naredbi SELECT se:
 Navode atributi (<lista_atributa1>) čije vrednosti želimo prikazati –
odgovara operatoru projekcije,
 Izdvajaju tabele (<lista_tabela>) u kojima se nalaze vrednosti tih
atributa – odgovara operatoru spajanja,
 Definišu uslovi (<lista_uslova1> , <lista_uslova2> ), koje podaci
treba da zadovoljavaju – odgovara operatoru selekcije
(restrikcije),
 Definiše grupisanje (<lista_atributa2>),
 Definše uređenje (<lista_atributa3>).
23-Mar-21 mr Miloš Pejanović, dipl.inž. 5
U najjednostavnijem obliku, SELECT rečenica mora da sadrži:

• SELECT klauzulu, koja specificira koja kolona se prikazuje

• FROM klauzulu, koja specificira tabelu kojoj pripada kolona


navedena u SELECT klauzuli.

23-Mar-21 mr Miloš Pejanović, dipl.inž. 6


SELECT-rečenicom se izvršavaju operacije:
PROJEKCIJA je operacija koja iz skupa SELEKCIJA je operacija koja izdvaja instance
atributa izdvaja samo one koji su od koje zadovoljavaju specificiran uslov. Omogućava
interesa. Omogućava izbor kolona iz tabele! izbor redova iz tabele (restrikcija).

23-Mar-21 mr Miloš Pejanović, dipl.inž. 7


Klauzula SELECT nam omogućava:

 Da izaberemo atribute čije vrednosti želimo dobiti

 Da definišemo redosled prikazivanja atributa u odgovoru (ovaj


redosled se ne mora poklapati sa redosledom atributa u definiciji
tabele)

 Da sprečimo pojavu identičnih instanci:


 Opcija DISTINCT eliminiše identične vrednosti po kolonama iz
rezultata.
23-Mar-21 mr Miloš Pejanović, dipl.inž. 8
Prikazivanje svih kolona podataka u tabeli može se izvršiti korišćenjem
ključne reči SELECT sa zvezdicom(*).

Prikazati sve podatke o radnicima.

SELECT *
FROM RADNICI

23-Mar-21 mr Miloš Pejanović, dipl.inž. 9


Prikazati ime i platu radnika
 Za dodavanje kolone plata u već kreiranu tabelu koristili smo klauzulu ALTER
TABLE
 ALTER TABLE radnici
ADD COLUMN plata FLOAT NOT NULL AFTER datum_zap;

Upit za prikaz imena i plate radnika


SELECT ime, plata
FROM radnici

23-Mar-21 mr Miloš Pejanović, dipl.inž. 10


Prikazati ime, platu i datum
zaposlenja radnika.

SELECT ime, plata, datum_zap


FROM radnici;

23-Mar-21 mr Miloš Pejanović, dipl.inž. 11


SELECT rečenica koja se koristi za projekciju određenih
kolona iz neke tabele, prikazuje sve vrednosti iz tih
kolona, pri čemu može da se desi da se neke vrednosti
ponavljaju

SELECT mesto FROM odeljenja;

Ova rečenica daje informaciju o mestima na


kojima se nalaze odeljenje. Postoje 2 odeljenja
koja se nalaze na Voždovcu i dva odeljenja na
Novom Beogradu.

Zbog toga ovakav upit vraća redove koji se


ponavljaju.
23-Mar-21 mr Miloš Pejanović, dipl.inž. 12
Prikazati bez ponavljanja lokacije
odeljenja

Ako je potrebno prikazati samo različite


vredosti, a ne i koliko puta se pojavljuju,
koristiće se ključna reč DISTINCT.

SELECT DISTINCT mesto


FROM odeljenja

Sada su prikazana dva reda manje. Svi prikazani redovi imaju različite vrednosti.

23-Mar-21 mr Miloš Pejanović, dipl.inž. 13


SELEKCIJA je operacija koja izdvaja instance koje zadovoljavaju specificiran
uslov.

U naredbi SELECT uslov se zadaje klauzulom WHERE.

U uslovu se kao operandi javljaju atributi ili ugnježdena naredba SELECT i


OPERATORI POREĐENJA.

Neki operatori porede datu kolonu ili izraz sa jednom vrednošću (jednoredni
operatori), a drugi porede sa skupom ili intervalom vrednosti (višeredni
operatori).

23-Mar-21 mr Miloš Pejanović, dipl.inž. 14


Operator Opis operatora Primer upotrebe
=, <, >, <>, <=, ime=‘Petar‘
Standardni relacijski operatori
>= plata> 2000
ime=‘Petar‘ AND (OdeljenjeID =20 OR
AND, OR, NOT Standardni logički operatori
OdeljenjeID=30)
Omogućava pronalaženje traženog teksta u nekom ime LIKE ‘М%‘; ime LIKE ‘%M‘
LIKE
podatku znakovnog tipa. ime LIKE ‘%М%‘; Ime LIKE ‘_‘

BETWEEN ... Ispituje da li se vrednost datog izraza nalazi između


Plata BETWEEN 1000 AND 5000
AND dve zadate vrednosti uključujući i zadate vrednosti

Ispituje da li se vrednost datog izraza nalazi u


IN mesto IN (‘Beograd‘, ‘Zemun‘)
specificiranoj listi
radnikID = ALL
Ispituje da li se sve vrednost datog izraza nalazi u
ALL (SELECT radnikID FROM ucesce WHERE finasije
specificiranoj listi
> 100000)
radnikID = ANY
Ispituje da li se bar jedna vrednost datog izraza
ANY (SELECT radnikID FROM ucesce WHERE finasije > 100000)
nalazi u specificiranoj listi
23-Mar-21 mr Miloš Pejanović, dipl.inž. 15
Kada se zahtevaju podaci iz baze podataka, možda nisu potrebni svi redovi iz
tabele pa je neophodno ograničiti redove podataka koji će biti prikazani. Ovo se
postiže WHERE klauzulom. WHERE klauzula sadrži uslov kojim mora da se
ispuni i navodi se odmah posle FROM klauzule u SQL rečenici.

Alijasi i agregatne funkcije se ne mogu upotrebljavati u WHERE klauzuli!

Sintaksa WHERE klauzule:


WHERE ime_kolone uslov_poređenja vrednost || lista_vrednosti

23-Mar-21 mr Miloš Pejanović, dipl.inž. 16


Prikazati imena i kvalifikacije svih zaposlenih u odeljenju 10.

SELECT ime, kvalif


FROM radnici
WHERE odeljenjeID=10

23-Mar-21 mr Miloš Pejanović, dipl.inž. 17


Prikazati imena i datume zaposlenja zaposlenih u odeljenju 30 koji se se zaposlili
posle 31. 12. 2016. godine:

SELECT ime, datum_zap


FROM radnici
WHERE odeljenjeID=30 AND datum_zap>'2016-12-31'`

23-Mar-21 mr Miloš Pejanović, dipl.inž. 18


Prikazati imena i plate zaposlenih koji nemaju visoku (VSS) ili visoko kvalifikovanu
stručnu spremu (VKV).

SELECT ime, plata


FROM radnici WHERE kvalif<>'VSS’
AND kvalif<>'VKV'

23-Mar-21 mr Miloš Pejanović, dipl.inž. 19


Prikazati nazive odeljenja koja se
nalaze na Novom Beogradu ili
Voždovcu.

SELECT naziv FROM odeljenja


WHERE mesto IN ('Novi
Beograd','Voždovac’)

Operator poređenja IN se koristi da


bi se proverilo da li neka vrednost
pripada skupu vrednosti.

23-Mar-21 mr Miloš Pejanović, dipl.inž. 20


Prikazati imena i plate radnika čija je
plata između 30000 i 45000
uključujući i te vrednosti.
SELECT ime, plata FROM radnici
WHERE plata BETWEEN 30000
AND 45000
Ne postoje neke posebne razlike u
performansama kada se koristi
BETWEEN...AND u odnosu na druge
operatore komparacije. Operator
BETWEEN...AND se koristi zbog
jednostavnosti u čitanju koda i
dobijanju rezultata iz baze podataka.
23-Mar-21 mr Miloš Pejanović, dipl.inž. 21
Po čemu se razlikuju rezultati datih upita:

SELECT title, year


FROM d_cds
WHERE year BETWEEN 1999 AND 2001;

SELECT title, year


FROM d_cds
WHERE year IN (1999,2001);

23-Mar-21 mr Miloš Pejanović, dipl.inž. 22


Prikazati imena radnika čije ime počinje sa
slovom L
SELECT ime
FROM radnici
WHERE ime LIKE 'L%’

Prikazati odeljenja koja imaju 2


karaktera u nazivu odeljenja.
SELECT *
FROM odeljenja
WHERE naziv LIKE '__';
23-Mar-21 mr Miloš Pejanović, dipl.inž. 23
Prikazati imena radnika čije ime počinje slovom L ili završava slovom r

SELECT ime
FROM radnici
WHERE ime
LIKE 'L%' OR
ime LIKE '%r'

23-Mar-21 mr Miloš Pejanović, dipl.inž. 24


Operatori ALL i ANY se koriste na sledeći način:
kolona/izraz jednoredni_operator ALL (niz vrednosti)
kolona/izraz jednoredni operator ANY (nizvrednosti)

Uslov sa ALL je ispunjen ako jednoredni operator vraća vrednost


True za sve vrednosti iz datog niza vrednosti.

Uslov sa ANY je ispunjen ako jednoredni operator vraća vrednost


True za bar jednu vrednost iz datog niza vrednosti

23-Mar-21 mr Miloš Pejanović, dipl.inž. 25


1. Prikazati ime i mesto odeljenja za odeljenja koja sadrži slovo n u imenu.
2. Prikazati nazive različitih poslova u preduzeću.
3. Prikazati imena zaposlenih koji rade u odeljenju 10.
4. Prikazati imena i identifikacione brojeve svih zaposlenih u preduzeću za radnike koji imaju kvalifikaciju KV ili VKV ili
VSS.
5. Prikazati ime, prezime i platu za radnike koji rade obavljaju posao analitičara ili imaju platu veću od 2000 i manju od
5000 uključujući i te vrednosti .
6. Prikazati posao zaposlenih koji rade u odeljenju 20 i zaposleni su posle 2000. godine.

23-Mar-21 mr Miloš Pejanović, dipl.inž. 26


Primer primene aritmetičkih operatora:

SELECT ime, plata, plata+2345


FROM radnici
WHERE kvalif='KV’

Dati primer pokazuje upotrebu aritmetičke


operacije sabiranja da bi se izračunala
plata povećana za 2345 zaposlenima koji
imaju KV kvalifikaciju.
Prikazana je kao nova kolona plata+2345.

23-Mar-21 mr Miloš Pejanović, dipl.inž. 27


Prioritet aritmetičkih operacija:

1. ()
2. *, /
3. +, -

23-Mar-21 mr Miloš Pejanović, dipl.inž. 28


UREĐIVANJE REZULTATA UPITA (SORTIRANJE) po vrednosti
izabranih atributa postiže se klauzulom ORDER BY.
Klauzula ORDER BY eksplicitno određuje redosled instanci u rezultatu
upita po nekom kriterijumu (po abecedi, po veličini, itd.) u rastućem (ASC)
ili opadajućem (DESC) poretku.
Klauzula ORDER BY je uvek poslednja klauzula u naredbi SELECT jer
se instance najpre izdvajaju, a zatim uređuju.
Sortiranje se može obavljati po više atributa.
Rastući redosled se podrazumeva, pa je odrednica ASC izostavljena.
23-Mar-21 mr Miloš Pejanović, dipl.inž. 29
Prikazati sve podatke o radnicima sortirane po imenima u rastućem
redosledu.

SELECT * FROM radnici


ORDER BY ime

Prikazati sve podatke o radnicima sortirane po imenima u rastućem pa po


plati u opadajućem redosledu.

SELECT * FROM radnici


ORDER BY ime ASC, plata DESC
23-Mar-21 mr Miloš Pejanović, dipl.inž. 30
Prikazati naziv fakulteta bez ponavljanja sortirane po opadajućem redosledu

SELECT DISTINCT naziv FROM fakultet


ORDER BY naziv DESC;

Prikazati sve podatke o radnicima koji imaju kvalifikaciju KV sortirane po


imenima u rastućem pa po plati u opadajućem redosledu.

SELECT * FROM radnici


WHERE kvalif=‘KV’
ORDER BY ime ASC, plata DESC

23-Mar-21 mr Miloš Pejanović, dipl.inž. 31


Null je vrednost koja je nedodeljena, nepoznata ili neupotrebljiva.

Null nije isto što i nula ili blanko znak. U SQL-u nula je broj, blanko je
znak, a null znači ne postojanje bilo kakve vrednosti. Dakle, NULL znači
da nema vrednosti.

Ako je neko svojstvo neprimenljivo na većinu primeraka entiteta, onda


taj atribut treba eliminisati iz tabele još u fazi projektovanja.

Ako je vrednost bilo koje kolone u aritmetičkom izrazu null, rezultat je


null (nepoznat).

23-Mar-21 mr Miloš Pejanović, dipl.inž. 32


 Npr., mogući atribut entiteta STUDENT je nagrada. Međutim, većina studenata u
toku studija ne osvaja nikakve nagrade, pa bi za većinu studenata u toj rubrici stajala
NULL vrednost. S druge strane, neki studenti osvajaju i više nagrada, pa taj podatak
ne bi bio atomski. Stoga je ispravno uvesti novi entitet NAGRADA<šifra_nagrade#,
naziv_nagrade, broj_indeksa$, godina>. Tada bi se u odgovarajućoj tabeli
registrovali samo nagrađeni studenti svojim brojem indeksa i nazivom nagrade koju
su dobli.

 Mogući atribut entiteta RADNIK je telefon, ali je moguće da radnici nisu u obavezi
da podatak o telefonskom broju učine dostupnim.

 Tabela RADNIK u prethodnim primerima je definisana tako da dopušta da postoje


radnici za koje broj odeljenja nije poznat (odgovarajući atribut može uzeti vrednost
NULL).

23-Mar-21 mr Miloš Pejanović, dipl.inž. 33


Vrednosti u koloni Nova plata izračunate su po formuli:
Nova plata = Plata * (1 + Povećanje)

Kochhar i Zlotkey nisu imali povećanje pa bi trebalo da ostanu na


istoj plati, ali je Kochhar ostao bez plate. Zašto?
23-Mar-21 mr Miloš Pejanović, dipl.inž. 34
Rad sa NULL vrednostima u SQL-u podržan je operatorima:

 IS NULL (“je nula vrednost”)


 IS NOT NULL (“nije nula vrednost”)

 Prikazati sve podatke o radnicima koji nisu raspoređeni ni u jedno odeljenje.


SELECT *
FROM RADNIK
WHERE odeljenjeID IS NULL

 Prikazati imena i datume zaposlenja za sve zaposlene koji imaju premiju.


SELECT ime, datum_zap
FROM RADNIK
WHERE premija IS NOT NULL
23-Mar-21 mr Miloš Pejanović, dipl.inž. 35
Rad sa NULL vrednostima u SQL-u podržan je i funkcijom ISNULL u slučaju
SQL Servera odnosno za MySQL IFNULL (<ime_atributa> , <vrednost>):

 Služi da u upitu sistematski dodeli datu vrednost poljima koja u datoj koloni
imaju vrednost NULL. Ta dodela vrednosti je samo privremena i odnosi se na
izvršavanje tog upita.
 S obzirom da je cilj dodele da se nad poljima sa NULL vrednostima obavi
neka operacija, vrednost koja se dodeljuje je obično neutralna u odnosu na
tu operaciju.
 Ako treba da sabiramo ili oduzimamo, vrednost treba da bude 0; ako treba
da množimo ili delimo vrednost treba da bude 1; ako treba da konkateniramo
znakovne podatke vrednost treba da bude prazna znakovna konstanta.

23-Mar-21 mr Miloš Pejanović, dipl.inž. 36


Neka je tabela RADNIK dopunjena atributima plata i kredit:
ALTER TABLE RADNIK
ADD COLUMN plata INT,
ADD COLUMN kredit INT

Sledeća naredba prikazuje identifikacione brojeve, prezimena,


imena i primanja svakog radnika:
SELECT id_br, prezime, ime, plata+IFNULL(kredit,0)
FROM RADNIK

23-Mar-21 mr Miloš Pejanović, dipl.inž. 37


• Alijas je način preimenovanja imena kolona na izlazu.

• Bez alijasa, kolone prikazane kao rezultat SQL –rečenice


imaće ista imena kao kolone u tabeli ili ime koje pokazuje
aritmetičku operaciju, kao 12*(plata+100).

• Nekada je poželjno da na izlazu bude prikazano ime kolone


koje je lakše razumeti, ime koje je više „user friendly“. Alijasi
kolona dozvoljavaju preimenovanje kolone na izlazu.
23-Mar-21 mr Miloš Pejanović, dipl.inž. 38
 Postoji nekoliko pravila kod korišćenja alijasa kolona.
Alijas kolone:
– menja naslov kolone,
– koristan je kod proračuna,
– navodi se odmah posle imena kolone,
– može imati opcionalnu ključnu reč AS između imena kolone i alijasa,
– zahteva znake navoda ako alijas sadrži blanko-znak, specijalne
znake ili je osetljiv na velika i mala slova.

23-Mar-21 mr Miloš Pejanović, dipl.inž. 39


Primeri upotrebe alijasa:

SELECT ime, prezime, plata AS 'Mesečna


plata zaposlenog’ FROM radnici;

SELECT ime, prezime, plata*12 AS


'Uvaćana plata zaposlenog’
FROM radnici;

23-Mar-21 mr Miloš Pejanović, dipl.inž. 40


Klauzula GROUP BY iza koje sledi lista atributa po kojima se
grupisanje vrši omogućava GRUPISANJE instanci u rezultatu
naredbe SELECT.

Klauzulom GROUP BY instance u rezultatu bivaju presložene


tako da sve instance unutar grupe imaju jednake vrednosti
atributa po kojima se grupisanje vrši.

Ako se navede više atributa po kojima se vrši grupisanje, prvo se


ređaju instance sa jednakom vrednošću prvog atributa, zatim se
unutar tih grupa preslažu prema vrednostima drugog atributa, itd.
23-Mar-21 mr Miloš Pejanović, dipl.inž. 41
Iako izgleda da postoji velika sličnost između klauzula ORDER BY i
GROUP BY ova sličnost je samo prividna.

Uređenje se ne mora vršiti po svim atributima navedenim u SELECT


klauzuli, a grupisanje mora;

Uređenje može biti i rastuće i opadajuće, a grupisanje samo rastuće;

Agregatne funkcije, o kojima će kasnije biti reči, mogu biti primenjene


na grupe podataka i u tome je upravo i prava uloga klauzule GROUP
BY .

23-Mar-21 mr Miloš Pejanović, dipl.inž. 42


Prikazati imena i plate radnika po odeljenjima.
SELECT odeljenjeID, ime FROM radnici
GROUP BY odeljenjeID, ime;

23-Mar-21 mr Miloš Pejanović, dipl.inž. 43


Operacije i funkcije omogućavaju da se na osnovu podataka prisutnih u bazi dođe do
novih relevantnih informacija.

 Aritmetičke – +, -, *, /, % (ostatak celobrojnog deljenja),


 Znakovne – + (konkatenacija, spajanje stringova),
 Relacijske – =, <, >,<>, <=, >=,
 Logičke – NOT, AND, OR,

MySQL podržava veliki broj ugrađenih funkcija, kao i mogućnost uvođenja korisničkih
funkcija. Funkcije mogu biti: determinističke i nedeterminističke. Determinističke
funkcije vraćaju isti rezultat pri svakom pozivu nad istim skupom ulaznih vrednosti, a
nedeterminističke ne.

23-Mar-21 mr Miloš Pejanović, dipl.inž. 44


Ugrađene funkcije u SQL-u su grupisane u desetak kategorija, a za nas
su interesantne sledeće:

 Matematičke (numeričke) funkcije,


 Funkcije za rad sa znakovnim podacima,
 Funkcije za rad sa datumima,
 Agregatne funkcije.

23-Mar-21 mr Miloš Pejanović, dipl.inž. 45


Ime funkcije Opis funkcije
NOW Vraća trenutni vremenski žig servera.
CURDATE Vraća trenutni datum servera.
CURTIME Vraća trenutno vreme servera.
DATE_ADD Dodaje određeni vremenski interval na vrednost datuma.
DATE_SUB Oduzima određeni vremenski interval od vrednosti datuma.
DATEDIFF Računa razliku između dva datuma u danima.
DATE_FORMAT Prikazuje datum u definisanom formatu.
FORMAT Vraća string dobijen na osnovu definisanog formata.
TRIM Uklanja sve beline ispred i iza vidljivih karaktera u stringu.
LOWER Pretvara sva velika slova u mala u datom stringu.
UPPER Pretvara sva mala slova u velika u datom stringu.
SUBSTRING Vraća deo stringa sa određene pozicije i broja karaktera.
REVERSE Vraća okrenut string.
CONCAT Vraća string dobijen spajanjem više tekstualnih vrednosti.

23-Mar-21 mr Miloš Pejanović, dipl.inž. 46


Ime funkcije Opis funkcije
CONCAT_WS Vraća string spajanjem tekstualnih vrednosti separatorom.
SIN Vraća rezultat trigonometrijske funkcije sin.
COS Vraća rezultat trigonometrijske funkcije cos.
ASIN Vraća rezultat trigonometrijske funkcije asin.
ACOS Vraća rezultat trigonometrijske funkcije acos.
ATAN Vraća rezultat trigonometrijske funkcije atan.
TAN Vraća rezultat trigonometrijske funkcije tan.
ATAN2 Vraća rezultat trigonometrijske funkcije atan za 2 argumenta.
COT Vraća rezultat trigonometrijske funkcije ctan.
ABS Vraća apsolutnu vrednost datog broja.
CEIL Vraća broj zaokružen na višu celobrojnu graničnu vrednost.
FLOOR Vraća broj zaokružen na nižu celobrojnu graničnu vrednost.
MOD Vraća ostatak pri deljenju dva broja.
ROUND Zaokružuje realnu vrednost na određeni broj decimala.
TRUNCATE Odseca decimale iza određene pozicije, bez zaokurživanja.

23-Mar-21 mr Miloš Pejanović, dipl.inž. 47


Ime funkcije Opis funkcije
CONV Konvertuje zapis broja iz jedne osnovice (baze) u drugu.
DEGREES Konvertuje ugao iz radijana u stepene.
RADIANS Konvertuje ugao iz stepeni u radijane.
LN Vraća vrednost prirodnog logaritma.
LOG Vraća vrednost prirodnog logaritma.
LOG10 Vraća vrednost logaritma osnovice 10.
LOG2 Vraća vrednost logaritma osnovice 2.
SIGN Vraća znak date vrednosti.
DIV Koristi se za celobrojno deljenje.
EXP Koristi se za stepenovanje.
POW Vraća vrednost broja stepenovanog na određeni broj.
SQRT Vraća kvadratni koren date vrednosti.
RAND Vraća pseudo-nasumičnu realnu vrednost.
LENGTH Vraća dužinu stringa u bajtovima.
ASCII Vraća ASCII numeričku vrednost prvog karaktera.
CHAR Vraća karakter koji predstavlja data vrednost.
23-Mar-21 mr Miloš Pejanović, dipl.inž. 48
Ime funkcije Opis funkcije
SPACE Vraća string sa definisanim brojem razmaka.
REPEAT Umnožava dati string dati broj puta.
REPLACE Menja pominjanje dela teksta u datom tekstualnom podatku.
STRCMP Vrši poređenje dva tekstualna podatka.
BIN Vraća string koji sadrži binarni prikaz određenog broja.
HEX Vraća heksadecimalni prikaz datog broja.
OCT Vraća oktalni zapis datog broja.
UNHEX Vraća vrednost konvertovanu iz heksadecimalnog zapisa.
LPAD Vraća tekst određene širine dopunom simbolima levo.
RPAD Vraća tekst određene širine dopunom simbolima desno.
LTRIM Uklanja beline ispred teksta.
RTRIM Uklanja beline iza teksta.
LEFT Vraća dati broj karaktera sa početka datog stringa.
RIGHT Uklanja beline iza teksta.
CHAR_LENGTH Vraća broj karaktera u datom stringu.
23-Mar-21 mr Miloš Pejanović, dipl.inž. 49
Ime funkcije Opis funkcije
FROM_BASE64 Koristi se za dekodiranje teksta iz BASE64 kodiranog zapisa.
TO_BASE64 Koristi se za kodiranje teksta u BASE64 kodirani zapis.
MATCH Obavlja tekstualnu pretragu u datom tekstualnom podatku.
LIKE Obavlja uparivanje teksta po prostom šablonu.
RLIKE Obavlja uparivanje teksta po regularnom izrazu.
ENCODE Kodira string
DECODE Dekodira string kodiran naredbom ENCODE
PASSWORD Računa PASSWORD heš string datog teksta
SHA1 Računa SHA1 kontrolni string
SHA2 Računa SHA2 kontrolni string
INET_ATON Konvertuje tekstualni zapis IP adrese u brojčanu vrednost
INET_NTOA Konvertuje brojčanu vrednost zapisa IP adrese u tekst
IS_IPV4 Utvrđuje da li je dati argument ispravna IPv4 adresa
INET6_ATON Konvertuje tekstualni zapis IPv6 adrese u brojčanu vrednost
INET6_NTOA Konvertuje brojčanu vrednost zapisa IPv6 adrese u tekst
IS_IPV6 Utvrđuje da li je dati argument ispravna IPv6 adresa
UUID Vraća jedinstveni univerzalni identifikator (UUID)
UUID_SHORT Vraća smračeni jedinstveni univerzalni identifikator (UUID)
UUID_TO_BIN Konvertuje tekstualni zapis UUID u binarni
23-Mar-21 mr Miloš Pejanović, dipl.inž. 50
Neka je tabela RADNIK krerirana sledećom naredbom:

CREATE TABLE RADNICI (


id_radnik INT PRIMARY KEY,
CONSTRAINT id_radnik_provera CHECK (id_radnik>=1 AND id_radnik<=99999),
ime VARCHAR(15) NOT NULL,
prezime VARCHAR(20) NOT NULL,
kvalif CHAR(3),
datum_zap DATE,
posao VARCHAR(10),
plata REAL,
odeljenjeID int,
CONSTRAINT odeljenjeID_sk FOREIGN KEY(odeljenjeID)
REFERENCES ODELJENJA(odeljenjeID)
ON DELETE NO ACTION
ON UPDATE
23-Mar-21
CASCADE); mr Miloš Pejanović, dipl.inž. 51
Popunjena na sledeći način:

23-Mar-21 mr Miloš Pejanović, dipl.inž. 52


Prikazati prezimena, imena i zarade svih
radnika čija je zarada po satu veća od 100
novčanih jedinica. Radnici su sortirani
prema opadajućem redosledu svojih
zarada po satu. Podrazumeva se da mesec
ima 168 radnih sati.

SELECT prezime, ime,


ROUND(plata/168,2) AS 'zarada po satu'
FROM RADNIK
WHERE plata/168> 100 AND plata IS
NOT NULL
ORDER BY ROUND(plata/168,2) DESC

23-Mar-21 mr Miloš Pejanović, dipl.inž. 53


Prikazati nazive odeljenja velikim slovima u abecednom poretku kao i broj karaktera u
nazivu odeljenja.
SELECT UPPER(ime_od) AS 'naziv odeljenja', LENGTH(ime_od) AS 'dužina'
FROM ODELJENJE
ORDER BY ime_od

23-Mar-21 mr Miloš Pejanović, dipl.inž. 54


Prikazati prezimena, imena, datume zaposlenja i broj godina rada (Broj godina rada
računati kao razliku između tekuće godine i godine zaposlenja).

SELECT prezime, ime, YEAR(CURDATE())-YEAR(datum_zap) AS 'Staž radnika’


FROM radnici;

23-Mar-21 mr Miloš Pejanović, dipl.inž. 55


Agregatne funkcije služe za dobijanje grupnih, sumarnih informacija. Grupu može
predstavljati čitava tabela, instance tabele koje zadovoljavaju postavljeni uslov (klauzula
WHERE), grupe formirane po jednom ili više atributa (klauzula GROUP BY), instance
grupe koje zadovoljavaju postavljeni uslov (klauzula HAVING). Sve agregatne funkcije
su determinističke!

Agregatne funkcije
Funkcija Opis
AVG([ALL | DISTINCT] numeričke nalazi prosek svih ili svih različitih vrednosti; NULL
vrednosti) vrednosti se zanemaruju
SUM ([ALL | DISTINCT numeričke sabira vrednosti, NULL vrednost se zanemaruje
vrednosti)

23-Mar-21 mr Miloš Pejanović, dipl.inž. 56


Agregatne funkcije
Funkcija Opis
COUNT(([ALL | DISTINCT] vrednosti) | *) broj svih ili broj svih različitih vrednosti; ako je
argument *, broje se i NULL vrednosti; rezultat je tipa
INT
MAX ([ALL | DISTINCT] vrednosti) nalazi maksimum svih ili svih različitih vrednosti; NULL
vrednosti se zanemaruju
MIN([ALL | DISTINCT] vrednosti)) nalazi minimum svih ili svih različitih vrednosti; NULL
vrednosti se zanemaruju

23-Mar-21 mr Miloš Pejanović, dipl.inž. 57


Prikazati minimalnu, maksimalnu,
prosečnu platu kao i broj zaposlenih
radnika.

SELECT MIN(plata) AS 'minimalna


plata’, MAX(plata) AS 'maksimalna
plata’, ROUND(AVG(plata),2) AS
'prosečna plata’, COUNT(*) AS 'broj
radnika'
FROM radnici

23-Mar-21 mr Miloš Pejanović, dipl.inž. 58


Prikazati minimalnu, maksimalnu platu i broj radnika sa srednjom stručnom
spremom.
SELECT MIN(plata) AS 'minimalna plata SSS', MAX(plata) AS 'maksimalna plata
SSS’, COUNT(plata) AS 'broj radnika SSS'
FROM radnici WHERE kvalif='SSS’

23-Mar-21 mr Miloš Pejanović, dipl.inž. 59


Prikazati broj radnika koji nisu raspoređeni ni u jedno odeljenje.

SELECT COUNT(*) AS 'broj neraspoređenih radnika’


FROM radnici WHERE odeljenjeID IS NULL;

23-Mar-21 mr Miloš Pejanović, dipl.inž. 60


Prikazati prosečnu platu po odeljenjima.
SELECT odeljenjeID AS ‘šifra odeljenja', AVG(plata) AS 'prosečna plata'
FROM radnici
WHERE odeljenjeID IS NOT NULL
GROUP BY odeljenjeID

23-Mar-21 mr Miloš Pejanović, dipl.inž. 61


Prikazati poslove radnika, prosečnu
platu za svaki posao i broj izvršilaca.
U obzir se uzimaju radnici za koje je
poznat posao koji obavljaju i za koje je
poznata vrednost plate.

SELECT posao,
ROUND(AVG(plata),2) AS 'prosečna
plata’, COUNT (*) AS 'broj izvršilaca'
FROM radnici
WHERE (plata IS NOT NULL) AND
(posao IS NOT NULL)
GROUP BY posao
23-Mar-21 mr Miloš Pejanović, dipl.inž. 62
Prikazati po odeljenjima kvalifikacije, ukupnu platu radnika sa tom kvalifikacijom i broj
radnika. Rezultati su uređeni po kvalifikaciji u rastućem redosledu.

SELECT odeljenjeID AS ‘šifra odeljenja‘, kvalif AS ‘kvalifikacija’,


SUM(plata) AS ‘ukupna plata‘, COUNT(*) AS 'broj radnika'
FROM radnici
GROUP BY odeljenjeID, kvalif
ORDER BY kvalif

23-Mar-21 mr Miloš Pejanović, dipl.inž. 63


Rezultat grupisanja po kvalifikaciji i šifri odeljenja; ukupna plata i broj izvršilaca za svaku podgrupu

23-Mar-21 mr Miloš Pejanović, dipl.inž. 64


Klauzulom HAVING (“koji imaju“) nameću se uslovi na grupe. Ova klauzula zahteva da je
prethodno izvršeno grupisanje klauzulom GROUP BY.

Dok se klauzula WHERE primenjuje na sve n-torke pre nego što oni postanu delovi
grupe, klauzula HAVING se primenjuje na već agregiranu vrednost za tu grupu.

Ukoliko se u upitu koriste sve tri klauzule onda se mora poštovati redosled:

1. WHERE,
2. GROUP BY,
3. HAVING.

GROUP BY može bez HAVING klauzule. HAVING klauzula NE MOŽE bez GROUP BY.

23-Mar-21 mr Miloš Pejanović, dipl.inž. 65


Prikazati minimalnu platu za odeljenja u kojima je minimalna plata veća od
15000.

SELECT odeljenjeID AS 'šifra odeljenja', MIN(plata) AS 'minimalna plata'


FROM radnici
GROUP BY odeljenjeID
HAVING MIN(plata)>15000

23-Mar-21 mr Miloš Pejanović, dipl.inž. 66


Odeljenja u kojima je minimalna plata veća od 15000

23-Mar-21 mr Miloš Pejanović, dipl.inž. 67


Prikazati odeljenja u kojima radi bar 1 ili 2 radnika SSS kvalifikacije.

SELECT odeljenjeID, kvalif, COUNT(*) AS 'broj radnika’


FROM radnici WHERE kvalif='SSS’
GROUP BY odeljenjeID, kvalif
HAVING COUNT(*)>=1 OR COUNT(*)<=2;

23-Mar-21 mr Miloš Pejanović, dipl.inž. 68


23-Mar-21 mr Miloš Pejanović, dipl.inž. 69
13-Jun-21

RELACIONE BAZE PODATAKA

SQL2: SPAJANJE TABELA


• INNER JOIN
• LEFT JOIN, RIGHT JOIN
• SELF JOIN
• FULL JOIN
1
SPAJANJE TABELE (JOIN)

 Join je ključna reč u SQL-u, koja označava spoj između dve tabele.
 Kada se u rezultatu spoljnjeg upita kombinuju podaci iz više tabela mora
se izvršiti spajanje (JOIN) dveju ili više tabela.
 Spajanje tabela vrši se korišćenjem zajedničkih atributa, tj. atributa koji su
definisani nad istim domenima.
13-Jun-21 2
UNUTRAŠNJE SPAJANJE
 Spaja zapise na osnovu jednog ili više zajedničkih polja.

 Vraća zapise u kojima su jednake vrednosti polja preko


kojeg (kojih) se vrši spajanje.

 U većini slučajeva spajanje se vrši preko polja primarnog


ključa u jednoj tabeli i polja spoljnjeg ključa u drugoj
tabeli (u relaciji jedan prema više).

 Ako za neku vrednost primarnog ključa jedne tabele u


drugoj tabeli ne postoji ni jedan odgovarajući zapis, taj
13-Jun-21 3

zapis se ne pojavljuje u rezultatu upita.


UNUTRAŠNJE SPAJANJE
 Prirodno spajanje (uslov spajanja tabela u WHERE klauzuli)
SELECT kolone
FROM tabela_1, tabela_2
WHERE uslov_spajanja;
INNER JOIN
SELECT kolone
FROM tabela_1 JOIN tabela_2
13-Jun-21 4

ON uslov_spajanja;
UNUTRAŠNJE SPAJANJE
 Da bi se dobila tražena informacija potrebno je spojiti tabele D_CLIENTS i
D_EVENTS. Uslov spajanja je jednakost stranog ključa client_number u tabeli
D_EVENTS sa primarnim ključem client_number u tabeli D_CLIENTS.

13-Jun-21 5
UNUTRAŠNJE SPAJANJE
Rešenje:
SELECT first_name, last_name, name, event_date
FROM d_clients, d_events
WHERE d_clients.client_number=d_events.client_number;
ILI
SELECT first_name, last_name, name, event_date
FROM d_clients JOIN d_events
ON d_clients.client_number=d_events.client_number;
13-Jun-21 6
UNUTRAŠNJE SPAJANJE
Prikazati spisak imena i prezimena zaposlenih koji rade na Banovom brdu.

SELECT ime, prezime


FROM radnik JOIN odeljenje
ON odeljenje.id_odeljenja=radnik.id_odeljenja
WHERE mesto='Banovo brdo’

SELECT ime, prezime


FROM radnik, odeljenje
WHERE odeljenje.id_odeljenja=radnik.id_odeljenja AND mesto='Banovo brdo’ 13-Jun-21 7
UNUTRAŠNJE SPAJANJE
Kako se realizuje INNER JOIN sa tri tabele?

8
13-Jun-21
UNUTRAŠNJE SPAJANJE
Kako se realizuje INNER JOIN sa tri tabele?

Tabele doctors – podaci o lekarima (docid – primarni ključ)


Tabela specialize – podaci o oblastima specijalizacije lekara (spid – primarni ključ)
Tabela timeschedule - podaci o rasporedu lekara u ordinaciji. (tid – primarni ključ)
Definisan je spoljni ključ docid u specialize i timeschedule tabeli koji referencira na primarni
ključ docid u doctors tabeli.

Treba da prikažemo zapise o lekarima koji su specijalizovani za oblast special1 i po rasporedu


su sredom u predviđeno vreme u svojoj ordinaciji. 13-Jun-21
9
UNUTRAŠNJE SPAJANJE
Kako se realizuje INNER JOIN sa tri tabele?

SELECT a.docid,a.dname, b.desc,c.tday,c.sit_time


FROM doctors a JOIN specialize b ON a.docid=b.docid JOIN
timeschedule c ON a.docid=c.docid
WHERE b.desc= 'special1' AND c.tday='WED';

10
13-Jun-21
SELF JOIN – SPAJANJE TABELE SA SAMOM
SOBOM

 Pri prevođenju konceptualnog modela u relacioni model rekurzivna veza se


transformiše u kolonu strani ključ koji ukazuje na primarni ključ iste tabele.
 Iz takve tabele se mogu dobiti podaci o instancama entiteta povezanih rekurzivnom
vezom. Za to je potrebno spojiti tabelu samu sa sobom.
 Spajanje tabele sa samom sobom se naziva Self Join.

11
13-Jun-21
SELF JOIN
SPAJANJE TABELE SA SAMOM SOBOM
 Tabela se može spajati i sa samom sobom (SELF JOIN), kada unutar tabele postoji relacija
između pojedinih n-torki.

 To je slučaj sa tabelom RADNIK jer su neki zaposleni rukovodioci nekim drugim


radnicima.

 Ova vrsta spajanja odnosi se na podatke u jednoj tabeli kada unutar objekata jedne tabele
postoji relacija 1:1 ili 1:N.

 Spoj tabele sa samom sobom pravi tako što se upitu dodaje duplikat tabele i spajaju se
polja iz originala i kopije tabele..
12
13-Jun-21
SELF JOIN
SPAJANJE TABELE SA SAMOM SOBOM
 Ako se koristi Self Join, onda će se isti naziv tabele pojaviti dva puta u istoj klauzuli FROM.
Zato je kod Self Join-a neophodno koristiti dva različita alijasa za istu tabelu.
 Na primer, ako je potrebno prikazati spisak svih zaposlenih iz tabele EMPLOYEES sa
imenima njihovih rukovodilaca, onda ta tabela ima dvostuku ulogu:

 S jedne strane, ona sadrži podatke o svakom zaposlenom. Za tu ulogu koristiće se alijas,
npr. emp;

 S druge strane, ona sadrži podatke o rukovodiocima referenciranim vrednostima stranog


ključa iz iste tabele. Za tu ulogu koristiće se drugi alijas iste tabele, npr. mng.
13
13-Jun-21
SELF JOIN
SPAJANJE TABELE SA SAMOM SOBOM
Primer:
SELECT concat(emp.first_name,' ',emp.last_name) as "Zaposleni",
concat(mng.first_name,' ', mng.last_name) as "Rukovodilac"
FROM employees emp JOIN employees mng
ON emp.manager_id=mng.employee_id;

14
13-Jun-21
LEFT JOIN
leva_tabela LEFT JOIN desna_tabela
• LEFT JOIN vraća sve zapise iz tabele koju u spoju
proglasimo kao “LEVU”, odnosno koja je prva navedena u
izrazu za spajanje.

• „LEVA“ tabela predstavlja tabelu postavljenu levo od ključne


reči LEFT JOIN

• Vraća sve redove leve tabele spojene sa odgovarajućim


redovima desne tabele za koje je uslov spajanja zadovoljen i
redove iz leve tabele koji nemaju par u desnoj (redovi koji
13-Jun-21
15

nemaju svoj par spajaju se sa null vrednostima).


LEFT JOIN
Prikazati nazive odeljenja, ime i posao svakog radnika koji u njima rade, uključujući i
odeljenja u kojima nema raspoređenih radnika.

SELECT ime_od, ime, posao from


odeljenje left join radnik
on odeljenje.id_odeljenja=radnik.id_odeljenja

16
13-Jun-21
LEFT JOIN
Prikazati nazive odeljenja, ime i posao svakog radnika
koji u njima rade, uključujući i odeljenja u kojima
nema raspoređenih radnika.

Dobijeni rezultati pokazuju da u odeljenjima Nabavka i


Računski centar nema raspoređenih radnika.
To ne bi bilo tako vidljivo da je korišćeno unutrašnje
spajanje tabela.

17
13-Jun-21
RIGHT JOIN
leva_tabela RIGHT JOIN desna_tabela
• RIGHT JOIN vraća sve zapise iz tabele koju u spoju
proglasimo ka“DESNU”, bez obzira na to da li se
odgovarajući zapisi nalaze u “levoj” tabeli.

• Vraća sve redove desne tabele spojene sa odgovarajućim


redovima leve tabele za koje je uslov spajanja zadovoljen i
redove iz desne tabele koji nemaju par u levoj (redovi koji
nemaju svoj par spajaju se sa null vrednostima).
18
13-Jun-21
RIGHT JOIN
Prikazati nazive odeljenja, ime i posao svakog radnika koji u njima rade,
uključujući i radnike koji nisu raspoređeni ni u jednom odeljenju.

SELECT ime_od, ime, posao


from odeljenje right join radnik
on odeljenje.id_odeljenja=radnik.id_odeljenja
19
13-Jun-21
RIGHT JOIN

Dobijeni rezultati pokazuju da radnik Luka


nije raspoređen ni u jedno odeljenje.
To ne bi bilo tako vidljivo da je korišćeno
unutrašnje spajanje tabela.

20
13-Jun-21
FULL JOIN
leva_tabela FULL JOIN desna_tabela
• Vraća sve redove leve tabele spojene sa odgovarajućim
redovima desne tabele za koje je uslov spajanja zadovoljen,
redove iz leve tabele koji nemaju par u desnoj, kao i redove iz
desne tabele koji nemaju par u levoj (redovi koji nemaju svoj
par spajaju se sa null vrednostima).

21
13-Jun-21
PITANJA ?

22
13-Jun-21
BAZE PODATAKA
SQL2

POGLEDI
FUNKCIJE
Koncept baze podataka daje mogućnost da više različitih aplikacija, pa samim tim i više
korisnika, pristupa bazi podatka. Pojedinačni korisnik ne mora da zna sve detalje baze
podataka u celini: njega mogu zanimati samo neke tabele i samo neki atributi tih tabela.

Tvorac relacionih baza podataka Codd definisao je više tipova relacija, a među njima i
tzv. pogled (view).

Osnovna razlika između bazne tabele i pogleda je u tome što bazna tabela postoji na
memorijskom medijumu računara (disku) dok je pogled, fiktivna virtuelna tabela koja ne
postoji u memoriji, ali se može formirati uvek kada nam zatreba, tj. kada je
referenciramo. Sa korisničke tačke, nema razlike u pretraživanju ovakve virtuelne
tabele i bazne tabele.
13-Jun-21 mr Miloš Pejanović, dipl.inž. 2
Pogled je virtuelna imenovana tabela koja se kreira naredbom CREATE (SELECT), ali se u bazi
podataka memoriše na specifičan način. Definicija pogleda (naziv pogleda, nazive kolona i upit)
čuva se u bazi podataka u prevedenom obliku, što obezbeđuje veliku brzinu rada sa pogledima.

Kada korisniku zatreba „pogled“ na bazu podataka, on ga poziva i kreira virtuelnu tabelu. Pri
izvršavanju upita nad pogledom, DBMS kombinuje taj upit sa upitom koji definiše pogled i pravi
se novi upit koji se izvršava nad baznim tabelama koje čuvaju podatke (fizičke tabele na disku).

Pogled se najčešće kreira nad više tabela. Rad sa pogledima pruža podršku očuvanju integriteta
podataka u bazi. Neki DBMS (npr. MS Access) nemaju mogućnost rada sa pogledima.

13-Jun-21 mr Miloš Pejanović, dipl.inž. 3


Pogledi obezbeđuju:

Uprošćavanje upita
Mehanizam za kontrolu pristupa podacima
o korisnik vidi samo neke podatke
Bolje performanse
o pogled se čuva u prevedenom obliku što povećava brzinu rada
Nezavisnost podataka
o menjaju se definicije pogleda, a ne aplikativni programi koji koriste podatke iz
baze podataka preko pogleda.

MySQL omogućava više SELECT naredbi u pogledu koje su povezane klauzulama


UNION ili UNION ALL.
13-Jun-21 mr Miloš Pejanović, dipl.inž. 4
Sigurnost

Veoma često može postojati situacija u kojoj želimo da određenim


korisnicima baze podataka onemogućimo pun pristup određenoj
tabeli ili tabelama.

13-Jun-21 mr Miloš Pejanović, dipl.inž. 5


Sigurnost

Tipičan primer ove situacije su tabele za smeštanje podataka o


zaposlenima. Mi ćemo svakako želeti da omogućimo svim
zaposlenima pristup njihovim ličnim podacima, kao što su ime,
prezime, broj telefona ili adresa. Ipak, zaposlenima nije dobro
omogućiti pristup podacima o visini zarada i sličnim osetljivim
podacima.

13-Jun-21 mr Miloš Pejanović, dipl.inž. 6


Komfor

Već smo videli da je neophodno često vršiti spajanje


podataka više tabela. Kako bi se olakšao rad korisnicima
baze podataka ili programerima koji će pisati aplikacije koje
će komunicirati sa bazom, možemo olakšati stvari i kreirati
pogled.

13-Jun-21 mr Miloš Pejanović, dipl.inž. 7


Imena kolona u pogledu ne moraju biti ista kao imena kolona u tabelama iz
kojih se pogled izvodi.

Pogled se može izbaciti iz baze podataka naredbom DROP VIEW


ime_pogleda.

 Ova komanda uklanja pogled i iz relacione šeme i iz rečnika podataka baze


podataka.

Brisanje pogleda nema nikakvog uticaja na tabele i podatke u njima.

13-Jun-21 mr Miloš Pejanović, dipl.inž. 8


Poglede treba povremeno izbacivati iz šeme i odmah ih kreirati. Razlog je vrlo
prost. Pri kreiranju pogleda vrši se optimizacija njegovog izvršavanja.

Naravno, optimalno izvršavanje zavisi od trenutnih vrednosti u tabelama.

Nakon nekog vremena, tabele koje se često ažuriraju u toj meri promene stanje da
pogled više nema dovoljnu brzinu.

Zbog toga se pogled mora izbaciti iz šeme baze podataka (DROP) i odmah iznova
napraviti (CREATE). Prilikom ponovnog kreiranja novodobijeni binarni kod će biti
optimalan za novo stanje podataka u bazi.

13-Jun-21 mr Miloš Pejanović, dipl.inž. 9


Prilikom izmene vrednosti u tabelama koje su korišćene u upitu od kojeg je
napravljen pogled, podaci dobijeni upitom nad tim pogledom će uvek biti
ažurni.

 Pogledi ne sadrže podatke koji su bili dostupni u tabelama u onom trenutku


kada je pogled napravljen, već sadrže definiciju upita koji se pokreće svaki
put kada se zahteva dopremanje podataka pogledom.

Poglede treba koristiti oprezno, jer mogu izazvati loše performanse upita.

13-Jun-21 mr Miloš Pejanović, dipl.inž. 10


Naredba za kreiranje pogleda CREATE VIEW ima oblik:

CREATE VIEW <ime_pogleda> [ (<lista_atributa>)] AS


<SELECT_naredba>

Naredba CREATE VIEW kreira virtuelnu tabelu sa specificiranom listom atributa.

Ako lista atributa nije specificirana, nazivi i tipovi atributa preuzimaju se iz baznih
tabela navedenih u SELECT naredbi.

13-Jun-21 mr Miloš Pejanović, dipl.inž. 11


Naredba za brisanje pogleda DROP VIEW iz baze podataka ima oblik:
DROP VIEW <ime_pogleda>

Naredba za modifikovanje pogleda ALTER VIEW ima oblik:


ALTER VIEW <ime_pogleda> [ (<lista_atributa>)] AS
<SELECT_naredba>

Naredba ALTER VIEW kreira novu virtuelnu tabelu sa specificiranom listom atributa. Podrazumeva
se da je specificirani pogled već kreiran naredbom CREATE VIEW .

Sve uspostavljenje dozvole ostaju na snazi. Sukcesivno izvršavanje naredbi DROP VIEW i CREATE
VIEW ima isto dejstvo kao naredba ALTER VIEW, ali zahteva ponovno uspostavljanje prava pristupa.

13-Jun-21 mr Miloš Pejanović, dipl.inž. 12


Pogledi su usko vezani sa bezbednošću i pravima korisnika.

Prilikom kreiranja pogleda, kreator pogleda mora imati prava nad tabelama nad
kojima se pogled kreira.

Sa druge strane, korisnik ne mora imati SELECT prava nad tabelama, sve dok ima
prava nad pogledom.

13-Jun-21 mr Miloš Pejanović, dipl.inž. 13


Kreirati pogled ODELJENJE30 koji sadrži sve podatke o radnicima zaposlenim u
odeljenju 30.

CREATE VIEW ODELJENJE30 AS


SELECT *FROM RADNIK
WHERE id_odeljenja=30;

SELECT *FROM ODELJENJE30;

13-Jun-21 mr Miloš Pejanović, dipl.inž. 14


Kreirati pogled ODELJENJE20 koje sadrži podatke o odeljenju kao i ime, prezime,
posao, kvalifikaciju i platu zaposlenih u odeljenju 20.

RADNIK <#id_radnika, ime, prezime, posao, kvalif, rukovodilac$, dat_zap, premija, plata,Id_odeljenja$>

ODELJENJE <#id_odeljenja, ime_od, mesto, sef_odeljenja$>

13-Jun-21 mr Miloš Pejanović, dipl.inž. 15


CREATE VIEW ODELJENJE20 AS
SELECT O.ime_od, R.ime, R.prezime, R.posao, R.kvalif, R.plata
FROM RADNIK R, ODELJENJE O
WHERE O.id_odeljenja=R.id_odeljenja AND O.id_odeljenja=20

SELECT *FROM ODELJENJE20;

U ovome primeru nisu uvedeni novi atributi, iako ih pogled može imati.
Imena atributa u pogledu i osnovnim tabelama iz kojih je izveden su ostala ista.

13-Jun-21 mr Miloš Pejanović, dipl.inž. 16


Svaki put kada neko iz odeljenja 20 hoće da obrađuje podatke o zaposlenima u
svom odeljenju on jednostavno koristi ovaj pogled.

Primer: Prikaži ime, posao i kvalifikaciju za zaposlene sa visokom stručnom


spremom u odeljenju 20:

SELECT O20.ime, O20.posao, O20.kvalif


FROM ODELJENJE20 O20
WHERE O20.kvalif='VSS'

13-Jun-21 mr Miloš Pejanović, dipl.inž. 17


Kreirati pogled IZVOZ koji sadrži podatke o identifikacionom broju radnika, imenu,
prezimenu, broju sati angažovanja i funkciji koju imaju na projektu, samo za radnike
koji su angažovani na projektu izvoz.

RADNIK <#id_radnika, ime, prezime, posao, kvalif, rukovodilac$, dat_zap, premija, plata,Id_odeljenja$>
UCESCE<#id_radnika, #id_projekta, br_sati, funkcija>
PROJEKAT #id_projekta, ime_proj, sredstva, rok>

13-Jun-21 mr Miloš Pejanović, dipl.inž. 18


CREATE VIEW IZVOZ AS
SELECT R.Id_radnika, R.ime, R.prezime, U.br_sati, U.funkcija
FROM RADNIK R, UCESCE U
WHERE R.Id_radnika = U.Id_radnika AND
U.Id_projekta= (SELECT P.Id_projekta
FROM PROJEKAT P
WHERE P.ime_proj='izvoz');

SELECT * FROM IZVOZ ;

13-Jun-21 mr Miloš Pejanović, dipl.inž. 19


Funkcija je potprogram koji na osnovu liste ulaznih parametara izračunava izlazni
parameter.

U opštem slučaju možemo kreirati funkciju koja na izlazu daje rezultat samo na
osnovu ulaznih parametara.

Možemo da kreiramo i funkciju koja na osnovu ulaznih parametara i pristupom nad


određenim tabelama rezultat dobija kombinacijom ulaznih parametara i sadržaja
tabela.

13-Jun-21 mr Miloš Pejanović, dipl.inž. 20


U MSSql-u postoje dve vrste funkcija:

Ugrađene
Korisnički definisane

Ugrađene funkcije su sve one funkcije koje podrazumeva standardna forma


MSSQL servera, dok su korisnički definisane one koje su izgrađene naknadno,
od strane korisnika.

13-Jun-21 mr Miloš Pejanović, dipl.inž. 21


Prilikom kreiranja funkcija neophodno je definisati njen izlazni tip - naredba
RETURNS.

Vraćanje vrednosti iz funkcije ( prikaz izlaza funkcije) – naredba RETURN

create function fn_moja_funkcija()


returns varchar(20)
return 'Zdravo svete';

13-Jun-21 mr Miloš Pejanović, dipl.inž. 22


Za funkcije duže od jednog reda neophodno je u SQL-u koristiti delimiter (?).

DELIMITER //
CREATE FUNCTION fn_moja_funkcija_1()
RETURNS varchar(20)
BEGIN
DECLARE x int;
SET x=10;
RETURN 'POZDRAV';
END //
DELIMITER ;
13-Jun-21 mr Miloš Pejanović, dipl.inž. 23
Funkcija se poziva pomoću SELECT klauzule što omogućava da bude umetnuta u sam
upit.
Na raspolaganju je veliki broj mogućnosti za intervenciju na podacima u trenutku kreiranja
izlaza.

Poziv funkcije:

select fn_moja_funkcija_1()

13-Jun-21 mr Miloš Pejanović, dipl.inž. 24


Parametrizacija funkcije vrši se navođenjem parametara i njihovih tipova. Ako funkcija
ima ulazne parametre, u pozivu funkcije je neophodno navesti vrednosti koje se
dodeljuju ulaznim parametrima.
DELIMITER //
create function fn_moja_funkcija_2(p1 int, p2 int)
returns int
BEGIN
declare p3 int;
set p3=p1+p2;
select fn_moja_funkcija_2(3,4)
return p3;
end //
DELIMITER ;

13-Jun-21 mr Miloš Pejanović, dipl.inž. 25


Kreirati funkciju fun_Radnik_Staz koja vraća godine staza
radnika čije se ime i prezime zadaju.

13-Jun-21 mr Miloš Pejanović, dipl.inž. 26


DELIMITER $$
CREATE FUNCTION fun_Radnik_Staz (imeU char(30), prezimeU char(30))
RETURNS int
BEGIN
/*deklarisanje izlazne promenljive staz koja predstavlja izlaz funkcije*/
DECLARE staz int;
/*dodela vrednosti promenljivoj staz*/
SET staz= (select year(curdate())-year(dat_zap)
from radnik where ime=imeU and prezime=prezimeU);
RETURN staz;
END$$
DELIMITER ;

13-Jun-21 mr Miloš Pejanović, dipl.inž. 27


DELIMITER $$
create function fun_Radnik_Staz (imeU char(30), prezimeU char(30))
returns int
begin
declare staz int;
/*drugi način dodele vrednosti promenljivoj staz – klauzula
select..into*/
select year(curdate())-year(dat_zap) into staz
from radnik
where ime=imeU and prezime=prezimeU;
return staz;
END$$
DELIMITER
13-Jun-21 ; mr Miloš Pejanović, dipl.inž. 28
Poziv funkcije
select fun_Radnik_Staz('Mirjana','Dimić')

13-Jun-21 mr Miloš Pejanović, dipl.inž. 29


Upotrebom funkcije prikazati radnike koji imaju veća primanja
od maksimalne plate.

13-Jun-21 mr Miloš Pejanović, dipl.inž. 30


delimiter //
create function fn_max_plata()
returns float
BEGIN
declare maxPlata float;
select max(plata) into maxPlata
from radnik;
return maxPlata;
end //
DELIMITER ;

select fn_max_plata();

select ime, prezime


from radnik
where plata+ifnull(premija,0)>fn_max_plata()

13-Jun-21 mr Miloš Pejanović, dipl.inž. 31


Kreirati funkciju fnIzracunajMaxMesecnuPlatu koja na osnovu
ulaznog parametara idbr_in u tabeli RADNIK nalazi odgovarajuće
vrednosti iz kolona plata i premija i sabira vrednost plate uvećanu
za 14% sa vrednošću premije za zaposlenog sa prosleđenom
šifrom radnika.

13-Jun-21 mr Miloš Pejanović, dipl.inž. 32


DELIMITER $$
CREATE FUNCTION fnIzracunajMaxMesecnuPlatu(idbr_in int)
RETURNS decimal(17,2)
BEGIN
DECLARE MesecniIznos decimal(17,2);
SELECT plata * 1.14 + IFNULL(premija, 0.00) into
MesecniIznos
FROM radnik
WHERE id_radnika = idbr_in;
RETURN ifnull(MesecniIznos, 0.00);
END$$
DELIMITER
13-Jun-21
; mr Miloš Pejanović, dipl.inž. 33
Poziv funkcije
select fnIzracunajMaxMesecnuPlatu(5662)

13-Jun-21 mr Miloš Pejanović, dipl.inž. 34


13-Jun-21 mr Miloš Pejanović, dipl.inž. 35
RELACIONE BAZE PODATAKA

PODUPITI

PODUPITI
Podupiti u WHERE klauzuli
Podupiti u FROM klauzuli
Prikazati id, ime, platu i kvalifikaciju zaposlenih koji imaju istu platu kao bilo koji
zaposleni čija je kvalifikacija VSS.
RADNIK <#id_radnika, ime, prezime, posao, kvalif, rukovodilac$, dat_zap, premija,
plata, Id_odeljenja$>

I način: Upotreba ANY operatora

II način: Upotreba IN operatora

mr Miloš Pejanović, dipl.inž. 2


Prikazati id, ime, platu i kvalifikaciju zaposlenih koji imaju manju platu od svih
zaposleni čija je kvalifikacija VSS.

RADNIK <#id_radnika, ime, prezime, posao, kvalif, rukovodilac$, dat_zap, premija,


plata, Id_odeljenja$>

mr Miloš Pejanović, dipl.inž. 3


Prikazati id, ime, platu i kvalifikaciju zaposlenih koji imaju manju platu od svih
zaposleni čija je kvalifikacija VSS.
RADNIK <#id_radnika, ime, prezime, posao, kvalif, rukovodilac$, dat_zap, premija,
plata, Id_odeljenja$>

I način: Upotreba ANY operatora

II način: Upotreba ALL operatora

Da li se dobije isti rezultat?


mr Miloš Pejanović, dipl.inž. 4
mr Miloš Pejanović, dipl.inž. 5
Rezultat sa primenom ANY operatora Rezultat sa primenom ALL operatora

Podsećanje: ALL operator se koristi kada želimo da WHERE izraz spoljnog upita bira redove koji
odgovaraju kriterijumu (<, >, =...) za sve vrednosti koje vrati podupit.
ALL operator upoređuje vrednosti sa svakom vrednosti vraćenom od strane unutrašnjeg podupita.
mr Miloš Pejanović, dipl.inž. 6
Prikazati prezimena, imena, kvalifikacije, datume zaposlenja i šifre odeljenja radnika
koji ne rade u odeljenju 10, ali su se zaposlili istog datuma kad i neki radnik iz
odeljenja 10.

mr Miloš Pejanović, dipl.inž. 7


Prikazati prezimena, imena, kvalifikacije, datume zaposlenja i šifre odeljenja radnika
koji ne rade u odeljenju 10, ali su se zaposlili istog datuma kad i neki radnik iz
odeljenja 10.

Operator ANY može biti zamenjen operatorom SOME!


mr Miloš Pejanović, dipl.inž. 8
Prikazati podatke o radnicima koji rade u Novom Beogradu.

mr Miloš Pejanović, dipl.inž. 9


 Pretpostavimo da jedna od vrednosti vraćena sa višerednim podupitom je null, ali ostale nisu
 Ako IN ili ANY se koriste, spoljni upit će vratiti redove koji odgovaraju non-null vrednostima

Prikazati podatke o radnicima koji su rukovodioci.

mr Miloš Pejanović, dipl.inž. 10


Ako se koristi ALL, spoljni upit ne vraća redove pošto ALL upoređuje red
spoljnog upita sa svakom vrednošču vraćenom od podupita, uključujući null;

Poređenje ničega sa null vraća null.

mr Miloš Pejanović, dipl.inž. 11


 Više od jednog podupita može vratiti informaciju spoljašnjem upitu.

 Prvi podupit vraća job_id


od radnika čiji je id 141 (ST_CLERK).
 Drugi podupit koristi tabelu departments
za pronalaženje department_id na
location_id 1500 (50)
 Spoljni upit vraća redove iz
employees tabele koji odgovaraju za
obe vrednosti.
 U ovom slučaju, pošto je svako odeljenje smešteno samo na jednoj lokaciji, bezbedno je
koristiti jednoredni podupit. Ako odeljenje može biti na više lokacija mora se koristiti
višeredni podupit.

mr Miloš Pejanović, dipl.inž. 12


Prikazati podatke o radnicima koji rade na Banovom brdu i zaposleni su posle
Mirjane.

mr Miloš Pejanović, dipl.inž. 13


Prikazati ime i prezime zaposlenih koji rade u odeljenju u Starom Gradu, učestvuju na projektima
i imaju istu kvalifikaciju kao zaposleni Ivan Buha.

mr Miloš Pejanović, dipl.inž. 14


 Spoljašnji i unutrašnji upit mogu biti povezani po vrednostima više kolona. U tom
slučaju, ako se upoređuju argumenti koji se sastoje od više atributa, oba
argumenta moraju imati jednak broj atributa, a upoređuje se prvi sa prvim, drugi sa
drugim itd. Konačno, napomenimo da atributi koji se upoređuju moraju biti istog ili
kompatibilnog tipa podataka.

 Ako koriste više od jedne kolone, u pitanju su multiple-column podupiti.

 Multiple-column podupiti mogu biti pair-wise upoređivanja ili non-pair-wise


upoređivanja

mr Miloš Pejanović, dipl.inž. 15


Sledeći primer predstavlja upotrebu multiple-column pair-wise podupita za prikaz
podataka o zaposlenima čiji su rukovodilac i šifra odeljenja isti kao i rukovodilac i
šifra odeljenja zaposlenih Tomislava ili Andrije.

Prvo podupit vraća rukovodilac i id_odeljenja


vrednosti za radnike Andriju ili Tomislava.
Ove vrednosti se porede sa rukovodilac kolonom i
id_odeljenja kolonom svakog reda u tabeli radnik.
Ako se vrednosti podudare, red se prikaže.

mr Miloš Pejanović, dipl.inž. 16


Non-pair-wise multiple-column podupiti takođe koriste više od jedne kolone u
podupitu, ali poredi ih jednu po jednu, tako da se upoređivanja izvode u različitim
podupitima.

Treba pisati jedan podupit po koloni koje treba uporediti pri izvođenju non-pair-wise
multiple-column podupita.

mr Miloš Pejanović, dipl.inž. 17


mr Miloš Pejanović, dipl.inž. 18
Prikazati imena odeljenja u kojima su ukupna primanja svih radnika u odeljenju veća
od 3000
RADNIK <#id_radnika, ime, prezime, posao, kvalif, rukovodilac$, dat_zap, premija, plata,Id_odeljenja$>

ODELJENJE <#id_odeljenja, ime_od, mesto, sef_odeljenja$>

mr Miloš Pejanović, dipl.inž. 19


Prikazati imena svih radnika čija su ukupna primanja manja od proseka primanja
zaposlenih u odeljenju čije je sedište na Novom Beogradu.
RADNIK <#id_radnika, ime, prezime, posao, kvalif, rukovodilac$, dat_zap, premija, plata,Id_odeljenja$>

ODELJENJE <#id_odeljenja, ime_od, mesto, sef_odeljenja$>

mr Miloš Pejanović, dipl.inž. 20


Prikazati ime, prezime, datum zaposlenja i primanja zaposlenih koji su angažovani na
više od dva projekta.
RADNIK <#id_radnika, ime, prezime, posao, kvalif, rukovodilac$, dat_zap, premija, plata,Id_odeljenja$>

UCESCE <#id_radnika, #id_projekta, br_sati, funkcija >

mr Miloš Pejanović, dipl.inž. 21


Ko su najbolje plaćeni radnici u celom preduzeću?

o Spoljašnji i unutrašnji upit mogu biti


povezani po vrednostima više atributa.
o U tom slučaju ako se upoređuju
argumenti oba argumenta moraju imati
jednaki broj atributa

Ko su najbolje plaćeni radnici u svakom odeljenju?

mr Miloš Pejanović, dipl.inž. 22


 Kada se koriste u podupitu, IN operator i = ANY imaju potpuno istu ulogu
 Voditi računa o NULL vrednostima u podupitima.
 Ako niste sigurni da li će podupit uključiti null vrednost eliminišite null korišćenjem
IS NOT NULL u WHERE izrazu
 NOT IN je jednako sa <> ALL.
 NOT IN nije jednako sa <> ANY

mr Miloš Pejanović, dipl.inž. 23


 Mehanizam virtuelnih pogleda omogućava i ugnježdavanje jednog SQL upita u
FROM klauzuli drugog SQL upita.
 Ugnježdeni SQL upit se u tom slučaju ponaša kao i bilo koja druga tabela iz
baze podataka.
 Rezultat podupita se ponaša kao virtuelna tabela iz koje se izdvajaju n-torke
(zapisi).
 Nazivi kolona u spoljnom upitu moraju biti podskup skupa naziva kolona u
unutrašnjem upitu.

mr Miloš Pejanović, dipl.inž. 24


Ko su najbolje plaćeni radnici u svakom odeljenju?

mr Miloš Pejanović, dipl.inž. 25


Visoka škola elektrotehnike i računarstva strukovnih studija,
26
2019
Kreiranje i upotreba okidača (Trigger)

Okidač (trigger) je imenovani blok naredbi koji se izvršava onda kada se u


sistemu desi događaj kom je pridružen okidač. Ti događaji se najčešće odnose na
izvršavanje naredbi za ažuriranje INSERT, UPDATE ili DELETE. Okidači su, u stvari,
specijalna vrsta zapamćenih procedura koje se pokreću posle promene vrednosti ili
neposredno pre ili posle prenosa dejstva (naredbom COMMIT WORK) ovih operacija.
Ako izvršenje okidača ne uspe, podaci se ne ažuriraju i aplikacija dobija poruku o
grešci. Sem ovih događaja, okidače mogu pokrenuti i upiti (pre ili posle prikaza
rezultujućih slogova), pri pokretanju ili zatvaranju aplikacije. Dakle, okidači se mogu
definisati na nivou polja, bloka ili aplikacije. ''Trigeri se mogu u bazama podataka
efikasno koristiti za proveru dostignutih ograničenja u paketnoj obradi u više-
korisničkom okruženju. Prednost imaju DBMS koji mogu koristiti čitav set upisanih ili
izbrisanih zapisa u jednom pozivu okidačke funkcije (pomoću SQL naredbe) u odnosu
na DBMS koji dopuštaju samo red po red upis/brisanje (za svaki red posebno) ''.1
Okidači se koriste da bi se obezbedilo poštovanje poslovnih pravila u bazi
podataka. Koriste se u slučajevima kada ne mogu da se primene standardne tehnike
ograničenja ili obezbeđivanja deklarativnog referencijalnog integriteta definisanog nad
tabelama. Koriste se kod aplikacija koje izvršavaju mnogo kaskadnih operacija nad
drugim tabelama i slogovima.
Okidači se najčešće koriste za automatsko održavanje vrednosti u izvedenim
kolonama, proveru pravila sigurnosti, sprečavanje nedozvoljenih operacija, žurnalsko
praćenje događaja u sistemu, ali i za sprovođenje složenih pravila poslovanja.
Svaki SUBP ima svoju sintaksu kako treba kreirati okidač i te sintakse su
međusobno slične.
Obično se koriste trigeri da se održava integritet podataka koji je previše komplikovan
da se implementira preko ograničenja i referencijalnog integriteta. Takođe se koriste za:
• Implementiranje referencijalnih akcija, kao što je kaskadno brisanje
• Održavanje praćenje proteklih događaja/aktivnosti vezanih za promene u bazi
• Izvršavanje administrativnih zadataka kao što je praćenje proteklih događaja/aktivnosti
i regulisanje operacija baze podataka.
• Upoređivanje podataka pre i posle modifikacije
• Implementacija sopstvenih poruka o grešci
Okidači ne podržavaju parametre i ne treba da imaju povratnu vrednost ili skup
rezultata.

Microsoft SQL Server 2014 ima 2 osnovne vrste okidača: DML i DDL okidači.
DDL i DML trigeri se moogu pisati korišćenjem Transact-SQL ili CLR okidača.

Podrazumevano je da je ugnježdena opcija kod trigera onemogućena. Da bi se to


omogućilo. potrebno je da se koristi sistemska uskladištne procedura sp_configure:

1
[29] Error! Reference source not found.].
1
USE [master];
GO
EXEC sp_configure 'show advanced options', 1;
GO
-- Da bi se izmenila konfigurisana vrednost za dodatne opcije.
RECONFIGURE;
GO
-- Da bi se omogućilo korišćenje ugnježdenih trigera
EXEC sp_configure 'nested triggers', 1;
GO
-- To update the currently configured value for this feature.
RECONFIGURE;
GO
Ugnježdeni trigeri zahtevaju pažljivo planiranje zato što mogu da rezultuju višestrukim
promenama u istoj koloni ili nad više tabela. Ugnježdeni okidači mogu da proizvedu
neočekivane rezultate. Umesto ugnježdenih trigera preporučljivo je koristiti jedan triger
koji izvršava sve navedene akcije.

DML trigeri

DML trigeri se okidaju kao odgovor na bilo koju kombinaciju INSERT, UPDATE, ili
DELETE događaja u specifičnoj tabeli. Ne može se kreirati DML triger nad sistemskom
tabelom. Ne mogu se koristiti sledeće naredbe u DML trigerima: CREATE DATABASE,
ALTER DATABASE, DROP DATABASES, RESTORE DATABASE, RESTORE LOG,
RECONFIGURE, DISK INIT, DISK RESIZE, i SHUTDOWN.
Postoje 2 vrste DML trigera, zasnovani na kôdu koji triger izvršava:
• AFTER: Ovaj triger se okida nakon procesiranja podataka u naredbi za manipulaciju
podacima. SQL Server ne dozvoljava kreiranje AFTER trigera nad pogledima.
• INSTEAD OF: Ovaj triger se okida pre izvršenja naredbe za manipulaciju podacima i
kod trigera se izvršava umesto te naredbe.

Inserted i deleted logičke tabele

Inserted i deleted tabele predstavljaju specijalne tabele kojima se može pristupiti iz


samo tela DML trigera. Tabele se nalaze u memoriji i sadrži redove koji su izmenjeni
DML naredbama koje su prouzrokovale da se pokrene triger.

Izmena DML trigera


Koristimo ALTER TRIGGER naredbu da bi modifikovali okidač, koristi ista sintaksa
ALTER TRIGGER [ schema_name . ]trigger_name
ON { table | view }
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
[ NOT FOR REPLICATION ]
AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method
specifier [ ; ] > }
2
<dml_trigger_option> ::=
[ ENCRYPTION ]
[ EXECUTE AS Clause ]
<method_specifier> ::=
assembly_name.class_name.method_name

Brisanje DML trigera


Koristimo DROP TRIGGER naredbu da trajno izbrišemo triger. DROP TRIGGER
nareba ima sledeću sintaksu:
DROP TRIGGER schema.trigger_name

Data Definition Language (DDL) trigeri

DDL trigeri se okidaju kao odgovor na događaje na nivou definicije podataka, kao što je
kreiranje ili brisanje objekata. DDL trigeri mogu biti na nivou baze podataka ili servera.

Funkcija EVENTDATA
Funkcija EVENTDATA pruža detaljne informacije o DDL događaju koji je prouzrokovao
da se okine triger. Ona vraća vrednost tipa XML.

Kreiranje DDL trigera

Da bi kreirali DDL triger izvršavamo CREATE TRIGGER naredbu koristeći sledeću


sintaksu:
CREATE TRIGGER trigger_name
ON {ALL SERVER | DATABASE }
WITH <ddl_trigger_option> [,…n]
{FOR | AFTER} {event_type | event_group} [,…n]
AS {sql_statements | EXTERNAL NAME <method_specifier>
Sintaksa je ista kao kod DML trigera.
ON ALL SERVER se postavlja ako je opseg DDL trigera trenutni server i specificira se
ON DATABASE da se postavi opseg na trenutnu bazu podataka.
Kada kreiramo DDL triger, odredi se ili događaj ili grupa događaja2. Osnovni primer DDL
trigera koji se okida kao odgovor na događaje u lokalnoj bazi podataka:

CREATE TRIGGER trig_preventDDLOOH ON DATABASE


FOR DDL_DATABASE_LEVEL_EVENTS
AS
BEGIN
IF (DATEPART(HOUR, CURRENT_TIMESTAMP) < 8
OR DATEPART(HOUR, CURRENT_TIMESTAMP) > 17)
PRINT N'Ne možete kreirati objekte van radnog vremena';
ROLLBACK;
END
GO
2
DDL Event Groups at http://msdn.microsoft.com/en-us/library/bb510452.aspx
3
Modifikovanje DDL trigera
Da bi modifikovali DDL triger, izvršavamo ALTER TRIGGER naredbu koristećo sledeću
sintaksu:
ALTER TRIGGER trigger_name
ON {ALL SERVER | DATABASE }
WITH <ddl_trigger_option> [,…n]
{FOR | AFTER} {event_type | event_group} [,…n]
AS {sql_statements | EXTERNAL NAME <method_specifier>

Brisanje DDL trigera


Da bi obrisali DDL triger, izvršavamo DROP TRIGGER naredbu koristeći sledeću
sintaksu
DROP TRIGGER schema.trigger_name
ON {ALL SERVER | DATABASE}

Uključivanje i isključivanje trigera

Da bi uključili triger koristimo ENABLE TRIGGER naredbu:

ENABLE TRIGGER [schema.]trigger_name | ALL


ON table_or_view | DATABASE | ALL SERVER

Da isključimo triger, koristimo DISABLE TRIGGER naredbu:


DISABLE TRIGGER [schema.]trigger_name | ALL
ON table_or_view | DATABASE | ALL SERVER

Možemo koristiti i desni klik na triger i izabrati Disable (za isključivanje) ili Enable
(uključivanje).

Pregled trigera
DML trigeri za jednu tabelu se vide u folderu Triggers te tabele. DDL trigeri se mogu
videti po opsegu. Za triger baze treba proširiti Databases folder, zatim Programmability i
onda Database Trigger.
Za DDL server triger, proširiti instancu servera, zatim Server Objects folder, i onda
Triggers.
Može se koristiti i sp_helptext sistemska uskladištena procedura i upit nad sledećim
sistemskim pogledima, da bi se vodeli DDL i DML trigeri:
• sys.triggers: vraća informacije o svim trigerima
• sys.servertriggers: vraća informacije o trigerima na nivou servera
• sys.sql_modules: vraća informacije o kreiranim svim trigerima

Rukovanje Transact-SQL greškama


Kao i u ostalim progrtamskim jezicima, T-SQL pruža sofisticirani mehanizam koji hvata
obrađuje greške tokom izvršenja. Mehanizam za rukovanje greškama uključuje
objektno-orjentisani stil TRY…CATCH konstrukcije.Grupe naredbi se stave u okviru
TRY CATCH bloka.Sintaksa za TRY…CATCH:

4
BEGIN TRY
{ sql_statement |statement_block}
END TRY
BEGIN CATCH
[{ sql_statement |statement_block}]
END CATCH

Samo greške sa kôdom između 11 i 19 dovode do izvršenja CATCH bloka. SQL Server
tretira greške sa manjom ozbiljnošću kao informativne poruke. Greške sa kôdom od 20 i
preko izazivaju trenutno prekidanje konekcije, SQL Server ne izvršava Transact-SQL
kôd u okviru CATCH bloka. Ako ne prekinu konekciju, onda se izvrši samo CATCH blok.
Može se koristiti sledeća skalarna funkcija u okviru CATCH bloka da se preuzme
informacija o grešci koja je prouzrokovala da se izvrši CATCH blok:
• ERROR_NUMBER(): vraća broj greške
@@ERROR funkcija takođe vraća kôd greške ako je prethodna Transact-SQL
statement is executed without any error.
• ERROR_MESSAGE(): Vraća tekstualni opis greške
• ERROR_SEVERITY(): Vraća ozbiljnost greške
• ERROR_STATE(): Vraća broj stanja greške
• ERROR_LINE(): Vraća liniju kôda u kojoj se dogodila greška
• ERROR_PROCEDURE(): Vraća ime storne procedure ili trigrea gde se dogodila
greška
Može se koristiti TRY blok da se pronađe izutetak koji pomera izvršavanje na CATCH
blok. THROW naredba se mora završavati sa ;. Sintaksa THROW naredbe:
THROW [{ error_number | @local_variable },
{ message | @local_variable },
{ state | @local_variable }] [ ; ]
Koristimo RAISERROR naredbu da navedemot SQL Server da pošalje grešku
klijentskoj aplikaciji. Uobičajeno je da se koristi za korisnički definisane greške.
Sintaksa:
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]

5
Sintakse za kreiranje okidača

Sintaksa za kreiranje okidača u SUBP MS SQL Server je sledeća:

CREATE TRIGGER [ ime_šeme .


]ime_okidača

ON naziv_tabele

[ WITH <dml_opcije_okidača> [ ...,n ] ]

AFTER | INSTEAD OF

{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [
DELETE ] }

[ NOT FOR REPLICATION ]

AS {

sql_naredbe [ ...n ]

gde je:

[ ime_šeme . ]ime_okidača Definiše opciono ime_šeme i obavezan


naziv okidača (npr.
dbo.trgUpamtiVremeIzvrsenja)

naziv_tabele Naziv tablice nad kojom pratimo


ažuriranje podataka (npr. RADNIK)

dml_opcije_okidača Omogućavaju navođenje šifriranja


sadržaja okidača ili sigurnosnih pravila
pod kojim će okidač biti izvršen

6
AFTER | INSTEAD OF Ključna reč AFTER (eng. nakon, posle)
označava da se okidač aktivira nakon što
se završilo ažuriranje podataka u tablici
nad kojom je okidač postavljen usled
delovanja jedne ili više SQL naredbi iz
skupa {INSERT, UPDATE i DELETE}
Ključna reč INSTEAD OF (eng. umesto)
označava da se u ovom slučaju samo
okidač izvršava umesto da se izvrši
ažuriranje podataka naredbom koja je
aktivirala okidač. Ova vrsta okidača se
može primenjivati i nad tablicama i nad
pogledima (view). U telu okidača se
obično vrši validacija (provera) mogućih
promena izazvanih naredbama iz skupa
{INSERT, UPDATE i DELETE} pre nego
što se explicitno navede u telu okidača ta
ista naredba koja je aktivirala okidač.

[ INSERT ] [ , ] [ UPDATE ] [ , ] [ Definišu nakon kojih od navedenih SQL


DELETE ] operacija okidač treba da bude izvršen.
Moguće je navesti više događaja koji
aktiviraju okidač odvajajući ih zapetom

NOT FOR REPLICATION Ova opcija se navodi u slučaju replikacije


(kopiranja sadržaja baze podataka sa
jednog servera na drugi) da se prilikom
kopiranja podataka okidač ne izvrši

sql_naredbe [ ...n ] Skup od jedne ili više SQL naredbi koje


treba da se izvrše prilikom aktiviranja
okidača

Ako korisnik želi da izmeni jednu ili više naredbi u telu okidača (sql_naredbe [ ...n
]) ne mora da prvo briše postojeći okidač (naredbom DROP trigger
[ime_šeme.]ime_okidača) i nanovo kreira novi, već to može uraditi naredbom:

ALTER TRIGGER [ ime_šeme .


]ime_okidača

7
ON naziv_tabele

[ WITH <dml_opcije_okidača> [ ...,n ] ]

AFTER | INSTEAD OF

{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [
DELETE ] }

[ NOT FOR REPLICATION ]

AS {

sql_naredbe [ ...n ]

Jednom kreirani okidač može da se privremeno de-aktivira naredbom:


DISABLE TRIGGER [ ime_šeme . ]ime_okidača

ON naziv_tabele

i kasnije aktivira naredbom:

ENABLE TRIGGER [ ime_šeme . ]ime_okidača

ON naziv_tabele

Sintaksa za kreiranja okidača u SUBP MySQL ima sledeći oblik:

CREATE

[DEFINER = { db_korisnik |
CURRENT_USER }]

TRIGGER ime_okidača
vreme_okidanja
događaj_okidanja

8
ON naziv_tabele

FOR EACH ROW telo_okidača


gde je:

db_korisnik Korisničko ime korisnika koji je kreirao


okidač, određuje korisnička prava i
proverava privilegije korisnika u momentu
kada se aktivira okidač, U SUBP MySQL
samo korisnik sa SUPER privilegijama
može da kreira okidač

ime_okidača Naziv pod kojim se čuva okidač u SUBP

vreme_okidanja Može biti jedna od dve ključne reči:


BEFORE i AFTER koje označava kada
se aktivira okidač:

pre (BEFORE) ili nakon (AFTER) što se


ažurira svaki red ponaosob

događaj_okidanja Predstavlja naredbu koja aktivira okidač i


ona pripada skupu {INSERT, UPDATE,
DELETE}

telo_okidača Skup SQL naredbi koje se izvršavaju


kada se okidač aktivira

U SUBP MySQL ažuriranje SQL naredbi koje pripadaju telu okidača nije moguće,
tako da se okidač mora prvo izbrisati naredbom DROP TRIGGER ime_okidača i ponovo
kreirati naredbom CREATE TRIGGER.
Isto tako jedan okidač se ne može aktivirati sa više događaja okidanja u istom
telu okidača, kao što je to slučaj kod MS SQL Servera gde se isti okidač može aktivirati
kada se sadržaj tabele ažurira bilo kojom od naredbi: INSERT, UPDATE ili DELETE.
Tada, za svaku naredbu koja ažurira tabelu moramo kreirati zaseban okidač sa potpuno
istim naredbama u telu okidača. Za ovaj SUBP ne postoje komande za eksplicitno de-
aktiviranje i nanovo aktiviranje okidača, mada uvek postoji „zaobilazni način“ (work-
around) da se to uradi.

9
Primena okidača

U cilju demonstriranja upotrebe okidača (trigera) kreiraćemo tabelu


ISTORIJA_RMESTA u kojoj će se voditi evidencija o promeni posla za svakog
zaposlenog sa periodima trajanja tog posla. Tabela se sastoji od sledećih polja: idbr,
pocetak, kraj i posao. U poljima pocetak i kraj se pamte datumi kada je zaposleni
započeo, odnosno prestao da radi posao koji je naveden u tabeli RADNIK. U slučaju da
zaposleni još uvek radi isti posao, u polju kraj se nalazi prazna (NULL) vrednost.

Primer 1. Kreirati tabelu ISTORIJA_RMESTA sa njenim ograničenjima

MS SQL:

CREATE TABLE istorija_rmesta(

idbr int NOT NULL,

pocetak SMALLDATETIME NOT NULL,

kraj SMALLDATETIME,

posao NVARCHAR(20) NOT NULL,

PRIMARY KEY (idbr, pocetak)

) ;

Tabelu ISTORIJA_RMESTA ćemo inicijalno popuniti trenutnim poslovima


zaposlenih naredbom:

Primer 2. Ubaciti u tabelu ISTORIJA_RMESTA vrednosti iz polja: idbr, datzap i


posao u odgovarajuća polja u tabeli ISTORIJA_RMESTA.

10
MS SQL

INSERT INTO istorija_rmesta (idbr, pocetak, posao)

SELECT idbr, datzap, posao

FROM radnik;

Na ovaj način će se tabela popuniti sa onoliko slogova koliko ima zaposlenih u


tabeli RADNIK, kolona pocetak će biti popunjena datumima zapošljavanja zaposlenih, a
kolona kraj će imati praznu (NULL) vrednost za sve zaposlene. Sadržaj prvih desetak
redova tabele ISTORIJA_RMESTA dat je na slici.

idbr pocetak kraj posao

5367 01.01.1978 NULL vozač

5497 17.02.1990 NULL električar

5519 07.11.1991 NULL prodavac

5652 31.05.1980 NULL električar

5662 12.08.1993 NULL upravnik

5696 30.09.1991 NULL čistač

5780 11.08.1984 NULL upravnik

5786 22.05.1983 NULL upravnik

5842 15.12.1981 NULL direktor

... ... ... ...

Kreiraćemo okidač trgInsRadnik nad tabelom RADNIK koji će imati zadatak da


nakon ubacivanja novog zapisa, odnosno podataka o novom zaposlenom u tabeli
RADNIK istovremeno u tabeli ISTORIJA_RMESTA ubaci novi slog.

11
Primer 3. Kreirati okidač trgInsRadnik koji će se aktivirati nakon ubacivanja
(INSERT) novog sloga u tabelu RADNIK tako što će ubaciti u tabelu
ISTORIJA_RMESTA odgovarajuće novo-unete vrednosti za polja idbr,
pocetak i posao

MS SQL:

CREATE TRIGGER trgInsRadnik ON radnik

AFTER INSERT

AS

BEGIN

insert into istorija_rmesta (idbr, pocetak, posao)

SELECT idbr, getdate(), posao

FROM INSERTED

END

U SUBP MS SQL Server se u okidaču formira tabela INSERTED u kojoj se


nalaze svi redovi (slogovi) koji se ubacuju (insertuju) u tabelu nad kojom se postavlja
okidač poslednjom INSERT naredbom, pa se u telu okidača mora voditi računa da
tabela INSERTED može imati više od jednog reda. Izvršenje okidača ćemo
demonstrirati ubacivanjem novog zaposlenog.

Primer 4. Ubaciti u tabelu RADNIK novog zaposlenog: Milanku Crnogorac sa


idbr=3887 koja je počela sa radom 1. Januara 2012. godine na radnom
mestu analitičara sa platom od 2000 novčanih jedinica

12
MS SQL

INSERT INTO radnik(idbr, ime, prezime, posao, kvalif,


rukovodilac, datzap, premija, plata, brod)

values(3887, N'Milanka', N'Crnogorac', N'analitičar',


N'VSS', NULL, '2012-01-01', NULL, 2000, NULL);

U MS SQL serveru će se formirati tabela INSERTED

INSERTED

idbr Ime prezime posao Kvalif rukovodilac datzap premija Plata brod

3887 Milanka Crnogorac analitičar VSS NULL 25.06.2012 NULL 2000 NULL

U MS SQL serveru se u telu okidača komanda INSERT izvršava preko nastavka


SELECT – to znači da se u tabelu ISTORIJA_RMESTA ubacuje više redova sa
određenim kolonama.
Rezultat izvršenja naredbe ubacivanja podataka za novog radnika (Milanke
Crnogorac sa primera 218, čiji je idbr=3887) ogleda se u ubacivanju podataka za novog
zaposlenog u tabelu RADNIK, a zatim se pod dejstvom okidača, koji se aktivira nakon
ubacivanja ovog sloga u tabeli RADNIK, izvršavaju naredbe u telu okidača – ubacivanje
novog sloga u tabeli ISTORIJA_RMESTA što se može videti na sledećoj slici. Masnim
slovima je obeležen novi slog.

SELECT * FROM istorija_rmesta

Idbr pocetak kraj posao

3887 23.07.2012 NULL analitičar

5367 01.01.1978 NULL vozač

5497 17.02.1990 NULL električar

5519 07.11.1991 NULL prodavac

13
5652 31.05.1980 NULL električar

5662 12.08.1993 NULL Upravnik

5696 30.09.1991 NULL Čistač

5780 11.08.1984 NULL Upravnik

5786 22.05.1983 NULL Upravnik

5842 15.12.1981 NULL Director

… … … …

Ako nekom od zaposlenih promenimo vrednost kolone posao u tabeli RADNIK


(to je u suštini isto što i brisanje postojećeg reda tog zaposlenog i dodavanje novog
reda sa istim podacima kao u izbrisanom redu samo sa promenjenom vrednošću u
koloni posao), u tabeli ISTORIJA_RMESTA trebalo bi da se izmeni postojeći zapis i
doda novi. Da bi se to postiglo treba:
1) pronaći slog u kojem je polje kraj prazno (NULL) za idbr tog zaposlenog i čija je
vrednost polja posao jednaka staroj vrednosti posla,

2) popuniti vrednost polja kraj današnjim datumom i

3) dodati novi slog čija je vrednost polja pocetak današnji datum, vrednost polja kraj
prazna (NULL) i vrednost polja posao jednaka novom poslu zaposlenog iz tabele
RADNIK.

Kako okidač treba da se aktivira nakon promene vrednosti u polju posao u tabeli
RADNIK, to ćemo kreirati AFTER UPDATE okidač nad tabelom RADNIK.

Primer 5. Kreirati okidač trgRadnikUpdate koji će se aktivirati nakon ažuriranja


(UPDATE) vrednosti u koloni posao tabele RADNIK i koji će postaviti
vrednost u koloni kraj u tabeli ISTORIJA_RMESTA na današnji datum
(za zaposlenog čiji se posao menja) i nakon toga ubaciti novi red sa
novom vrednošću posla u istu tabelu

14
MS SQL:

CREATE TRIGGER trgRadnikUpdate on radnik

AFTER UPDATE

AS

BEGIN

DECLARE @zavrsetak SMALLDATETIME;

SET @zavrsetak = REPLACE(Convert(varchar(10), getdate(), 102), '.',


'-');

IF UPDATE(posao)

BEGIN

UPDATE istorija_rmesta

SET kraj = @zavrsetak

FROM istorija_rmesta irm, inserted i, deleted d

WHERE irm.idbr = i.IDBR AND i.idbr = d.idbr AND irm.kraj is NULL

AND irm.posao = d.posao AND i.posao != d.posao;

INSERT INTO istorija_rmesta (idbr, pocetak, posao)

SELECT i.idbr, @zavrsetak, i.posao

FROM INSERTED i, DELETED d

WHERE i.idbr = d.idbr AND i.posao != d.posao

END

END

15
U navedenim primerima kreiranja okidača koji se izvršavaju nakon ažuriranja
(operacija UPDATE) slogova u tabeli RADNIK možemo primetiti da se naredbe
UPDATE i INSERT unutar tela okidača izvršavaju nakon provere da li se u tabeli
RADNIK menja vrednost u polju posao. U MS SQL serveru u telu okidača je postavljena
naredba IF UPDATE(posao) kojom se proverava da li je došlo do promene vrednosti u
polju posao. Ako jeste izvršavaju se UPDATE i INSERT naredbe koje se nalaze u telu
okidača;
Iz navedenih programskih kôdova može se isto tako videti da se promenljive
unutar tela okidača deklarišu nakon ključne reči BEGIN, kojom se započinje skup
naredbi u telu okidača, za MS SQL DECLARE. Za svaku promenljivu mora da se
navede tačno određeni tip podatakaTekući datum (datum koji se odnosi na tekući dan)
u različitim SUBP se različito dobija. U MS SQL se to radi preko funkcije GET_DATE(),
a u MySQL-u i Oracle-u preko sinonima CURRENT_DATE. MS SQL funkcija
GET_DATE() vraća ne samo tekući datum, već i tekuće vreme, pa je iz te vrednosti
potrebno odstraniti vremenski deo (tj. zadržati datumski deo) funkcijom
Convert(varchar(10), getdate(), 102) kojom se dobija datum u obliku YYYY.MM.DD
(2012.08.23). Naredbom REPLACE, u primeru, zamenjujemo tačku (.) crticom(-), pri
čemu dobijamo standardni datumski string: YYYY-MM-DD (2012-08-23).
Rezultat rada okidača kojeg smo kreirali možemo pratiti ako izvršimo SQL
komandu UPDATE nad tabelom RADNIK.
Primer 6. Zameniti posao u tabeli RADNIK vrednošću "šef smene" za zaposlenog
sa idbr=3887

MS SQL

UPDATE radnik SET posao = N'šef smene' WHERE idbr = 3887;

U MS SQL serveru dve tabele: INSERTED i DELETED:

DELETED

idbr ime prezime posao Kvalif rukovodilac datzap premija plata brod

16
3887 Milanka Crnogorac analitičar VSS NULL 25.06.2012 NULL 2000 NULL

INSERTED

idbr ime prezime posao Kvalif rukovodilac datzap premija plata brod

šef
3887 Milanka Crnogorac smene VSS NULL 25.06.2012 NULL 2000 NULL

Rezultat delovanja okidača koji se pokreće nakon izmene podatka (Update) nad
tabelom RADNIK vidi se u tabeli ISTORIJA_RMESTA. Masnim slovima su naglašene
promene – ažurirana vrednost u koloni kraj za posao „analitičar“ i ubačen novi red za
posao „šef smene“. Voditi računa da je autor knjige ovaj upit izvršio 23.08.2012, pa se
zato pojavljuje ovaj datum kao tekući.
SELECT * FROM istorija_rmesta

WHERE idbr = 3887

idbr pocetak kraj posao

3887 23.07.2012 23.08.2012 analitičar

šef
3887 23.08.2012 NULL smene

U telu okidača u MS SQL serveru ažuriranje i ubacivanje novih slogova u tabelu


ISTORIJA_RMESTA je nešto složenije (preko složene naredbe UPDATE i INSERT
into/SELECT) i biće bolje objašnjeno na narednom primeru.
SQL naredbom kojom se ažurira više redova u tabeli RADNIK pokazaćemo kako
se izvršava okidač.

Primer 7. U tabeli RADNIK zameniti posao "načelnik" u "upravnik"

MS SQL

UPDATE radnik SET posao = N'načelnik' WHERE posao =


N'upravnik';

17
Komandom iz prethodnog primera će se u tabeli RADNIK ažurirati 4 reda jer se
menja posao kod 4 zaposlena radnika.
U SUBP MS SQL server se formiraju samo dve tabele i okidač se izvršava
jednom. Tabele INSERTED i DELETED koje se formiraju tada date su na sledećoj slici.

DELETED

idbr ime prezime Posao Kvalif rukovodilac datzap premija plata brod

5662 Janko Mančić upravnik VSS 6789 12.08.1993 NULL 2400 10

5780 Božidar Ristić upravnik VSS 6789 11.08.1984 NULL 2200 20

5786 Pavle Šotra upravnik VSS 6789 22.05.1983 NULL 2800 30

6789 Janko Simić upravnik VSS 5842 23.12.2003 10 3900 40

INSERTED

idbr ime prezime posao Kvalif rukovodilac datzap premija plata brod

5662 Janko Mančić načelnik VSS 6789 12.08.1993 NULL 2400 10

5780 Božidar Ristić načelnik VSS 6789 11.08.1984 NULL 2200 20

5786 Pavle Šotra načelnik VSS 6789 22.05.1983 NULL 2800 30

6789 Janko Simić načelnik VSS 5842 23.12.2003 10 3900 40

U UPDATE naredbi okidača trgRadnikUpdate u SUBP MS SQL, prvo se


povezuje tabela ISTORIJA_RMESTA sa tabelom INSERTED po polju idbr i vrednosti
polja kraj is NULL, tabela INSERTED sa tabelom DELETED po polju idbr i uslovu da je
vrednost polja posao u te dve tabele različita, a tabela DELETED sa tabelom
ISTORIJA_RMESTA po polju posao. Kada se izvrši povezivanje (join) tada se u polju
kraj (koje je bilo prazno) upisuje vrednost tekućeg datuma. Na sledećoj slici podvučenim
(i.idbr, d.idbr, irm.idbr), zadebljanim (d.posao, irm.posao) i kosim (kraj) slovima su
pokazane vrednosti u poljima po kojima se vrši spajanje tabela INSERTED, DELETED i
ISTORIJA_RMESTA.

INSERTED join DELETED ISTORIJA_RMESTA

18
i.idbr rukovo-
d.idbr ime prezime d.posao i.posao kvalif dilac datzap premija plata brod irm.idbr pocetak kraj irm.posao

5662 Janko Mančić upravnik načelnik VSS 6789 12.08.1993 NULL 2400 10 5662 12.08.1993 NULL upravnik

5780 Božidar Ristić upravnik načelnik VSS 6789 11.08.1984 NULL 2200 20 5780 11.08.1984 NULL upravnik

5786 Pavle Šotra upravnik načelnik VSS 6789 22.05.1983 NULL 2800 30 5786 22.05.1983 NULL upravnik

6789 Janko Simić upravnik načelnik VSS 5842 23.12.2003 10 3900 40 6789 23.12.2003 NULL upravnik

Nakon što se NULL vrednosti u izdvojenim redovima u tabeli


ISTORIJA_RMESTA zamene tekućim datumom, naredbom INSERT into / SELECT, u
istu tabelu se dodaju slogovi koji su rezultat promene/razlike između tabela INSERTED i
DELETED. Tako na kraju imamo sledeće promene u tabeli ISTORIJA_RMESTA kao na
sledećoj slici. Ponovo voditi računa da je autor knjige ovaj upit izvršio 23.08.2012, pa se
zato pojavljuje ovaj datum kao tekući.
Kako UPDATE okidač treba da izvršava naredbe u telu okidača samo u slučaju
da se ažurira vrednost polja posao u tabeli RADNIK, pokušaćemo da ažuriramo
vrednost nekog drugog polja kako bi se uverili da tada okidač ne menja sadržaj tabele
ISTORIJA_RMESTA. U tu svrhu izmenićemo datum zapošljavanja (vrednost u koloni
datzap) u tablici RADNIK zaposlenom sa idbr = 5696 kao što je to pokazano u Primer
8.

SELECT * FROM istorija_rmesta

WHERE idbr in (SELECT idbr from radnik

WHERE posao =’načelnik’) order by idbr

idbr pocetak kraj posao

5662 12.08.1993 23.08.2012 upravnik

5662 23.08.2012 NULL načelnik

5780 11.08.1984 23.08.2012 upravnik

5780 23.08.2012 NULL načelnik

5786 22.05.1983 23.08.2012 upravnik

5786 23.08.2012 NULL načelnik

6789 23.12.2003 23.08.2012 upravnik

19
6789 23.08.2012 NULL načelnik

Primer 8. Promeniti vrednost datuma zapošljavanja zaposlenog sa idbr=5696 na


29. septembar 1991. godine

MS SQL:

UPDATE radnik SET datzap = '1991-09-29' WHERE idbr = 5696;

Možemo da se uverimo da se ništa nije promenilo u tabeli ISTORIJA_RMESTA


za radnika sa idbr=5696, što se može videti na sledećoj slici.

SELECT * FROM istorija_rmesta

WHERE idbr = 5696

idbr pocetak kraj posao

5696 30.09.1991 NULL čistač

Taj okidač će pri ubacivanju ili ažuriranju slogova u tabelu PLATE_STAVKE javiti
grešku u slučaju narušavanja ovog ograničenja.

Primer 9. Kreirati okidač nad tablicom PLATE_STAVKE koji će u slučaju da je


suma naknada (kolona iznos) u toku jednog meseca za bilo kog
zaposlenog veća od sume plate i premije u tablici RADNIK za istog
zaposlenog, javiti grešku

20
MS SQL:

CREATE TRIGGER trgPlataProvera on plate_stavke

AFTER INSERT, UPDATE

AS

BEGIN

DECLARE @koefStaz decimal(4,2)= 1.0;

IF EXISTS(

SELECT ps.idbr, p.mesec, p.godina,

(r.plata*@koefStaz + isnull(r.premija, 0.00))

FROM plate p, plate_stavke ps, inserted i, radnik r, plate p1

WHERE p.autoid = ps.autoid and i.autoid = p1.autoid AND

p.godina = p1.godina AND p.mesec = p1.mesec and

ps.idbr = i.idbr and r.idbr = i.idbr

GROUP BY ps.idbr, p.mesec, p.godina,

(r.plata*@koefStaz + isnull(r.premija, 0.00))

HAVING sum(ps.iznos) - (r.plata*@koefStaz + isnull(r.premija,


0.00))

> 0)

RaisError('Ukupni iznos plate i premije po radniku je veći od


dozvoljenog mesečnog limita', 16, 1);

END;

U SUBP MS SQL Server je dozvoljno kreiranje jednog okidača za više SQL


komandi (AFTER INSERT, UPDATE).U telu okidača može da se navede naredba
EXISTS (SELECT ...) koja vraća vrednost TRUE ako SELECT naredba u zagradi vraća
bar jedan slog, odnosno FALSE ako ista naredba ne vraća ni jedan slog. SELECT
naredba na osnovu tabele INSERTED kreira slogove kod kojih je suma iznosa po

21
zaposlenom u toku jednog meseca u godini veća od zbira plate i premije iz tabele
RADNIK. Ako postoji bar jedan takav slog javlja se greška (naredbom RaisError).

Primer 10. Ažurirati vrednost u koloni iznos u tabeli PLATE_STAVKE na 800


novčanih jedinica u svim slogovima koji su vezani za rbpl = 2, mesec = 1
i godina = 2012 iz tabele PLATE

MS SQL

UPDATE plate_stavke SET iznos = 800 where autoid in

(SELECT autoid FROM plate WHERE rbpl=2 and mesec=1 and godina=2012)

U okidaču trgPlataProvera u SUBP MS SQL, SELECT upit u delu IF


EXISTS(SELECT...) vratiće sledeće slogove kao na sledećoj slici (u koloni desno
postavljen je uslovu delu HAVING u SELECT naredbi kojim detektujemo slogove koji su
premašili iznos mesečne naknade):

SELECT ps.idbr, p.mesec, p.godina… sum(ps.iznos) -

(r.plata +
isnull(r.premija,
0.00))

No column
idbr mesec godina name

5652 1 2012 1500 50

5696 1 2012 1000 300

5953 1 2012 1100 250

22
Iz pokazane tabele se vidi da postoje redovi koji zadovoljavaju HAVING uslov, pa
okidač javlja poruku „Ukupni iznos plate i premije po radniku je veći od dozvoljenog
mesečnog limita“.
U okidaču trgPlataProveraStmt koji je okidač tipa „statement“ se nalaze sledeći
sadržaj tabele TEMP_PLATE_STAVKE nakon INSERT into temp_plate_stavke naredbe
kao što je to pokazano na sledećoj slici.

SELECT * from temp_plate_stavke

autoid idbr iznos mesec godina mesecniIznos

2 3887 800 1 2012 2000

2 5367 800 1 2012 3200

2 5497 800 1 2012 1800

2 5519 800 1 2012 2500

2 5652 800 1 2012 1500

2 … 800 1 2012 …

2 … 800 1 2012 …

-1 5652 1550 1 2012 1500

-1 5696 1300 1 2012 1000

-1 5953 1350 1 2012 1100

Kao što se iz tabele može videti (zamašćeni slogovi) postoje tri reda čiji je autoid
= -1 (lBrSlogova > 0) pa zbog toga okidač javlja grešku „Ukupni iznos plate i premije po
radniku je veći od dozvoljenog mesečnog limita“.

23
Transakcije
(Relacione baze podataka)

mr Miloš Pejanović, dipl.inž. 1


mr Miloš Pejanović, dipl.inž. 2
mr Miloš Pejanović, dipl.inž. 3
mr Miloš Pejanović, dipl.inž. 4
mr Miloš Pejanović, dipl.inž. 5
mr Miloš Pejanović, dipl.inž. 6
mr Miloš Pejanović, dipl.inž. 7
mr Miloš Pejanović, dipl.inž. 8
mr Miloš Pejanović, dipl.inž. 9
mr Miloš Pejanović, dipl.inž. 10
mr Miloš Pejanović, dipl.inž. 11
mr Miloš Pejanović, dipl.inž. 12
mr Miloš Pejanović, dipl.inž. 13
mr Miloš Pejanović, dipl.inž. 14
mr Miloš Pejanović, dipl.inž. 15
NAREDBE ZA IZVRŠENJE TRANSAKCIJE

mr Miloš Pejanović, dipl.inž. 16


mr Miloš Pejanović, dipl.inž. 17
Transakcije
(Relacione baze podataka)

mr Miloš Pejanović, dipl.inž. 18


Rezime
BEGIN TRAN TR1

SQL iskazi

-- ako ima grešaka


ROLLBACK TRAN TR1
-- ako nema grešaka
COMMIT TRAN TR1

mr Miloš Pejanović, dipl.inž. 19


Pitanja ?

mr Miloš Pejanović, dipl.inž. 20


Relacione baze podataka
DML/DDL/DCL/TCL
УВОД

Сигурност и интегритет
 Сигурност: заштита података од неауторизованих
корисника (заштита против неауторизованог
приступа, промене или уништења)

 Интегритет: заштита података од ауторизованих


корисника (обезбеђење исправности и
коректности података) - већ разматрано
УВОД
Сличности између сигурности и
интегритета
 систем мора да буде свестан извесних ограничења
које корисници не смеју да прекрше
 ограничења морају да буду задата (од стране ДБА) у
неком језику
 ограничења морају да буду евидентирана у
системском каталогу (речнику података)
 СУБП мора да врши надзор над операцијама
корисника
УВОД
Аспекти проблема сигурности
 правни, социјални и етички (нпр. увид у стање
рачуна корисника)
 физичка контрола (нпр. физичко обезбеђење
рачунарске сале)
 политичка питања (одлучивање ко и чему сме да
приступи)
 оперативни проблеми (нпр. како обезбедити
тајност лозинки)
УВОД
Аспекти проблема сигурности
 хардверска контрола (нпр. да ли ЦПУ има
могућност хардверске заштите програма)
 подршка оперативног система (нпр. да ли ОС
брише садржај меморије и дискова по завршетку
рада програма)
 проблеми везани за саме базе података (нпр. да
ли постоји концепт власника података)
УВОД
Јединица података која се
осигурава
 база података
 појединачна инстанца или вредност атрибута
 алиаси
 шеме
 индекси
 пакети
 простори за чување табела
 .........
УВОД
Сигурност у SQL-у
 Постоје два механизма који су, независно један од
другог, укључени у систем заштите:
 Погледи који могу да се користе за сакривање
осетљивих података од неауторизованих корисника
 Подсистем за ауторизацију, који допушта
кориснику са одређеним правима приступа да та
права селективно и динамички преноси на друге
кориснике, и/или да пренета права повуче
УВОД
Подсистем за ауторизацију
 Да би корисник извршио било какаву операцију
над неким објектом он мора да поседује дозволу
(или ауторизацију) за ту операцију над тим
објектом
 Типови и врсте дозвола нису исти код свих СУБП
 Системски администратор је иницијални власник
свих дозвола
 Давање дозвола се врши GRANT наредбом, а
повлачење REVOKE наредбом
Data Control Language (DCL)
Kontrola pristupa podacima
 DCL команде у базама података са више корисника
како би се обезбедила сигурност базе.

 Постоје две команде: GRANT и REVOKE.

 Само администратор базе података или власник


објекта у бази може да додељује привилегије над
објектом базе података.
DCL
 GRANT – пружа кориснику привилегију
приступа бази података или неком њеном објекту

 REVOKE – ускраћује кориснику привилегију која


му је додељена GRANT командом
DCL
Како DCL ради?
 Уписује привилегије у табелу:
 SYSTABLEPERMS (на нивоу табеле)
 SYSCOLPERMS (на нивоу колоне)
 Колоне:
 GRANTOR – давалац привилегије(The authorization
ID of the user who granted the privilege. Privileges can
be granted only by the object owner.)
 GRANTEE - The authorization ID of the user to whom
the privilege is granted.
 TABLEID – табела
 тип привилегије
DCL
SYSTABLEPERMS system table
 The keys for the SYSTABLEPERMS table are:
 Primary key (GRANTEE, TABLEID, GRANTOR)
 Unique key (TABLEPERMSID)
 Foreign key (TABLEID references SYS.SYSTABLES)
DCL
SYSCOLPERMS system table
 Primary key (GRANTEE, TABLEID, TYPE, GRANTOR)
 Unique key (COLPERMSID)
 Foreign key (TABLEID references SYS.SYSTABLES)
DCL
GRANT
 GRANT наредба служи за додељивање привилегија
или улога једном или свим корисницима, како би
могли да врше операције над објектима базе
података.
DCL
Opšte pravo
 GRANT OpštePravo T OKorisnik
IDENTIFIED BY Lozinka;

OpštePravo: može biti jedno od sledećih:

– CONNECT: sva dodeljena posebna prava nad tabelama,


plus kreiranja pogleda nad tim tabelama
– RESOURCE: prethodna prava plus prava kreiranja
osnovnih tabela
– DBA (Data Base Administrator): neograničena prava
nad BP, koja ima korisnik koji je administrator BP SQL
DCL
Posebna prava
odnose na tabele i poglede u BP, kao i na dozvoljene radnje
nad njima
 GRANT privilege syntax:

GRANT privilege_name
ON [ANY] object_type [object_name]
TO user_name
[WITH GRANT OPTION];
DCL
privilege_name
 {ALL [PRIVILEGES] | privilege-list}

 Привилегије које се могу доделити су:

 Све привилегије – ALL PRIVILEGES,


 Брисање података из одређене табеле – DELETE,
 Убацивање података у одређену табелу – INSERT,
 Дозволакреирања референце страног кључа –
REFERENCES,
DCL
privilege_name
 Селектовање података из неке табеле - SELECT
[column list],
 Креирање тригера над табелом – TRIGGER,
 Ажурирање података у табели – UPDATE [column
list],
 Покретање одређене функције или процедуре -
EXECUTE,
DCL
ANY object_type object_name
ANY – сви објекти наведеног типа (у овом случају не
наводи се object_name и обрнуто)
 object_type је назив типа објекта у бази података,
као нпр:
 TABLE
 VIEW
 STORED PROC
 SEQUENCE...
 object_name представља назив објекта у бази
DCL
user_name = grantee
 {user_name |PUBLIC |role_name}

 Корисници којима се могу доделити привилегије су


следећи:
 Корисници по називу - user_name
 Свим корисницима - PUBLIC
 Корисницима по улози – role_name
DCL
user_name = grantee
 Mogu se dodeliti privilegije pojedinim korisnicima ili svima
 PUBLIC oznacava sve sadasnje i buduce korisnike

 Privilegije dodeljene sa PUBLIC i individualni korisnicima su
nezavisne

 Primer: privilegija SELECT za tabelu t je dodeljena i PUBLIC i


korisniku ID harry. SELECT privilegija je kasnije oduzeta korisniku
ID harry, ali Harry i dalje moze da pristupi tabeli t putem PUBLIC
privilegije.
DCL
WITH GRANT OPTION
 Уколико се дода ова клаузула, кориснику се
омогућава додељивање привилегија другим
корисницима.

 Ова опција се мора пажљиво користити јер нпр. ако се


додели GRANT SELECT привилегија над табелом_1
кориснику_1 заједно са WITH GRANT option, онда
корисник_1 може да додели GRANT SELECT
привилегију другим корисницима. Касније, ако је
потребно одузети дозволу кориснику_1, они корисници
који су добили привилегије од њега ће их и даље
задржати.
DCL
GRANT role
 Прво се мора креирати улога (pre GRANT):
CREATE ROLE role_name
[IDENTIFIED BY password];

 Синтакса додељивања улога:


GRANT role_name TO user_name_list;

 Само администратор може да додели улогу.


DCL
ROLE
 Skup privilegija koje mogu biti dodeljene
korisnicima ili drugim ulogama
 Privilegije se mogu dodeliti ulozi i zatim
dodeliti ulogu odredjenom korisniku
 ROLE sadrzi sve privilegije dodeljene ulozi i
sve privilegije drugih uloga koje su joj
dodeljne
 Nova ROLE je inicijalno prazna, a privilegije se
dodeljuju sa GRANT naredbom
DCL
ROLE
 CREATE ROLE dw_manager;

 Korisnici kojima se dodeli ova uloga, nasledjuju sve


privilegije koje su dodeljene ovoj ulozi
DCL
GRANT - Примери
 За додељивање свих дозвола над employee табелом за
корисника user1 користи се следећа синтакса:
 GRANT ALL ON employee TO user1;
 За додељивање SELECT дозволе над табелом t за
кориснике maria и harry, користи се следећа синтакса:
 GRANT SELECT ON TABLE t TO maria,harry
 За додељивање UPDATE и TRIGGER привилегија
над табелом t за кориснике anita и zita, користи се
следећа синтакса:
 GRANT UPDATE, TRIGGER ON TABLE t TO
anita,zita
DCL
GRANT - Примери
 За додељивање SELECT привилегије над свим
табелама свим корисницима, користи се следећа
синтакса:
 GRANT SELECT ON ANY TABLE to PUBLIC
 За додељивање улоге
purchases_reader_role корисницима george and maria,
користи се следећа синтакса:
 GRANT purchases_reader_role TO george,maria
 За додељивање SELECT привилегије над табелом t свим
корисницима под улогом purchases_reader_role,
користи се следећа синтакса:
 GRANT SELECT ON TABLE t TO purchases_reader_role
DCL
GRANT - Примери
 GRANT SELECT, UPDATE ON emp_view TO PUBLIC;
 GRANT REFERENCES (employee_id), UPDATE
(employee_id, salary, commission_pct) ON
hr.employees TO oe;
 GRANT SELECT ON sh.sales TO warehouse_user;
DCL

REVOKE

- Oduzimanje sistemskih privilegija


- Oduzimanje uloga
- Oduzimanje privilegija nad objektima
DCL
REVOKE синтакса
REVOKE privilege_name
ON object_name
FROM {user_name |PUBLIC |role_name}

Уколико је корисник добио исту дозволу од више


других корисника, та дозвола ће му бити важећа све
док му сви корисници не повуку ту дозволу.
Корисник може повући само оне дозволе које је он
доделио.
DCL
REVOKE - Примери
 Одузимање SELECT дозволе над табелом employee
од корисника user1:
 REVOKE SELECT ON employee FROM user1
 Одузимање UPDATE и TRIGGER привилегија над
табелом t од корисника anita и zhi:
 REVOKE UPDATE, TRIGGER ON TABLE t FROM
anita,zhi
 Одузимање SELECT привилегије над табелом s.v од
свих корисника:
 REVOKE SELECT ON TABLE s.v FROM PUBLIC
DCL
REVOKE - Примери
 Одузимање UPDATE привилегије над
колонама c1 и c2 табеле s.v од свих корисника:
 REVOKE UPDATE (c1,c2) ON TABLE s.v FROM
PUBLIC
 Одузимање SELECT привилегије над табелом t од
улоге purchases_reader_role:
 REVOKE SELECT ON TABLE t FROM
purchases_reader_role
DCL
ROLE, GRANT, REVOKE – Пример 1
CREATE ROLE manisha;
GRANT ALL ON COMPANY TO manisha;
REVOKE ALL ON COMPANY FROM manisha;
DROP ROLE manisha;
DCL
Пример 2
 Нека у РБП Библиотека имамо три корисника који
треба да имају следећа права:
 Шеф: права ажурирања података о областима,
насловима, ауторима, ауторству и књигама, плус
права упита над свим подацима
 Радник: права ажурирања података о члановима,
држању књига, позајмицама и резервацијама, плус
права упита над свим подацима
 Члан: права упита над подацима о областима,
насловима, ауторима и ауторству
DCL
Пример 2
 Креирање корисника:

 GRANT CONNECT TO Sef IDENTIFIED BY


LozinkaSefa;
 GRANT CONNECT TO Radnik IDENTIFIED BY
LozinkaRadnika;
 GRANT CONNECT TO Clan IDENTIFIED BY
LozinkaClana;

 Grant Connect Grants the user permissions to connect


to SQL Server
DCL
Пример 2
 Давање права упита:

 GRANT SELECT ON Oblast, Naslov, Autor, Je_Autor TO


PUBLIC;
 GRANT SELECT ON Knjiga, Clan, Drzi, Pozajmica,
Rezervacija TO Sef, Radnik;
DCL
Пример 2
 Давање права ажурирања:

 GRANT INSERT, UPDATE, DELETE ON Clan, Drzi,


Pozajmica, Rezervacija TO Radnik;
 GRANT INSERT, UPDATE, DELETE ON Oblast, Naslov,
Autor, Je_Autor, Knjiga TO Sef;
DCL
Преглед додељених привилегија
 Да видите привилегије за табеле које сте доделили:
 SELECT * FROM USER_TAB_PRIVS_MADE
 Да видите привилегије за табеле које су вам додељене:
 SELECT * FROM USER_TAB_PRIVS_RECD;
 Да видите привилегије за колоне које сте доделили:
 SELECT * FROM USER_COL_PRIVS_MADE
 Да видите привилегије за колоне које су вам додељене:
 SELECT * FROM USER_COL_PRIVS_RECD;
 Да видите привилегије за улоге:
 SELECT * FROM USER_ROLE_PRIVS;
Питања ?

You might also like