Download as pdf or txt
Download as pdf or txt
You are on page 1of 78

OSNOVE SQL-A I BAZA

PODATAKA
PRIRUČNIK
Silvije Davila

Tina Kaštelan

Luka Nekić

Zagreb, 2021.
Autori:
Silvije Davila
Tina Kaštelan
Luka Nekić

Urednica:
Dolores Kujek

Naslov:
Osnove SQL-a i baza podataka

Izdanje:
3. izdanje

Stručni recenzent:
Mario Šipek

Lektorica:
Ankica Tomić

Grafički urednik:
Krešimir Pletikosa, ACE

Nakladnik:
Algebra d.o.o., 2021.

Za nakladnika:
doc. dr. sc. Mislav Balković

Mjesto i godina izdavanja:


Zagreb, 2021.

Sva prava pridržana. Niti jedan dio ove knjige ne smije se reproducirati ili prenositi u bilo kojem obliku, niti na koji
način. Zabranjeno je svako kopiranje, citiranje te upotreba knjige u javnim i privatnim edukacijskim organizacijama
u svrhu organiziranih školovanja, a bez pisanog odobrenja nositelja autorskih prava.

Copyright © Algebra d.o.o.

CIP zapis dostupan u računalnom katalogu Nacionalne i sveučilišne knjižnice u Zagrebu pod brojem 001108619.

ISBN 978-953-322-410-7
Sadržaj
1. poglavlje: RELACIJSKI MODEL BAZE PODATAKA ...................................................... 5
UVOD ...................................................................................................................................... 6
BAZE PODATAKA ................................................................................................................... 6
DIZAJNIRANJE BAZE PODATAKA ........................................................................................ 8
MODELIRANJE PODATAKA .................................................................................................. 9
RELACIJSKI MODEL ............................................................................................................ 11
NORMALIZACIJA .................................................................................................................. 16
ZADACI ZA VJEŽBU ............................................................................................................. 18
2. poglavlje: SQL JEZIK .....................................................................................................19
MALO POVIJESTI ................................................................................................................. 20
SQL KLJUČNE RIJEČI .......................................................................................................... 21
ČITANJE SINTAKSNIH DIJAGRAMA ................................................................................... 24
TIPOVI PODATAKA .............................................................................................................. 25
KREIRANJE I BRISANJE OBJEKATA BAZE ....................................................................... 29
ZADACI ZA VJEŽBU ............................................................................................................. 35
3. poglavlje: RAD S PODACIMA U BAZI ............................................................................37
UBACIVANJE PODATAKA U TABLICU................................................................................ 38
DOHVAĆANJE PODATAKA IZ TABLICE ............................................................................. 40
UPITI NAD VIŠE TABLICA .................................................................................................... 48
ZADACI ZA VJEŽBU ............................................................................................................. 53
4. poglavlje: SQL - IZMJENE U BAZI PODATAKA ............................................................55
IZMJENA PODATAKA U TABLICI ........................................................................................ 56
BRISANJE PODATAKA IZ BAZE .......................................................................................... 56
KREIRANJE TABLICA NAREDBOM SELECT INTO ............................................................ 57
POGLEDI ............................................................................................................................... 58
ISPRAVAK I UBACIVANJE PODATAKA KORIŠTENJEM POGLEDA ................................. 60
ZADACI ZA VJEŽBU ............................................................................................................. 61
5. poglavlje: FUNKCIJE ......................................................................................................63
UVOD .................................................................................................................................... 64
MATEMATIČKE FUNKCIJE .................................................................................................. 64
FUNKCIJE ZA RAD S TEKSTOM ......................................................................................... 65
FUNKCIJE ZA PRETVORBU TIPOVA .................................................................................. 67
FUNKCIJE ZA RAD S DATUMOM I VREMENOM ............................................................... 68
ZADACI ZA VJEŽBU ............................................................................................................. 71
6. poglavlje: RAD S UPITIMA U SQL SERVERU 2019 .......................................................73
RAD S UPITIMA U MANAGEMENT STUDIJU ..................................................................... 74
SPREMANJE, OTVARANJE I PRIKAZIVANJE REZULTATA UPITA .................................. 76
1. poglavlje: RELACIJSKI MODEL BAZE
PODATAKA

U ovom poglavlju naučit ćete:

što je baza podataka

sustavi za upravljanje bazama

dizajniranje baze podataka

modeliranje entiteta i veza

ER-dijagrami

relacijski model baze podataka

postupak normalizacije
Str. 6 OSNOVE SQL-A I BAZA PODATAKA

UVOD
Baze podataka su jedan od važnijih objekata koji se koriste u svakodnevnom radu. Primjerice,
svaka tvrtka ima obavezu voditi knjigovodstvene papire, pa podatke o svom poslovanju mora
negdje zapisati. Također, svaka tvrtka vodi razne interne evidencije robe na skladištu, u
prodavaonici, o kupcima i dobavljačima..., te podatke mora negdje zapisati. Svaka banka,
videoteka, trgovina, bolnica, hotel, također, moraju zapisivati veliku količinu podataka o svom
poslovanju. Na internetu se većina stranica oslanja na podatke koji su negdje pohranjeni.
Prije su se ti podaci pohranjivali pismeno, u knjige. Nakon toga su došla računala, pa su se
podaci počeli pohranjivati u datoteke koje su se spremale na diskete, trake ili na disk računala.
Kako su potrebe za organizacijom i lakšim dohvatom podataka rasle, tako se s običnih
datoteka prešlo na bazu podataka, koja onda pomaže da se podaci lakše obrade.

Naravno, kako je baza podataka pohranjena na računalu u nekom digitalnom formatu, tako je
izmišljen jezik pomoću kojeg se s tom bazom podataka razgovara, tako da baza može
odgovarati na postavljena pitanja. Taj izmišljeni jezik danas se naziva SQL (čitati: es kju el) i
on je tema ovog priručnika.

BAZE PODATAKA

DIREKTNE DATOTEKE

Kao što smo spomenuli u uvodu, nekad su se podaci pohranjivali u datoteke koje možemo
promatrati kao kolekciju zapisa, gdje se svaki zapis sastoji od polja. Svako polje pripada nekom
tipu podataka (broj, slovo, ...). Takve se datoteke nazivaju linearne ili direktne datoteke (engl.
flat file) i kod njih nema nikakve dodatne organizacije zapisa. Jedan od glavnih problema kod
takve organizacije jest da zapisivanje na fizički medij (disketa, traka, tvrdi disk, ...) ovisi o
samom mediju. Ostali uočeni problemi su:

 konkurentnost – znači da podacima u jednom trenutku može pristupati najviše jedna


osoba, tj. najviše jedan program

 integritet – ako više programa koristi iste informacije, može doći do iskrivljavanja
podataka jer ne postoji nikakva kontrola

 relacije – teško je uspostaviti bilo kakve relacije među podacima jer ne postoji nikakva
predefinirana struktura, pa je podacima teško pristupati

 ponovna iskoristivost – direktna datoteka dizajnirana za jedan sustav teško se može


iskoristiti na nekom drugom

 sigurnost – ne postoji univerzalan način osiguravanja pristupa podacima (npr. pomoću


šifre), pa su podaci podložni neautoriziranom pristupanju

SUSTAV ZA UPRAVLJANJE BAZOM PODATAKA – DBMS

Baza podataka je skup međusobno povezanih podataka pohranjenih na vanjskoj memoriji,


koji su istovremeno dostupni raznim korisnicima i programima.
1. poglavlje: RELACIJSKI MODEL BAZE PODATAKA Str. 7

Podaci koji se nalaze u nekoj bazi fizički su pohranjeni kao datoteke, pa se postavlja pitanje
po čemu se baza podataka razlikuje od direktne datoteke? Naravno, od same baze podataka
nemamo puno više koristi nego što imamo od direktnih datoteka. Ono od čega imamo velike
koristi jest sustav za upravljanje bazom podataka ili skraćeno DBMS (DataBase Management
System).
DBMS je poslužitelj baze podataka koji se nalazi između korisnika baze podataka i same baze.
On u ime korisnika obavlja sve operacije s podacima.
Kako rad s bazom podataka ne znači samo dohvaćanje podataka nego i njihovo dodavanje,
mijenjanje i brisanje, te čuvanje integriteta podataka, čuvanje sigurnosnih kopija baze,
omogućavanje istovremenog pristupa bazi više korisnika, provjeru identiteta korisnika, postaje
jasno da je za to potreban DBMS.
Ključna stvar koja razlikuje bazu podataka od direktne datoteke leži u svojstvu nezavisnosti
podataka koju pruža DBMS.

Postoje dva nivoa nezavisnosti:

 Fizička nezavisnost – baza može promjeniti medij na kojemu zapisuje svoje podatke,
a korisnik baze tu promjenu ne vidi. Baza se čak može distribuirati na više računala, a
korisnik će vidjeti bazu kao jedinstvenu cjelinu.

 Logička nezavisnost – označuje mogućnost promjene logičke sheme baze bez


potrebe da korisnik išta mijenja u svom načinu pristupanja bazi.
Podaci u bazi logički su organizirani u skladu s nekim modelom podataka. Model podataka je
skup pravila koja određuju kako može izgledati logička struktura baze.
Dosadašnji DBMS-i obično su podržavali neki od sljedećih modela:

 Relacijski model
Zasnovan je na matematičkom pojmu relacije. I podaci i veze medu podacima prikazuju
se tablicama. Tablice su međusobno povezane

www.algebra.hr
Str. 8 OSNOVE SQL-A I BAZA PODATAKA

 relacijama čija je uloga izbjeći redundanciju (ponavljanje), očuvati integritet podataka,


te povećati brzinu pretraživanja.

 Mrežni model

Baza je predočena usmjerenim grafom. Čvorovi su tipovi zapisa, a lukovi definiraju veze
među njima.

 Hijerarhijski model
To je specijalni slučaj mrežnoga modela. Baza je predočena jednim stablom ili skupom
stabala. Čvorovi su tipovi zapisa, a hijerarhijski odnos “nadređeni-podređeni” izražava
veze među njima.

 Objektni model
Inspiriran je objektno-orijentiranim programskim jezicima. Baza je skup trajno
pohranjenih objekata koji se sastoje od svojih internih podataka i metoda za rukovanje
tim podacima. Svaki objekt pripada nekoj klasi. Izmedu klasa uspostavljaju se veze
nasljeđivanja, agregacije, odnosno međusobnog korištenja operacija.
Od 80-tih godina pa sve do danas prevladava relacijski model, a očekivani prijelaz na objektni
model još se nije dogodio. Što se tiče objektnog modela, on je dosta moćniji od ostalih, ali je
zato i kompliciraniji, pa još uvijek nekako prevladava jednostavnost relacijskoga modela.

DIZAJNIRANJE BAZE PODATAKA


Prije nego što se upustimo u kreiranje i rad s bazama podataka, dobro je proći barem neku
fazu dizajniranja. Naravno, kada se radi s nekom manjom bazom, mnogo se toga može
dizajnirati 'napamet', dovoljna će biti i skica na papiru. No, čim se krene raditi sa većim bazama,
treba uložiti veći napor da bi se krajnja baza dobro napravila.
Uvođenje baze podataka u neko poduzeće ili ustanovu predstavlja složeni zadatak koji
zahtijeva timski rad stručnjaka raznih profila.
Taj se projekt koji se može podijeliti u pet faza:

 analiza potreba

 modeliranje podataka

 implementacija

 testiranje

 održavanje

ANALIZA POTREBA

Da bismo razvili bazu za neki sustav moramo prikupiti informacije o tom sustavu, bilo kroz
proučavanje samog sustava bilo komunikacijom sa stručnjacima koji se njime služe. Tako se
sustav i podaci koje je potrebno zapamtiti u bazi detaljno upoznaju, kao i način na koji se ti
podaci prikupljaju. Rezultat ovog koraka treba biti početna dokumentacija sustava koja će
služiti da bi se izveli daljnji koraci. Rezultat analize je dokument (pisan neformalno u prirodnom
1. poglavlje: RELACIJSKI MODEL BAZE PODATAKA Str. 9

jeziku) koji se zove specifikacija potreba. Kada imamo takvu dokumentaciju krećemo na
konceptualni dizajn. To znači da trebamo detaljno raščlaniti podatke koji čine bazu služeći se
modelom visokog nivoa (koriste se tzv. ER dijagrami).

MODELIRANJE PODATAKA

U ovom koraku identificiramo pripadnike (entitete) koji čine sustav i shvaćamo način na koji su
povezani (tj. točno utvrđujemo njihovu međusobnu relaciju). Sljedeći je korak logički dizajn u
kojem iz modela visokoga nivoa izvodimo model za implementaciju, tj. iz ER dijagrama
kreiramo stvarnu bazu.

IMPLEMENTACIJA

Na temelju sheme i uz pomoć dostupnog DBMS-a, fizički se kreira baza podataka na računalu.
U DBMS-u postoje parametri kojima se može utjecati na fizičku organizaciju baze, a oni se
podešavaju tako da se osigura efikasan rad najvažnijih transakcija. Baza se puni podacima.
U fizičkom dizajnu, odlučujemo (točnije, administrator baze odlučuje) kako će baza biti
zapisana (na disku, traci, na više diskova...) i na koje će se sve to načine događati. Te se
odluke obično donose nakon razmišljanja o performansama i dostupnosti hardvera.

TESTIRANJE

Korisnici testiraju rad s bazom i provjeravaju zadovoljava li ona svim zahtjevima. Nastoje se
otkriti greške koje su se mogle potkrasti u svakoj od faza razvoja. Greške u ranijim fazama
imaju teže posljedice. Na primjer, greška u analizi potreba dovodi do toga da transakcije možda
korektno rade, ali ne i ono što korisnicima treba. Dobro bi bilo kad bi se takvi propusti otkrili
prije implementacije. Zato se u novije vrijeme, prije prave implementacije, razvijaju i približni
prototipovi baze podataka, koji se pokazuju korisnicima.

ODRŽAVANJE

Održavanje se odvija nakon što baza već uđe u redovnu upotrebu. Sastoji se od popravaka
grešaka koje nisu bile otkrivene u fazi testiranja, te od uvođenja promjena zbog novih zahtjeva
korisnika i podešavanja parametara u DBMS-u u svrhu poboljšavanja performansi.

MODELIRANJE PODATAKA

MODELIRANJE ENTITETA I VEZA

Entitet je objekt, pojava ili događaj o kojem želimo spremati podatke. To je nešto što se može
identificirati, npr. student, kupac, proizvođač, polaznik seminara, servisiranje auta...
Svaki entitet ima svoje karakteristike koje ga jednoznačno ili jedinstveno opisuju, a nazivaju se
atributi. Na primjer, atributi kuće su kućni_broj, visina, širina, vrijednost ... Za svaki entitet
stvara se tablica ili relacija.

www.algebra.hr
Str. 10 OSNOVE SQL-A I BAZA PODATAKA

Veza je nešto što veže dva ili više entiteta. Razlikujemo tri vrste binarnih veza i to zovemo
funkcionalnost veze:

 1 –1 veza
jednom zapisu iz jedne tablice odgovara jedan i samo jedan zapis iz druge tablice; npr.
veza JE_U_BRAKU_SA između entiteta MUŠKARAC i ŽENA

 1 – n veza (ili 1:∞)


jednom zapisu iz jedne tablice odgovara 0, 1 ili više zapisa iz druge; npr. veza PREDAJE
između entiteta PROFESOR i KOLEGIJ (jedan profesor može predavati više kolegija
na fakultetu)

 m – n veza (ili ∞:∞)


jedan zapis prvog entiteta može biti u vezi s 0, 1 ili više primjeraka drugog entiteta, te
također jedan zapis drugog entiteta može biti u vezi s 0, 1 ili više zapisa prvog entiteta;
npr. veza UPISALA između entiteta OSOBA i SEMINAR
Ako svaki zapis nekog entiteta mora sudjelovati u određenoj vezi, onda kažemo da taj entitet
ima obavezno članstvo u toj vezi. Inače, entitet ima neobavezno članstvo. Na primjer, između
entiteta OSOBA i GRAD zadana je veza ŽIVI_U. OSOBA u vezi ŽIVI_U ima obavezno članstvo
jer svaka osoba mora negdje stanovati.
Rezultat ovog koraka je popisivanje svih veza i entiteta te njihovih atributa.

ER – DIJAGRAMI

ER dijagram je dijagram koji pokazuje relacije između entiteta u sustavu. Kratica 'ER dijagram'
dolazi od engleskih riječi Entity Relationship Diagram.
ER model dovoljno je jednostavan da ga ljudi različitih struka mogu razumjeti. Zato ER shema
služi za komunikaciju projektanta baze podataka i korisnika, i to u najranijoj fazi razvoja baze.
Postojeći DBMS ne mogu direktno implementirati ER shemu, već zahtijevaju da se ona
detaljnije razradi.
Na ER dijagramu entiteti se prikazuju pravokutnicima, a veze među njima rombovima koji su
s entitetima povezani bridovima. Imena entiteta i veza, te funkcionalnost veza, uneseni su u
dijagram. Relacije među entitetima mogu biti unarne, binarne ili n-arne. Ako je relacija unarna
to znači da je broj entiteta koji sudjeluju u relaciji jedan. U binarnoj relaciji sudjeluju dva, a u n-
arnoj više od dva entiteta.
Pogledajmo primjer. Pokušavamo modelirati jedan dio fakultetskih odnosa,
tj. na fakultetu postoje nastavnici koji predaju neke kolegije te studenti koji ih slušaju. ER
dijagram koji prikazuje te odnose nalazi se na sljedećoj slici.
1. poglavlje: RELACIJSKI MODEL BAZE PODATAKA Str. 11

Student je upisao kolegij koji predaje nastavnik, npr. studentica Kristina Naglić je upisala kolegij
„Baze podataka“ koji predaje nastavnik Marko Jurić.
Entiteti su:
STUDENT s atributima BR INDEKSA, IME STUDENTA, ADRESA, SPOL ...
KOLEGIJ s atributima BR KOLEGIJA, NASLOV, SEMESTAR ...
NASTAVNIK, s atributima IME NASTAVNIKA, BR KABINETA ...
Veze su:
UPISAN s atributom DATUM UPISA.
PREDAJE bez atributa. KOLEGIJ ima obavezno članstvo.
Kreiranje ER dijagrama je iterativan proces, što znači da kako bismo došli do konačne verzije,
moramo nacrtati više „probnih“ verzija, tj. više puta probati dok ne dobijemo odgovarajući zapis.
Kada se skupi iskustva, broj probnih dijagrama se smanjuje. Nakon što dobijemo ER dijagram,
pristupit ćemo izradi same baze. Baza se iz ER dijagrama dobiva pretvorbom dijagrama u
tablice.

RELACIJSKI MODEL
Godine 1970. dr. Edgar F. Codd objavio je rad u kojem govori o „relacijskom modelu podataka
za velike, dijeljene banke podataka“. Taj je model danas široko prihvaćen kao model za
relacijsku bazu podataka. Tijekom nekoliko slijedećih godina u IBM-ovu istraživačkom centru
razvijen je sustav pod nazivom System R koji se temeljio na tom modelu.
Što znači da je DBMS relacijski?
Relacijski model baze podataka zasnovan je na ideji da se cjelokupni skup podataka koji
želimo da baza prati razdijeli na pravokutne tablice tzv. relacije.
Svaka relacija ima svoje ime po kojem je razlikujemo od ostalih u istoj bazi. Jedan stupac
relacije obično sadrži vrijednost jednog atributa (za entitet ili vezu), pa zato stupac
poistovjećujemo s atributom. Atribut ima svoje ime po kojem ga razlikujemo od ostalih u istoj
relaciji. Vrijednosti jednog atributa čine podaci istog tipa. Dakle, definiran je skup dopuštenih
vrijednosti za atribut, koji se zove domena atributa. Vrijednost atributa mora biti jednostruka i
jednostavna (ne da se rastaviti na dijelove). Vrijednost atributa nije uvijek obvezna za unos.
Jedan redak relacije predstavlja jedan zapis entiteta.

www.algebra.hr
Str. 12 OSNOVE SQL-A I BAZA PODATAKA

Neka svojstva tablice u relacijskom modelu su:

 tablica je skup zapisa u bazi podataka

 tablica sadrži više stupaca

 svaki stupac ima jedinstven naziv

 svaki redak predstavlja jedan zapis nekog entiteta

 vrijednost nekog podatka dobije se na presjeku odgovarajućeg retka i odgovarajućeg


stupca – u polju

Danas je činjenica da se RDBMS korisiti u većini komercijalnih sustava. Preostaje još pitanje
zašto je RDBMS bolji od ostalih modela? Prvo, pokazalo se da su i mrežni i hijerarhijski modeli
usko vezani uz implementaciju baze, a relacijski model nije, pa je relacijski model popularniji
izbor (kada je nešto usko vezano uz implementaciju, veliki problem postaju naknadne izmjene
u strukturi, što uvelike otežava održavanje i proširivanje baze). Drugo, i mrežni i hijerarhijski
model uspostavljaju vezu između zapisa pomoću dodatnih struktura (pokazivači ili poveznice),
a relacijski uspostavlja vezu među zapisima na temelju vrijednosti koje ti zapisi sadrže, npr.
tablice Polaznici i Tečajevi povezane su preko vrijednosti stupca Tečaj. Pa ako nas zanima
koji je naziv tečaja koji pohađa Kristina Naglić, trebamo pogledati odgovarajući stupac Tečaj u
tablici Polaznici, zapamtiti šifru (O12), te u tablici Tečajevi potražiti redak sa tom šifrom. Dobit
ćemo da je Kristina upisala tečaj Administrator baze podataka.
Glavna prednost relacijskoga modela u tome je što vrlo efikasno rješava dva velika problema
koja se javljaju kod pohrane podataka: redundanciju (ponavljanje) i nekonzistentnost
podataka.
1. poglavlje: RELACIJSKI MODEL BAZE PODATAKA Str. 13

Polaznici i tečajevi
Šifra Ime Mjesto Šifra Naziv tečaja
polazni polaznika stanovan tečaja
ka ja
1 Ana Milić Zagreb P01 Osnove rada PC
računala
2 Sanja Split P02 Microsoft Word
Tarak
3 Mladen Osijek D01 SQL - osnove
Gork
4 Ivana Split O01 Računalni operator –
Matkić uredsko poslovanje
4 Ivana Split D05 Osnove i teorija C++
Matkić
5 Marina Osijek O02 Specijalist poslovne
Anić primjene računala
6 Ivica Limac Split P01 Osnove rada PC
računala

U ovom primjeru imamo duple podatke o mjestu stanovanja Ivane Matkić i dva puta zapisanu
njezinu šifru, ime i prezime. Zamislimo da sada svatko od npr. 10000 polaznika upiše po
nekoliko tečajeva, koliku bismo hrpu nepotrebno dupliciranih podataka dobili! Ali, nije to sve:
što ako se Ivana preseli iz Splita u Varaždin? Onda moramo locirati sva pojavljivanja Ivane
Matkić u tablici (koja sada ima više od npr. 40.000 redaka), te promijeniti Split u Varaždin. Zar
ne bi bilo bolje da smo morali tu informaciju promijeniti samo na jednome mjestu?
Kod takvih i sličnih problema pomaže nam postupak koji nazivamo normalizacijom.
Sljedeći korak u stvaranju relacijskog modela jest da u svakoj tablici definiramo polje primarnog
ključa.

PRIMARNI KLJUČ

Primarni ključ je podatak (ili više podataka) koji razlikuje jedan zapis od drugoga. Po njemu
gledajući, svi su zapisi različiti. Dakle, primarni ključ je vrijednost stupca koja na jedinstven
način određuje neki redak.
Pretpostavimo da u sustavu imamo dva polaznika tečajeva istoga imena i prezimena. Kako
ćemo znati koji od ta dva polaznika ide na seminar SQL – osnove, a koji na Osnove rada PC
računala? Kako ih razlikovati?
Rješenje je u definiranju primarnoga ključa.
Primjerice u našoj tablici polaznika stupac Šifra polaznik' na jedinstven način određuje neki
redak (ime i prezime se može ponoviti, mjesto stanovanja također, pa nema govora o
jedinstvenosti).
Primarni se ključ javlja u praksi – na primjer JMBG, ISBN knjige, poštanski broj, bar_kod
proizvoda ...
Polje primarni ključ čini jedinstvenim svaki zapis u tablici i time ih međusobno distancira. U
relacijskim je bazama obavezno definiranje primarnoga ključa za svaku tablicu.

www.algebra.hr
Str. 14 OSNOVE SQL-A I BAZA PODATAKA

Tečajevi
Šifra
tečaja Naziv tečaja
P01 Osnove rada PC računala
P02 Microsoft Word
D01 SQL - osnove
O01 Računalni operator – uredsko poslovanje
O02 Specijalist poslovne primjene računala
O03 Grafički dizajner

Primarni ključ može sadržavati jedno ili više polja. Ako se sastoji od više polja dopušta se
ponavljanje nekih, ali ne i svih polja koja čine primarni ključ.

Napomena: Polja primarnih ključeva u tablicama su obično masnije (Bold) otisnuta.

PRETVORBA ENTITETA I VEZA U RELACIJE

Pretvorba entiteta vrši se tako da svaki atribut ima svoj stupac u tablici, a u retke upisujemo
primjerke tog entiteta i nazivamo ih zapisima (records). Tako dakle, pretvaramo entitet u
relaciju, tj. tablicu.
Pretvorba veza je malo kompleksnija:
Ako u vezi 1 – N postoji obavezno članstvo, onda entitetu na strani N dodajemo jedan atribut
i to primarni ključ entiteta na strani 1. Taj atribut nazivamo stranim ključem.
Ako u vezi 1 – N ne postoji obavezno članstvo, veza postaje nova tablica s atributima. Primarni
ključ jednog i drugog entiteta (tj. ta dva atributa zajedno) tvori primarni ključ nove tablice.
Veza M – N uvijek postaje nova tablica. Naime, ona se ne može direktno ostvariti, pa se razbija
u dvije 1 – N veze.
1. poglavlje: RELACIJSKI MODEL BAZE PODATAKA Str. 15

PRIMJER VEZE 1-1:


Neka se u jednoj tablici nalaze imena i prezimena pacijenata s osobnim podacima i adresama,
a u drugoj tablici podaci o dijagnozi na očnom odjelu. Te dvije tablice povezane su relacijom
1:1. Jednom pacijentu odgovara samo jedna dioptrija, jer nije moguće da jedan pacijent ima
dvije različite dioptrije.

PRIMJER VEZE 1-N:


U tablici Polaznici Ana Milić će se, primjerice, pojaviti samo jednom. Njena šifra broj 1 u toj će
se tablici pojaviti samo jednom. No, Ana može upisati puno različitih tečajeva, pa će se u tablici
Upisi njezina šifra pojaviti više puta.

PRIMJER VEZE M-N:


U ovom bismo primjeru htjeli direktno spojiti tablice Polaznici i Tecajevi. Naime, jedan polaznik
iz tablice Polaznici može se prijaviti na 0,1,2,... n tečajeva iz tablice Tecajevi. U isto vrijeme na
samo jedan tečaj upisano je
0,1,2,... m polaznika. Ako bismo htjeli direktno povezati tablice uvodeći jedno novo polje koje
je strani ključ u tablicu Tecajevi došlo bi do problema redundancije (ponavljanja) podataka o
tečajevima. Kako bismo izbjegli taj problem uvodimo novu tablicu Upisi koja čuva podatke o
upisu polaznika na tečaj.

www.algebra.hr
Str. 16 OSNOVE SQL-A I BAZA PODATAKA

NORMALIZACIJA
Normalizacija je proces organiziranja podataka s ciljem minimalnog dupliciranja podataka, tj.
proces kreiranja efikasne, pouzdane i fleksibilne baze podataka. Taj se postupak temelji na
matematički dokazanim tvrdnjama, što znači da ćemo, budemo li ga slijedili, kao rezultat
sigurno dobiti dobru bazu podataka (naravno, kao i sve drugo, i ovaj se postupak može loše
provesti i dovesti do loših rezultata, no to se rijetko događa).
Kako tablicu sa slike 4 možemo dovesti u dobro stanje, tj. normalizirali? Dovoljno je prethodnu
tablicu razbiti na tri nove. Jednu koja bi popisala polaznike, drugu koja bi popisala kolegije i
treću, relacijsku tablicu, koja bi povezala prve dvije.

Polaznici
Šifra Ime Prezime Mjesto
polaznika polaznika polaznika stanovanja
1 Ana Milić Zagreb
2 Sanja Tarak Split
3 Mladen Gork Osijek
4 Ivana Matkić Split
5 Marina Anić Osijek
6 Ivica Limac Split

Tečajevi Upisi
Šifra Naziv tečaja Šifra Šifra
tečaja polazni tečaja
P01 Osnove rada PC računala ka
P02 Microsoft Word 1 P01
N01 SQL – osnove 2 P02
O01 Računalni operator – uredsko 3 N01
poslovanje 4 O01
O02 Specijalist poslovne primjene 5 O02
računala 6 P01
O03 Grafički dizajner

Ako Ivana želi upisati još jedan tečaj, tu ćemo informaciju jednostavno dodati kao novi redak
u tablicu UPISI, a ostale tablice nećemo dirati. Ako se Ivana želi preseliti u Varaždin, tu ćemo
informaciju promijeniti samo na jednome mjestu, u tablici POLAZNICI. Jasno je da smo time
dobili puno, pogotovo u pogledu fleksibilnosti, integriteta podataka i efikasnosti.
Do ovakvih rezultata dolazi se konzistentnom primjenom pravila koja se nazivaju normalne
forme.
Postoji 6 normalnih formi:
Prva normalna forma (1NF)
Druga normalna forma (2NF)
Treća normalna forma (3NF)
Boyce-Coddova normalna forma (BCNF)
Četvrta normalna forma (4NF)
Peta normalna forma (5NF)
1. poglavlje: RELACIJSKI MODEL BAZE PODATAKA Str. 17

1NF zahtijeva da svaka vrijednost u stupcu koja se pojavljuje bude atomarna i da svi reci imaju
isti broj polja. 1NF zapravo govori da se kao jedna vrijednost ne smije pojaviti skup podataka.
Pravila prve normalne forme krše se najčešće tako da, primjerice, imate u jednom polju i ime i
prezime polaznika, što komplicira stvari već prilikom sortiranja zapisa po npr. prezimenima.
Rijetko kada se dogodi da tablica nije u 1NF, jer nam nekako iskustvo i intuicija odmah daju
„dobru stvar“.
2NF zahtijeva da bude zadovoljena 1NF, te da svi reci budu jednoznačno određeni i potpuno
ovisni o primarnome ključu. Primjerice u prvoj tablici stupci Šifra tečaja i Naziv tečaja nemaju
veze s primarnim ključem Šifra polaznika. Naravno, tečajevi postoje neovisno o polaznicima,
postoji samo veza među njima (i to tek kada polaznik upiše neki tečaj).
3NF zahtijeva da bude zadovoljena 2NF, te da ne postoje tzv. tranzitivne ovisnosti o
primarnome ključu, tj. svi stupci koji nisu primarni ključ moraju biti neovisni jedni o drugima. To
znači da se ne smije dogoditi da neki podatak ovisi o nekome drugom, koji pak ovisi o
primarnome ključu. To se nama dogodilo u prvoj tablici: ime tečaja ovisi o šifri tečaja koja pak
ovisi o šifri polaznika. Najočitije kršenje treće normalne forme predstavljaju izračunata polja –
problem ažuriranja podataka. Primjerice, u jednoj tablici postoje polja Cijena i Količina, a mi
želimo pomnožiti te podatke i umnožak sačuvati u tablici. Problem se javlja ako se promijene
Cijena ili Količina za neki proizvod jer se polje Ukupno automatski ne ažurira.
BCNF otprilike zahtijeva da, ako postoji stupac o kojem je neki drugi ovisan, onda on mora biti
ključ u tablici. Ako je neka relacija u BCNF, onda je i u 3NF (naravno, i u 2NF i u 1NF), ali
postoje situacije kada je relacija u 3NF, a nije u BCNF.
4NF i 5NF se u praksi rijetko koriste, čak se i BCNF ne koristi tako često jer se u većini situacija
možemo „snaći“ i problem riješiti drukčije. Naravno, idealno bi bilo dovesti bazu u 5NF, ali je s
praktičnog stajališta to često nepotrebno. Naime, razbijanjem baze na mnogo malih tablica
usporava se čitanje s medija, što nekad može biti lošije rješenje od nenormalizirane tablice.
Osoba koja implementira bazu trebala bi isprobati i na temelju iskustva zaključiti dokle treba
provesti normalizaciju.

www.algebra.hr
Str. 18 OSNOVE SQL-A I BAZA PODATAKA

ZADACI ZA VJEŽBU
ZADATAK 1.1
Neka tvrtka sadrži nekoliko odjela u kojima zapošljava radnike. Svaki odjel ima šefa koje je
ujedno i radnik poduzeća. Kreirajte ER dijagram, te ga pretvorite u tablicu i na kraju
normalizirajte.
ZADATAK 1.2
Trgovina ima nekoliko skladišnih mjesta po kojima grupira svoje proizvode. Npr. cigle i crijepovi
idu na jedno skladišno mjesto, drvena građa (daske, grede ...) na drugo skladišno mjesto.
Svako skladišno mjesto ima nekoliko radnika koji na njemu rade i svako ima svog voditelja. Na
temelju danog ER dijagrama kreirajte normalizirane tablice.

ZADATAK 1.3
Kreirajte ER dijagram, a zatim i normalizirane tablice potrebne za poslovanje jedne videoteke.
Videoteka članovima izdaje članske iskaznice, te se na temelju članskog broja osoba
identificira kako bi mogla posuditi filmove. Filmovi su po policama složeni po pripadajućim
žanrovima. Videoteka ima definiran cjenik za izdavanje hit filma, filma koji nije hit te starog
filma. Jedan film može biti na DVD-u i na VHS-u. Film se posuđuje na rok od jednog dana i
ako ga član ne vrati u navedeno vrijeme, zaračunava mu se zakasnina.
2. poglavlje: SQL JEZIK

U ovom poglavlju naučit ćete:

SQL ključne riječi

čitanje sintaksne dijagrame

tipovi podataka SQL Servera

kreiranje baze podataka i objekata

mijenjati objekata baze podataka

brisati baze podataka i objekata

kreiranje ograničenja u bazi


Str. 20 OSNOVE SQL-A I BAZA PODATAKA

MALO POVIJESTI
Već smo spomenuli System R, koji se temelji na Codde-ovu relacijskom modelu, a koji je
početkom 1970-ih godina implementirao IBM. Oni su za jezik kojim će razgovarati sa sustavom
kreirali SEQUEL (engl. Structured English Query Language) koji je dizajniran za manipulaciju
podataka pohranjenih u System R. Akronim SEQUEL kasnije je skraćen na SQL zbog
autorskih prava na ime SEQUEL koje je imala neka avionska tvrtka.
Godine 1978. IBM je demonstrirao korisnost i upotrebljivost sustava i razvio razne
implementacije, od kojih je danas najpoznatija DB2 (razvijena 1983. godine). Kako to biva,
tvrtka pod imenom Relational Software (danas Oracle Corporation) već je 1979. godine izdala
komercijalnu verziju (dvije godine prije nego što je IBM uspio izdati svoju komercijalnu verziju).
Nakon toga mnoge su tvrtke izdale vlastite verzije.
Sam SQL je standardiziran 1986. godine kod ANSI (engl. American National Standards
Institute), a 1987. kod ISO (engl. International Organization for Standardization). Standard je
s vremenom doživljavao razne revizije.

Napomena: ANSI je u svome dokumentu dao službeno izgovaranje riječi SQL kao „ess kyoo
ell“ (es kju el), mada danas dosta korisnika i dalje koristi izraz „sequel“.

Sam standard nije besplatan, već ga se može kupiti od ISO ili ANSI organizacija.
Iako su SQL definirale i ANSI i ISO organizacije, postoje mnoga proširenja i varijacije tog
standarda. Većina tih proširenja vlasništvo su nekih tvrtki, primjerice Oracle Corporationa koje
su ih nazvale PL/SQL, a Sybase i Microsoft Transact-SQL (kraće T-SQL). Isto tako, često se
događa da ta komercijalna proširenja ne podržavaju neka osnovna svojstva zadana
standardom, npr. svaka implementacija ima vlastitu varijaciju zapisivanja vremena i datuma
(npr. DATE i TIME tipovi podataka). Rezultat svih tih proširenja i varijacija činjenica je da
jednom napisane SQL naredbe za neki sustav nije lako prenijeti na neki drugi, tj. za takvo treba
provesti brojne izmjene na izvornim naredbama. Mnogo je razloga zbog kojih postoje te razlike:

 složnost i veličina SQL standarda znači da većina proizvođača baza ne implementira u


potpunosti taj standard

 standard ne specificira ponašanje baze u nekoliko ključnih područja (npr. način


indeksiranja), prepuštajući odluku implementaciji standarda

 semantički standard (značenje riječi) nije precizan, pa postoje dvosmislenosti

 svaki proizvođač baze ima mnogo postojećih korisnika, pa će tamo gdje baza ne poštuje
standard, korisnici teško prihvatiti promjenu, tj. na koju će se i proizvođač teško odlučiti

Danas najpopularnije implementacije su slijedeće (složeno bez ikakvog redoslijeda):

Proizvođač Proizvod
Microsoft MS SQL Server
IBM Corporation DB2
Oracle Corporation Oracle
IBM Corporation Informix
MySQL AB MySQL
2. poglavlje: SQL JEZIK Str. 21

Sybase Inc. Sybase SQL Server


Hewlett Packard Co. Allbase/SQL
Cincom Supra
Microsoft Corporation MS Access

Poznati softverski paketi za rad s bazama podataka

Na internetu možete pronaći mnogo informacija o svima njima i razne usporedbe tipa „tko je
jači, bolji, brži...“, te detaljnu povijest svake od njih.

SQL KLJUČNE RIJEČI


SQL jezik sastoji se od nekih riječi na engleskom koje se mogu podijeliti u nekoliko grupa (koje
se ponovo nazivaju jezici):
DCL: Data Control Language – jezik za kontrolu podataka
DML: Data Manipulation Language – jezik za manipulaciju podacima
DDL: Data Definition Language – jezik za definiranje podataka

DDL se sastoji od riječi koje služe kreiranju baze, tablica i ostalih objekata. DCL se sastoji od
riječi koje služe kontroli pristupa podacima, jer nekad nema smisla da bilo tko može raditi na
bazi i vidjeti sve njene djelove. DML se sastoji od riječi koje služe za manipulaciju podacima:
dohvaćanje, prepravljanje postojećih i ubacivanje novih podataka. Bilo kakav rad s objektima
baze izvodi se preko rečenica koje se nazivaju upit (engl. query, čit: kvirii) i sastoje se od
ključnih riječi SQL-a, imena objekata i raznih operatora (primjerice, plus '+' je operator).

DDL KLJUČNE RIJEČI

DDL se sastoji od nekoliko ključnih riječi od kojih su CREATE i DROP najosnovnije. Neke
DBMS sustavi dodaju i svoje, npr. ALTER.

CREATE kreira neki objekt u bazi (npr. tablicu)


DROP briše postojeći objekt (često nepovratno) iz baze
ALTER dopušta promjenu postojećeg objekta

Primjeri:

CREATE TABLE zaposlenici

DROP TABLE zaposlenici

ALTER TABLE zaposlenici ...

www.algebra.hr
Str. 22 OSNOVE SQL-A I BAZA PODATAKA

DCL KLJUČNE RIJEČI

DCL se koristi za autorizaciju i dopušta korisniku baze koji ima pristup do nekog objekta da
radi s njim.

GRANT Daje ovlasti korisniku za rad s objektima baze


REVOKE briše ili smanjuje ovlasti korisnika na objektima baze

Primjeri:

GRANT neko_pravo ON objekt TO korisnik


Daje korisniku korisnik pravo neko_pravo na objektu objekt.
REVOKE neko_pravo ON objekt TO korisnik
Oduzima korisniku korisnik pravo neko_pravo na objektu objekt.

DML KLJUČNE RIJEČI

DML dio se sastoji od najviše ključnih riječi i može ga se podijeliti na tri manja dijela. U glavnom
se dijelu nalaze:

INSERT ubacuje retke u postojeću tablicu


UPDATE mijenja vrijednosti postojećeg retka
MERGE spaja podatke iz više tablica.
ponekad se koristi u kombinaciji s INSERT i UPDATE.
DELETE briše postojeće retke iz tablice
TRUNCATE nije standardna, ali je uobičajena. briše sve podatke iz tablice

U dijelu za rad s transakcijama (ako one postoje) nalaze se sljedeće ključne riječi:

BEGIN WORK ili START TRANSACTON ili BEGIN TRANSACTION označava početak
transakcije
COMMIT ili END WORK ili END TRANSACTON označava kraj transakcije
ROLLBACK vraća stanje u ono koje je bilo kada se zadnji put dogodio COMMIT
ili ROLLBACK

I zadnja grupa (mada ne najmanje važna) sastoji se od samo jedne ključne riječi: SELECT. Ona
je najkorištenija ključna riječ SQL-a i služi za dohvaćanje nekih redaka iz tablice.
Pomoću nje se opisuje rezultantni skup podataka koji želimo dobiti, ali ne i točan slijed fizičkih
operacija nužnih da bi se do njega došlo. Taj dio posla, uključujući i optimizaciju SELECT upita,
prepušta se DBMS-u koji pomoću optimizacijskoga programa (često zvanog query optimizer)
kreira najbolji mogući plan za izvedbu koraka potrebnih da bi se došlo do traženog rezultata.
Uz ključnu riječ SELECT vezano je još nekoliko ključnih riječi:

FROM označava iz koje tablice treba dovatiti podatke


WHERE označava koje retke treba dohvatiti
GROUP BY slaže dobivene retke u grupe prema ovoj vrijednosti
HAVING služi da se identificiraju reci, nakon GROUP BY, koje treba dohvatiti
ORDER BY identificira stupac ili stupce po kojima će rezultantni skup biti
sortiran
2. poglavlje: SQL JEZIK Str. 23

Primjeri:

INSERT INTO Polaznici VALUES ( 7, 'Ivo', Markić' )

Ubacuje u tablicu Polaznici šifru i ime i prezime polaznika seminara.

SELECT ime FROM Polaznici

Izabire sva imena iz tablice Polaznici.


Kako je SQL poprilično „velik“, ovo nisu sve njegove ključne riječi, niti ih ima smisla sve
nabrajati. Neke nove naučit ćemo kako budemo razmatrali navedene, a neke na ovom
seminaru nećemo ni dotaknuti. Cilj će nam biti u ostataku ove skripte razmotriti detalje nekih
ključnih riječi i provježbati korištenje najosnovnijih tehnika, tako da do kraja skripte steknemo
temelje za nadogradnju.

www.algebra.hr
Str. 24 OSNOVE SQL-A I BAZA PODATAKA

ČITANJE SINTAKSNIH DIJAGRAMA


Ako koristite Help evo, nekoliko uputa kako čitati sintaksu T-SQL naredbi.
SELECT [ ALL | DISTINCT ]
<lista_podataka>
<lista_podataka> : : =
{*
| { ime_tablice | ime_pogleda | alias_tablice | . *
| { ime_polja | izraz | IDENTITYCOL | ROWGUID } [ [ AS] alias_polja ]
| alias_polja = izraz
} [ , ...n ]
Riječi napisane velikim slovima rezervirane su riječi SQL-a koje treba pisati točno kako je
navedeno.
Riječi napisane nakošeno predstavljaju varijable koje, kada pišete izraz, treba zamijeniti
nazivima objekata ili vrijednostima.
Okomita crta ( | ) razdvaja ponuđene opcije, od kojih je moguće izabrati samo jednu.
Uglate zagrade ( [ ] ) uokviruju stavke koje nisu obvezne, a vitičaste zagrade ( { } ) one koje
jesu.
[ , ...n ] znači da se stavka koja je ispred ovog izraza može ponoviti jednom ili više puta, pri
čemu se pojedine stavke razdvajaju razmacima.
Ime objekta čine četiri dijela:
Ime servera na kojem se nalazi baza podataka
Ime baze podataka u kojoj se nalazi objekt
Ime sheme objekta
Identifikator objekta
Primjer:
Pretpostavimo da server naziva SERV sadrži bazu podataka koja se zove UPISI i koja sadrži
objekt - tablicu čije ime je SEMINARI, a shema tog objekta je zadana shema dbo.
Potpuno ime tog objekta bilo bi: SERV.UPISI.dbo.SEMINARI
Dio navedenih podataka moguće je izostaviti, a izostaviti se mogu oni dijelovi koji nisu nužni
za jednoznačno identificiranje objekta.
SQL Server rezervira određeni broj riječi za vlastitu upotrebu, te njih nije moguće koristiti u
nazivima objekata baze. Primjeri rezerviranih riječi koje koristi SQL Server su SELECT, IF,
THEN, ELSE, UPDATE, IN, BETWEEN...
2. poglavlje: SQL JEZIK Str. 25

TIPOVI PODATAKA
Prije nego što krenemo izrađivati bazu podataka, moramo naučiti još nešto: tipove podataka.
Tip podataka je skup vrijednosti koji može poprimiti i operacije koje su definirane na
tom skupu vrijednosti.

Što to zapravo znači? Ako uzmemo prirodne brojeve (1,2,3 ... ), te provedemo na njima
poznate operacije zbrajanja, oduzimanja, dijeljenja i množenja, prema definiciji, prirodni brojevi
su tip podataka. Slično možemo napraviti i s realnim brojevima. Isto tako, i sa slovima, npr.
skup vrijednosti čine sva mala slova (a-z), sva velika slova (A-Z), te interpunkcije (npr. !, ?, .,
,, ', " ...). Operacije mogu biti, primjerice, slaganje u niz (pa dobijemo riječi) i slično. Opet ćemo
dobiti tip podataka.
Naravno, postoji nekoliko problema. Pokušamo li prikazati cijele brojeve u računalu, ispadne
da računalo može prikazati samo konačno mnogo brojeva, tj. postoji najveći cijeli broj koji se
može prikazati. A što ako nam treba veći? Kod realnih brojeva, uz problem najvećeg, postoji i
problem najmanjeg prikazivog broja, jer nakon decimalne točke može biti jako mnogo
znamenki. A što je sa slovima? Hrvatski jezik sadrži neke specijalne grafeme, njemački svoje,
češki svoje... Kako to uopće zapisati u računalu, tj. predstaviti kao jedan skup?
Svi se ti problemi u računalima rješavaju dogovorom (naravno, tih dogovora ima nekoliko, a
mi ćemo se držati standardnog iz SQL-a). Primjerice, za cijele brojeve neke normalne veličine
dogovoreno je da se zapisuju s 32 bita, tj. 4 bajta. Posljedica tog dogovora je da se mogu
zapisati brojevi od 0 do 232-1, tj. od 0 do 4294967295 (ili ako uzmemo i negativne, od -231 do
231 -1). U većini situacija to je sasvim dovoljno, ali ako želimo npr. prikazati državni proračun
pomoću 4 bajta, u tome nećemo uspjeti.
Slijedi tablica nekih standardnih tipova i njihovih raspona prikazivih u računalu. Potrebno je
zapamtiti neke, barem otprilike, kako se ne bi dogodilo da za neki stupac u tablici odredimo
krivi tip podataka pa da u nj ne možemo zapisati željeni podatak.
Prije tablice nekoliko napomena. Kao što smo već spomenuli, svaki RDBMS nije baš točna
implementacija SQL standarda, pa tako postoje odstupanja. Mi ćemo se najviše oslanjati na
Microsoftov izbor jer je na svim računalima instaliran Microsoft Access, te Microsoft SQL
Server. Ovo nije ograničavajući faktor. Naime, većinu stvari koje ćemo raditi jednostavno je
prebaciti na bilo koju drugu implementaciju.
Drugo, nećemo koristiti sve moguće tipove, jednostavno ih je previše, a nema potrebe da se
za sada opterećujemo s njima.
Treće, neki se tipovi zapisuju u računalu tako da pola mjesta za kodiranje ide u negativne
brojeve, jedno mjesto za nulu i ostatak za pozitivne. Kako se u tom slučaju mora zapisati i
predznak, imamo jedno mjesto manje za unos svih kombinacija brojeva. Primjerice ona 32 bita
trošimo ovako: 1 bit za predznak, ostalih 31 za zapis broja. To znači da možemo zapisati
brojeve od -231 do 231-1. Ovaj minus jedan zapisujemo jer se mora negdje ugurati i nula, pa
je uobičajeno da se uzme jedan od pozitivnih.
I četvrto, svaki tip podataka ima jednu specijalnu vrijednost koja znači odsutnost podatka, tj.
da na to mjesto nije upisana nikakva vrijednost.
Naziv za takvo nešto riječ je NULL. Znači, kada neznamo vrijednost za neki stupac, kažemo
NULL kako bismo signalizirali odsutnost informacije. Zašto uopće postoji takvo što? Ponovo
se vratimo u ona 32 bita za zapis cijeloga broja. Svaka moguća kombinacija predstavlja neki

www.algebra.hr
Str. 26 OSNOVE SQL-A I BAZA PODATAKA

broj iz danog raspona. A opet, postoje situacije kada jednostavno neznamo koja je trenutna
vrijednost nečega (to ćemo saznati kasnije). Onda nemamo bolji izbor od neke specijalne
vrijednosti. Možda bi za cijeli broj odgovarala 0 (nula), ali kako bismo onda znali da taj podatak
stvarno nije nula?
Slijede tablice većine tipova (od kojih su neki specifični za Microsoft SQL Server 2019).

Cjelobrojni, točno1 prikazivi


Naziv Raspon
tinyint 0 do 255
smallint od -215 do 215- 1, tj. od -32.768 do
32.767.
int od -231 do 231-1 tj. od -2.147.483.648
do 2.147.483.647
bigint od -263 do 263-1, tj. od -
9.223.372.036.854.775.808 do
9.223.372.036.854.775.807.
bit cjelobrojni podatak koji sadrži ili 0 ili 1
(nula ili jedan)
decimal, broj fiksne preciznosti od -1038 +1 do
numeric 1038 –1
money valuta s preciznošću na 4 decimale od -
263 do 263-1
smallmoney valuta s preciznošću na 4 decimale od –
214.748,3648 do +214.748,3647

Približno prikazive vrijednosti


Naziv Raspon
float od -1,79 * 10308 do 1,79 * 10308
real od -3,40 * 1038 do 3,40 * 1038

Datum i vrijeme
Naziv Raspon
datetime prikazuje datum i vrijeme od 01.01.1753
do 31.12.9999. s preciznošću od 3.33
milisekunde
smalldatetime prikazuje datum i vrijeme od 01.01.1900
do 6.6.2079. s preciznošću od jedne
minute
date prikazuje datum od 01.01.0001. do
31.12.9999. s preciznošću od 1 dana

1To znači da se broj može prikazati na računalu točno takav, bez ikakvih gubitaka. Obično „dobro prođu“ cijeli
brojevi, ali s realnima se zapadne u probleme. Primjerice kako bismo zapisali 1/3, tj. 0.3333... ovdje ima
beskonačno mnogo trojki.
2. poglavlje: SQL JEZIK Str. 27

time prikazuje vrijeme u obliku


0:00:00.0000000 (hh:mm:ss.nnnnnnn) s
preciznošću od 100 nanosekundi
datetime2 prikazuje datum i vrijeme od 01.01.0001
00:00:00.0000000 do 31.12.9999
23:59:59.9999999 s preciznošću od 100
nanosekundi
datetimeoffset prikazuje datum i vrijeme po obliku
sličan je tipu datetime2 uz dodatak
vremenske zone, oblika 01.01.0001
00:00:00.0000000 [+/-]00:00
(dd.mm.yyyy hh:mm:ss.nnnnnnn [+/-
]hh:mm)

Znakovi
Naziv Raspon
char Služi za prikazivanje standardnih ASCII2
(ne-Unicode)znakova fiksne dužine3.
Maksimalna dužina je 8.000 znakova
varchar Isto kao i gore, samo dužina nije fiksna
nego varijabilna4. Maksimalna dužina je
također 8.000 znakova. Može imati max
argument koji znači da je maksimalna
dužina 2^31-1 bajtova.
nchar Unicode znakovi, fiksna dužina.
Maksimalna dužina je 4.000 znakova
nvarchar Unicode znakovi, varijabilna dužina.
Maksimalna dužina je 4.000 znakova.
Može imati max argument koji znači da
je maksimalna dužina 2^31-1 bajtova.
text Ne-Unicode znakovi, varijabilne dužine.
Maksimalna dužina 2.147.483.647
znakova
ntext Unicode znakovi, varijabilne dužine,
maksimalna dužina 1.073.741.823
znakova

2 American Standard Code for Information Interchange – američki standardni kôd za razmjenu informacija.
Standardno se koristi na računalima. Nema podršku za hrvatske znakove, mada postoji puno ekstenzija koje
hrvatske znakove mogu „ugurati“na odgovarajuća mjesta. Danas se polako prelazi na standard poznat kao
Unicode.
3 Prilikom definiranja moramo reći koliko će biti dugačko to polje. Znači da ćemo u to polje moći upisati najviše

toliko znakova, ali bez obzira koliko ih upisali, uvijek se troši točno toliko prostora.
4 Uvijek će biti zapisano samo onoliko znakova koliko ih se stvarno i koristi.

www.algebra.hr
Str. 28 OSNOVE SQL-A I BAZA PODATAKA

Binarne vrijednosti
Naziv Raspon
binary Binarni podatak fiksne dužine od n
bajtova, gdje je n vrijednost između 1 I
8.000.
varbinary Isto kao i gore, samo dužina nije fiksna
nego varijabilna. Može imati max
argument koji znači da je maksimalna
dužina 2^31-1 bajtova.
image Binarni podatak varijabilne dužine od 0
do 2^31-1 (2.147.483.647) bajtova.

Ostali tipovi podataka


Naziv Napomena
cursor Tip podataka za varijable ili za izlazne
parametre uskladištenih procedura koji
sadrže referencu na kursor.
sql_variant Tip podataka u koji se mogu pohraniti
vrijednosti različitih tipova podataka koje
SQL Server 2019 podržava osim
varchar(max), nvarchar(max), text, ntext,
varbinary(max), image, timestamp,
sql_variant i korisnički definirani tipovi.
table Specijalni tip podataka koji se može
koristiti za spremanje rezultirajućeg
skupa za kasnije korištenje. Najčešće se
koristi za privremeno pohranjivanje
skupa zapisa vraćenih kao rezultat
tablične funkcije.
timestamp Tip podataka koji automatski generira
jedinstvene binarne brojeve.
uniqueidentifi Globalni jedinstveni identifikator (GUID)
er
xml Tip podataka u koji se pohranjuju XML
podaci.
geometry Tip podatka u koji se pohranjuju planarni
podaci (XY koordinate)
geography Tip podatka u koji se pohranjuju
elipsoidni podaci (zemljopisne
kooridante)

Napomena: U sljedećoj verziji Microsoft SQL Servera bit će uklonjeni sljedeći tipovi podataka:
ntext, text i image, pa ih stoga izbjegavajte koristiti i u ovoj verziji.

ASCII kodiranje radi tako da se svaki znak kodira s 8 bitova (1 bajt), te je tako moguće 256
kombinacija. (Zapravo se kodira sa 7 bitova pa je broj kombinacija 128, ostalih 128 kombinacija
2. poglavlje: SQL JEZIK Str. 29

je proširenje specijalnim znakovima: crticama, strelicama i sl.). Ali, u tih 256 kombinacija ne
mogu se ugurati svi mogući nacionalni znakovi. Unicode, da bi mogao obuhvatiti sve (čak i
kineske i japanske) znakove na planetu, proširuje kodiranje na 16 bitova (2 bajta), pa tako
dobijemo 65.536 kombinacija. Sasvim dovoljno za vecinu potreba. Naravno, kako je Unicode
znak dvostruko veci, to moze zapisati upola manje znakova, pa stoga dolazi do smanjenje s
8000 na 4000.
Sada imamo znanje potrebno da bismo se upustili se u rad s bazom podataka.

KREIRANJE I BRISANJE OBJEKATA BAZE


Da bismo uopće mogli kreirati tablicu, prvo trebamo kreirati bazu podataka. Za to nam je
potreban alat (program) kojim ćemo pristupati bazi podataka jer, sjetite se, s bazom razgovara
DBMS, a onda mi razgovaramo s DBMS- om. Koristit ćemo jedan od alata koji dolazi sa SQL
Serverom, a zove se SQL Server Management Studio, mada bismo sve ovo mogli raditi i u
Microsoft Accessu ili bilo kojem sličnom alatu.

KREIRANJE BAZE I TABLICE

Napravit ćemo bazu podataka za polaznike i tečajeve sa stranice 14. Utipkajte i izvršite:
CREATE DATABASE Upisi
GO

Ovo kreira bazu podataka Upisi na disku.


Dakle, naredbom CREATE DATABASE kreiramo novu bazu podataka. Naredbe mogu biti
natipkane i velikim i malim slovima, nema razlike. Uobičajeno je da se SQL ključne riječi pišu
velikim, a ostalo malim slovima, radi preglednosti, pa ćemo se toga držati. Naredba GO nije
dio SQL-a, nego na taj način Management Studio razlikuje blokove naredbi, kojih može biti
više.
Sada kada imamo bazu, u njoj možemo kreirati tablice. Za kreiranje tablice koristi se naredba
CREATE TABLE čija je djelomična (i vrlo skraćena) sintaksa:
CREATE TABLE (
naziv_stupca tip,
...
)

S vremenom ćemo tu definiciju proširivati. Za početak, kreirajmo tablicu Polaznici:


USE Upisi
CREATE TABLE polaznici (
sifra INT,
ime NCHAR(50),
prezime NCHAR(50),
mjesto_stanovanja NCHAR(25)
)
GO

www.algebra.hr
Str. 30 OSNOVE SQL-A I BAZA PODATAKA

Primijetite da nismo koristili hrvatske grafeme i da smo imena stupaca spojili pomoću znaka
podvučeno (_) (engl. underscore). U imenu stupca možete koristiti i razmak, ali onda morate
ime stupca ograditi uglatim zagradama (npr. [ime prezime]), ali to samo otežava tipkanje i nije
preporučljivo.

Naredba USE kaže Management Studiju da sljedeće naredbe izvrši unutar zadane baze, a ne
neke druge. Primjerice mogli smo prije ovoga raditi na nekoj drugoj bazi, pa mu moramo reći
da se prebaci iz jedne baze u drugu.
Na ovaj način kreirajte i preostale dvije tablice, s time da obratite pažnju na to da Šifra tečaja
nije broj, nego kombinacija slova i brojki, pa će, npr., tip biti nchar(10).

Promjene na objektima vrše se pomoću naredbe ALTER. Možemo mijenjati bazu (gdje se
nalazi, gdje se nalazi njena log datoteka ...), tablicu (dodavati, brisati, mijenjati stupce...),
poglede i druge objekte baze. Ponovo ćemo prikazati samo djelomičnu sintaksu.
U tablicu Polaznici dodajemo još jedan stupac, npr. broj_telefona kao cijeli broj:
USE Upisi
ALTER TABLE polaznici
ADD broj_telefona INT
GO

Možda nije najbolje broj telefona pamtiti kao cijeli broj, zgodnije ga je upamtiti kao tekst jer
sadrži crtice, a možda i zagrade, pa promijenimo tip stupca u tekstualni:
USE Upisi
ALTER TABLE polaznici
ALTER COLUMN broj_telefona CHAR(20)
GO

BRISANJE BAZE I NJENIH OBJEKATA

Naredbom DROP brišemo neki objekt iz baze, a naredbom DROP DATABASE brišemo cijelu
bazu podataka.
Pobrišimo stupac broj_telefona iz tablice polaznici:
USE Upisi
ALTER TABLE polaznici
DROP COLUMN broj_telefona
GO

Isto tako možemo izbrisati i cijelu tablicu:


USE Upisi
DROP TABLE polaznici
GO

Ili cijelu bazu:


2. poglavlje: SQL JEZIK Str. 31

USE master
DROP DATABASE Upisi
GO

Pripazite, jer brisanje je nepovratno.

Napomena: Kod brisanja baze treba izabrati neku drugu bazu, tako da ona koju brišemo ne
bude zauzeta.

Ovdje smo izabrali bazu master koja je jedna od specijalnih baza kod SQL Servera.

SISTEMSKE BAZE SQL SERVERA

Kako svaki DBMS mora pratiti koje sve baze sadrži, koje tablice koja baza sadrži, koji korisnik
smije pristupati kojem objektu, to je ovdje riješeno pomoću četiri sistemske baze:

Naziv Opis
master Sadrži sve sistemske informacije SQL Servera,
uvijek pazite da imate arhiviranu kopiju master
baze.
tempdb Sadrži sve privremene objekte koji su potrebni u
radu SQL Servera.
model Predložak za sve nove baze. Kada smo kreirali
bazu Upisi, zapravo je napravljena kopija ove baze.
msdb Služi za rad SQL Server Agent programa (on pamti
i izvršava poslove koje treba obaviti: npr.
automatsko arhiviranje baze).

Prilikom kreiranja nove baze podataka u SQL Serveru, kopira se predložak za novu bazu, baza
model. Informacije o novokreiranoj bazi podataka zapisuju se u sistemsku bazu master. Sve
ove baze na disku su zapisane kao najmanje dvije datoteke: primarna datoteka (.mdf) i log
datoteka (.ldf). One se nalaze u instalacijskoj mapi SQL Servera, podmapa Data.
Prilikom kreiranja baze, SQL Server kreira datoteku pod nazivom koji smo dali na koji doda
_Data.mdf. Za bazu Upisi, napravi datoteku s imenom Upisi_Data.mdf. Uz tu datoteku kreira i
datoteku Upisi_Log.ldf. Naravno, ove nazive možete kontrolirati prilikom zadavanja naredbe
CREATE DATABASE. Više o tim opcijama specijalno za SQL Server možete naći u njegovom
Help-u.

OGRANIČENJA

Za kraj pogledajmo još jedan važan dio vezan uz kreiranje baza, a to su ograničenja (engl.
constraints). Ograničenja služe osiguranju integriteta baze podataka. To znači da mi, prilikom
kreiranja baze (ili kasnije pomoću naredbe ALTER), za neki stupac uvedemo pravila po kojima
se podaci unose u taj stupac. SQL Server koristi pet kategorija ograničenja.

www.algebra.hr
Str. 32 OSNOVE SQL-A I BAZA PODATAKA

2.5.4.1 NOT NULL

NOT NULL ograničenje koristi se kada želimo spriječiti unošenje NULL vrijednosti u stupac.
Recimo, nema smisla dodati nekog zaposlenika u tablicu ako mu istovremeno ne upišemo i
šifru, ona mora biti odmah generirana.
USE Upisi
DROP TABLE polaznici
GO
CREATE TABLE polaznici (
sifra INT NOT NULL,
ime NCHAR(50)NOT NULL,
prezime NCHAR(50) NOT NULL,
mjesto_stanovanja NCHAR(25)
)
GO

Sada nam stupci sifra, ime i prezime imaju zabranu unosa NULL vrijednosti, tj. prilikom
dodavanja novog retka u tablicu obavezno moramo unijeti sva tri polja. Mjesto_stanovanja
može sadržavati i NULL vrijednost, tj. kao da smo eksplicitno napisali:

mjesto_stanovanja NCHAR(25) NULL

Znači, ako ne napišemo ništa, NULL je pretpostavljena vrijednost ovog ograničenja.

2.5.4.2 CHECK

CHECK ograničenje koristi se kada želimo ograničiti raspon vrijednosti koji se može unijeti u
neki stupac. Npr., šifra može biti broj između 1 i 1000. To bismo rekli ovako:
USE Upisi
DROP TABLE polaznici
GO
CREATE TABLE polaznici (
sifra INT NOT NULL,
ime NCHAR(50) NOT NULL,
prezime NCHAR(50) NOT NULL,
mjesto_stanovanja NCHAR(25)
CONSTRAINT chk_sifra CHECK ( sifra BETWEEN 1 AND 1000 )
) GO

Sada smo, pomoću dviju ključnih riječi CONSTRAINT i CHECK, uveli zabranu unosa vrijednosti
koja ne pada u raspon 1 do 1000. Izraz nakon CHECK mora biti u zagradi. Ključne riječi
BETWEEN i AND kasnije ćemo detaljnije objasniti.

Ovo smo ograničenje mogli uvesti i ovako:


USE Upisi
DROP TABLE polaznici
2. poglavlje: SQL JEZIK Str. 33

GO
CREATE TABLE polaznici (
sifra INT NOT NULL
CHECK (sifra BETWEEN 1 AND 1000),
ime NCHAR(50) NOT NULL,
prezime NCHAR(50) NOT NULL,
mjesto_stanovanja NCHAR(25)
) GO

Razlika je u tome što u prvom slučaju kreiramo imenovanu instancu ograničenja koju kasnije
možemo referencirati, a na drugi način dobijemo neimenovano ograničenje.

2.5.4.3 UNIQUE

UNIQUE ograničenje koristi se kada želimo da se u navedeni stupac neka vrijednost može
unijeti najviše jednom. NULL se smatra posebnom vrijednosti, pa slijedi da u tom stupcu
smijemo imati najviše jednu NULL vrijednost.

2.5.4.4 PRIMARY KEY

PRIMARY KEY ograničenje koristi se kada želimo da dani stupac bude primarni ključ tablice.
Primarni ključ jedinstveno određuje jedan redak u tablici, pa očito on mora biti UNIQUE. Ali za
razliku od UNIQUE ograničenja ne možemo unijeti NULL vrijednost.

Svaka bi tablica trebala imati primaran ključ. Kako u tablici može postojati više stupaca koji
jedinstveno određuju neki redak (takav stupac onda zovemo ključ kandidat), svaka njihova
kombinacija može biti primaran ključ, tj. primaran ključ može biti i više stupaca, što ovisi o
potrebama i samom problemu. Preporuka je da primaran ključ bude što kraća, cijelobrojna
vrijednost. U našem primjeru, očito primaran ključ treba biti stupac sifra (za ime i prezime
može se dogoditi da budu jednaki). Ograničenje PRIMARY KEY kreiramo ovako:

USE Upisi
DROP TABLE polaznici
GO
CREATE TABLE polaznici (
sifra INT NOT NULL
CHECK (sifra BETWEEN 1 AND 1000)
PRIMARY KEY,
ime NCHAR(50) NOT NULL,
prezime NCHAR(50) NOT NULL,
mjesto_stanovanja NCHAR(25)
) GO

Prilikom dodavanja novog retka u tablicu moramo unijeti jedinstvenu, ne- NULL vrijednost za
stupac sifra.

www.algebra.hr
Str. 34 OSNOVE SQL-A I BAZA PODATAKA

2.5.4.5 FOREIGN KEY

FOREIGN KEY (strani ključ) ograničenje označava relaciju između tablica, tj. vrijednost u nekom
stupcu tablice bira se iz nekog stupca druge tablice. Zapravo, strani ključ u tablici pokazuje na
ključ kandidat u drugoj tablici. Ako redak sadrži strani ključ, onda na to mjesto ne možemo
ubaciti vrijednost (osim NULL) koja se ne pojavljuje kao vrijednost u drugoj tablici. Primjerice,
tablicu upisi sa stranice 15 možemo kreirati ovako (ako smo kreirali bazu i tablice polaznici
i tecajevi):
USE Upisi
CREATE TABLE upisi (
sifra_polaznika INT
FOREIGN KEY
REFERENCES polaznici(sifra),
sifra_tecaja CHAR(3)
FOREIGN KEY
REFERENCES tecajevi(sifra),
CONSTRAINT PK_sifre
PRIMARY KEY (sifra_polaznika, sifra_tecaja)
)
GO

Uočimo da u ovoj tablici dva stupca zajedno čine primarni ključ (tj. obe šifre zajedno su
kandidat za ključ), pa takvu stvar moramo reći kao posebnu naredbu.
2. poglavlje: SQL JEZIK Str. 35

ZADACI ZA VJEŽBU
ZADATAK 2.1
Provjerite gdje je instaliran Microsoft SQL Server, locirajte mapu Data, te provjerite postojanje
odgovarajućih datoteka za 4 sistemske baze.
ZADATAK 2.2
Kreirajte bazu podataka iz zadatka 1.1 sa stranice 17 za tvrtku s radnicima iz nekoliko odjela,
te zatim kreirajte odgovarajuće tablice.
ZADATAK 2.3

Kreirajte bazu podataka iz zadatka 1.2 sa stranice 17 za skladište trgovine, te zatim kreirajte
odgovarajuće tablice.
ZADATAK 2.4
Kreirajte bazu podataka iz zadatka 1.3 sa stranice 17 za poslovanje videoteke, te zatim
kreirajte odgovarajuće tablice.
ZADATAK 2.5
Prepravite bazu podataka iz zadatka 2.3 za skladište trgovine s odgovarajućim ograničenjima.
Mjesta skladišta trgovina mogu biti samo Zagreb, Rijeka ili Sisak. Kreirajte pripadajuće
primarne i strane ključeve u tablicama.

www.algebra.hr
3. poglavlje: RAD S PODACIMA U BAZI

U ovom poglavlju naučit ćete:

ubacivanje podataka u tablice

dohvaćanje podataka iz tablica

sortiranje podataka u tablicama

postavljanje kriterija u upitima

operatori u upitima
Str. 38 OSNOVE SQL-A I BAZA PODATAKA

UBACIVANJE PODATAKA U TABLICU


Nakon što smo napravili bazu podataka, te kreirali nekoliko tablica, te tablice treba popuniti
podacima. Ovo je prilika da pogledamo kako se baza ponaša kada tijekom unosa podataka
prekršimo neko ograničenje.
Radimo s tablicama za polaznike, tečajeve i upise. Nove se vrijednosti u tablicu ubacuju
naredbom INSERT. Naredba insert ima nekoliko oblika, od kojih ćemo za sada pogledati
sintaksu jedne:

INSERT INTO ime_tablice [ (popis_stupaca) ]

VALUES ( popis_vrijednosti )

Ovdje je ime_tablice naziv tablice u koju ubacujemo novi redak, uglate zagrade označuju
opcionalan argument, tj. popis_stupaca se može, ali ne mora, pojaviti. Popis_stupaca služi
imenovanju pojedinih stupaca, a korisitmo ga onda kada ne želimo ubaciti vrijednosti u sve
stupce ili želimo ubaciti nekim drugim redosljedom. Popis_vrijednosti je popis stvarnih
vrijednosti koje želimo ubaciti u tablicu. Njihov redoslijed i broj mora odgovarati onom zadanom
u popis_stupaca ili ako popis_stupaca nije naveden, navodi se redoslijed kojim su kreirani
stupci u tablici. U tom slučaju moramo navesti sve vrijednosti.
USE Upisi
INSERT INTO polaznici VALUES ( 1, 'Ana',' Milić', 'Zagreb')
GO

Primijetimo nekoliko stvari: stupac sa šifrom je integer tipa, pa šifru navodimo direktno. Ime je
tipa NCHAR(50), pa ga navodimo u jednostrukim navodnicima. Sve što se nalazi unutar
jednostukih navodnika biti će točno tako zapisano u polje. Ovo pravilo vrijedi za sve znakovne
tipove (ili, popularnije, stringove). Znači, kada god trebamo SQL-u reći neki niz znakova,
koristimo jednostruke navodnike.
Još je važno primijetiti da moramo paziti na dužinu niza znakova koji unosimo: ako bismo
pokušali unijeti string duži nego što smo rekli prilikom kreiranja tablice, došlo bi do greške.
Da bismo pogledali što smo ubacili, iskoristiti ćemo naredbu SELECT:

USE Upisi
SELECT * FROM polaznici
GO

Ovo ispisuje malo prije dodani redak. Ovom se naredbom možemo koristiti kada god želimo
pogledati sve što ima zapisano u nekoj tablici. Kasnije ćemo detaljno obraditi SELECT.

Pokušaj izostavljanja neke vrijednosti vodi na grešku, npr:


USE Upisi
INSERT INTO polaznici VALUES ( 2, 'Sanja Tarak')
GO
3. poglavlje: RAD S PODACIMA U BAZI Str. 39

Znači, moramo navesti sve dijelove, jer nismo popisali na što se odnose one dvije vrijednosti.
Možemo postupiti na više načina - ili navoditi sve vrijednosti ili davati popis_stupaca ili
umjesto vrjednosti koju neznamo navesti NULL.

USE Upisi
INSERT INTO polaznici VALUES ( 2, 'Sanja', 'Tarak', NULL)
GO
--ili
USE Upisi
INSERT INTO polaznici (sifra, ime, prezime) VALUES ( 2, 'Sanja','Tarak')
GO

Oba načina daju isti rezultat.


Probajmo sada prekršiti neko od zadanih ograničenja. Primjerice, ubacimo vrijednost koja već
postoji u prvi stupac (koji ima ograničenje primarnoga ključa).
USE Upisi
INSERT INTO polaznici (sifra, ime, prezime) VALUES (1,'Pero','Perić')
GO

Kako smo vrijednost 1 za šifru već ubacili, prijavit će se greška jer nije moguće ubaciti duplu
vrijednost. To je, naime, zabranjeno ograničenjem i izvršavanje naredbe će se prekinuti.
Ako pokušamo:
USE Upisi
INSERT INTO polaznici (sifra, ime,prezime)VALUES (X, 'Pero', 'Perić')
GO

Ponovno dobijemo pogreški da X u ovom kontekstu ništa ne znači.


Pokušaj ubacivanja pogrešnog tipa podataka ponekad uspije, a ponekad ne, ovisno o tipu.
Nećemo sada prolaziti kroz sve moguće kombinacije, nego samo pogledati nekoliko
zanimljivijih slučajeva:
USE Upisi
INSERT INTO polaznici
VALUES ( 3.1415, 'Mladen', 'Gork', NULL)
GO

INSERT INTO polaznici VALUES ( 4, 42, NULL)


GO

Rezultat je da oba slučaja prolaze, iako bi bolje bilo da do njih nije došlo. U prvom slučaju
vrijednost 3.1415 je pretvorena u 3 i tako ubačena u bazu, a u drugom je vrijednost 42
pretvorena u CHAR(42) i tako ubačena u bazu. Zašto se događaju takve pretvorbe? Kod
kreiranja baze rekli smo da će tip za šifru biti INT, a pokušavamo ubaciti realan broj. Svaki od

www.algebra.hr
Str. 40 OSNOVE SQL-A I BAZA PODATAKA

njih je na drukčiji način kodiran u računalu, pa ako bismo primijenili jedno kodiranje, a čitali u
drugom, očito je da bsmoi dobili pogrešne rezultate.
U tablicu možemo umetnuti i unaprijed zadane vrijednosti:
USE Upisi
INSERT INTO polaznici DEFAULT VALUES
GO

DOHVAĆANJE PODATAKA IZ TABLICE


Nakon što je popunjeno nekoliko tablica, podatke iz njih nekako treba dohvatiti. Primjerice, u
našoj maloj bazi zanimat će nas tko je sve upisao neki tečaj, koliko je polaznika upisalo koji
tečaj, postoji li tečaj koji nitko nikada nije upisao, je li neki polaznik upisao više od dva tečaja i
slično.

Naredba koju ćemo koristiti je SELECT. Sama naredba je ponovno dovoljno kompleksna, pa
ćemo pogledati samo neke njezine dijelove. Za početak, malo sažetija sintaksa glasi:
SELECT
[ DISTINCT ]
[ TOP n ]
popis_stupaca
[ INTO nova_tablica ]
FROM ime_tablice
[ WHERE izraz_za_trazenje ]
[ GROUP_BY izraz_za_grupiranje ]
[ HAVING izraz_za_trazenje ]
[ ORDER BY izraz_za_sortiranje [ ASC | DESC ] ]

Jedini obvezni dijelovi su ključne riječi SELECT i FROM, te popis_stupaca i ime_tablice.

Najosnovniju verziju već smo vidjeli:


USE Upisi

SELECT * FROM polaznici


GO

Ovdje smo za popis_stupaca koristili zvjezdicu (*), što znači: „svi stupci“. Ekvivalentna puna
verzija glasi:
USE Upisi
SELECT sifra, ime,prezime, mjesto_stanovanja FROM polaznici
GO
3. poglavlje: RAD S PODACIMA U BAZI Str. 41

Možemo promijeniti imena stupaca koja će biti prikazana:


USE Upisi
SELECT sifra AS 'Šifra',
ime AS 'Ime osobe',
prezime AS 'Prezime osobe',
mjesto_stanovanja AS 'Mjesto stanovanja'
FROM polaznici
GO

Ovo ne mijenja imena stupaca u samoj bazi, nego u rezultantnom skupu stupci nose nove
nazive. Ovo je osobito zgodno kada trebamo izračunati nekakav izraz:
USE Upisi
SELECT sifra AS 'Šifra',
ime AS 'Ime osobe',
prezime AS 'Prezime osobe',
mjesto_stanovanja AS 'Mjesto stanovanja',
sifra * 5 AS 'Šifra puta pet'
FROM polaznici
GO

SORTIRANJE

Želimo li dobivene podatke sortirati, SELECT naredbi dodajemo ORDER BY naredbu. Primjerice,
ako želimo podatke složiti prema imenu osobe:
USE Upisi
SELECT * FROM polaznici ORDER BY ime
GO

Možemo dodatno specificirati kako želimo podatke sortirati: uzlazno ili silazno. Za to koristimo
dvije kratice: ASC i DESC. Primjerice, složimo podatke silazno, prema mjestu stanovanja:
USE Upisi
SELECT * FROM polaznici ORDER BY mjesto_stanovanja DESC
GO

Ili uzlazno, po šifri:


USE Upisi
SELECT * FROM polaznici ORDER BY sifra ASC
GO

ASC i DESC dolaze od engleskih riječi ascending (rastuće) i descending (silazno). Unaprijed
izabrana vrsta sortiranja jest rastući redoslijed, pa se riječ ASC ne mora navoditi.

www.algebra.hr
Str. 42 OSNOVE SQL-A I BAZA PODATAKA

GRUPIRANJE

Želimo li ispisati sva mjesta stanovanja, to možemo učiniti na nekoliko načina. Prvi je
korištenjem ključne riječi DISTINCT. Drugi je korištenjem ključne riječi GROUP BY.
USE Upisi
SELECT DISTINCT mjesto_stanovanja FROM polaznici
GO

ili
USE Upisi
SELECT mjesto_stanovanja FROM polaznici
GROUP BY mjesto_stanovanja
GO

U prvom slučaju rekli smo samo da se izaberu različiti reci koji zadovoljavaju uvjetu. Znači,
DBMS je prvo izabrao sva mjesta stanovanja, pa onda samo različite. NULL vrijednost je
posebna vrijednost i ako ih ima više, prikazala bi se samo jedna. U drugom slučaju izabrali
smo sva mjesta stanovanja i onda kreirali grupe prema mjestu stanovanja. Prva razlika između
ovih dviju naredbi jest ta da DISTINCT izabire različite vrijednosti na temelju svih vraćenih
stupaca, tj. da je umjesto stupca mjesto_stanovanja stavljena *, dobili bismo sve zapise (jer
nam stupac sifra osigurava da svaki redak bude jedinstven). GROUP BY, pak, ne možemo
koristiti sa * jer on služi tome da se iz rezultantnog skupa podataka grupiraju isti, te vrati samo
jedan iz svakog tako dobivenog skupa. To omogućava dobivanje dodatnih informacija o tim
grupama. Kasnije ćemo vidjeti koje dodatne mogućnosti pruža naredba GROUP BY.

TOP N

Ponekad nas ne zanimaju svi rezultati, nego samo prvih nekoliko. To postižemo dodavanjem
ključne riječi TOP nakon koje navedemo cijeli broj koji govori koliko redaka treba prikazati:

USE Upisi
SELECT TOP 3 * FROM polaznici
GO

Korištenjem naredbe TOP N PERCENT dobivamo prvih n% rezultata.

USE Upisi
SELECT TOP 3 PERCENT * FROM polaznici
GO

Ako bismo htjeli vidjeti sve iste vrijednosti u zadnjim zapisima skupa rezultata, koristit ćemo
izraz WITH TIES:

USE Upisi
SELECT TOP 3 PERCENT WITH TIES * FROM polaznici
GO
3. poglavlje: RAD S PODACIMA U BAZI Str. 43

POSTAVLJANJE KRITERIJA

Ponekad želimo dobiti samo neki podskup informacija, a ne sve moguće vrijednosti. Primjerice,
želimo vidjeti tko je sve upisan u bazu polaznika, a živi u Splitu:
USE Upisi
SELECT * FROM polaznici WHERE mjesto_stanovanja = 'Split'
GO

Koristimo ključnu riječ WHERE kojoj dodamo uvjet na temelju kojega treba tražiti i filtrirati
podatke.
Najjednostavniji oblik tog uvjeta je: naziv_stupca = vrijednost

Ako, pak, želimo zadati kompliciranije uvijete, npr. da mjesto stanovanja bude Split ili Zagreb,
Split i Zagreb i slično, moramo pogledati nekoliko operatora.

OPERATORI

Operatora ima nekoliko vrsta, pa ćemo ovdje pogledati većinu postojećih.


Jedna grupa operatora je grupa aritmetičkih operatora, od kojih su nam poznati operator
zbrajanja (+), oduzimanja (-), množenja (*), dijeljenja (/) i jedan manje poznati: modulo (%).
Primijetimo da svakog od ovih operatora ima više vrsta, ovisno o tipu podataka koje koristi:
plus između dva cijela broja nije isti plus kao onaj između dva realna broja. Iako je ovdje razlika
slabo vidljiva, ona postaje očita ako se sjetimo kako se zapisuju brojevi u računalu. Velika
razlika se vidi kod operatora dijeljanja (/). Ako su u pitanju realni brojevi, rezultat dijeljenja
približan je realni broj (npr. 1.0/3.0 ≈ 0.3333...), a ako su u pitanju cijeli brojevi, onda je
operacija dijeljenja zapravo operacija cjelobrojnog dijeljenja: 10/4 = 2 (4 idu u 10 dva puta).
Kod takvog dijeljenja ponekad treba znati koliki je ostatak pri dijeljenju, pa tome služi operator
modulo (%), tj. 10%3 = 1 (ostatak pri dijeljenju 10 s 3 je 1). Ovaj je operator zgodan kada
trebamo saznati je li neki broj djeljiv nekim drugim ili je li neki broj paran ili neparan. Broj n će
biti paran ako pri dijeljenju s dva daje ostatak nula, tj. možemo pitati koliko je n%2 i ako je
odgovor nula, tada znamo da je taj broj paran. U suprotnom nije.
Za primjer, prikažimo tablicu Polaznici i dodajmo stupac koji pokazuje je li šifra paran broj ili
nije:
USE Upisi
SELECT sifra, ime, sifra%2 AS 'Parna šifra' FROM polaznici
GO

Logički operatori (i, ili, ne)


Sada malo logike. Često moramo postaviti zadatak oblika: ispiši sve polaznike koji su upisali
seminar „Osnove rada PC računala“ i koji su upisali seminar „Microsoft Word“. A možda nas
zanima i sljedeće: ispiši sve polaznike koji su upisali seminar „Osnove rada PC računala“ ili
koji su upisali seminar 'Microsoft Word'. U prvom slučaju nas zanimaju svi polaznici koji su
upisali oba seminara, a u drugom oni koji su upisali ili jedan ili drugi seminar (može i oba).

www.algebra.hr
Str. 44 OSNOVE SQL-A I BAZA PODATAKA

Za početak, krenimo s jednostavnijim upitom. Ispiši sve polaznike kojima je šifra 1, 3 ili 5:
USE Upisi
SELECT * FROM polaznici
WHERE sifra=1 OR sifra=3 OR sifra=5
GO

Ispišimo iz tablice Upisi sve šifre polaznika koji su upisali seminare „Osnove rada PC računala“
(šifra P01) i „Microsoft Word“ (šifra P02):
USE Upisi
SELECT * FROM upisi
WHERE sifra_tecaja = 'P01' OR sifra_tecaja = 'P02'
GO

Ispišimo iz tablice Polaznici imena i prezimena onih polaznika koje ne žive u Splitu:
USE Upisi
SELECT ime, prezime FROM polaznici
WHERE NOT mjesto_stanovanja = 'Split'
GO

Ispišimo iz tablice Polaznici imena i prezimena onih polaznika koje žive u


Splitu i šifra im je veća od 2:
USE Upisi
SELECT ime, prezime FROM polaznici
WHERE mjesto_stanovanja = 'Split' AND sifra > 2
GO

Ovdje smo koristili operator uspoređivanja (>), pa pogledajmo koje sve operatore imamo u toj
grupi.
Operatori uspoređivanja
= jednako
> strogo veće
< strogo manje
>= veće ili jednako
<= manje ili jednako
<> različito

Operatori koji slijede nisu u skladu sa standardom, nego predstavljaju proširenje MS SQL
Servera:
!= različito
!> ne veće
!< ne manje
3. poglavlje: RAD S PODACIMA U BAZI Str. 45

Uskličnik (!) se obično u ovakvim situacijama čita kao negacija, npr. != čitamo nije jednako. Svi
oni vraćaju istinu ili laž (ponekad mogu vratiti i nepoznato, npr. kada nisu u stanju izračunati
neki dio izraza). Kako se prikazuje, rezultat ovisi o postavkama DBMS-a, ali je uglavnom
prihvaćeno da se za istinu prikazuje 1, a za laž 0.
Operator IN
Operator IN se koristi kada imamo neki skup vrijednosti i kada želimo pronaći sve vrijednosti
koje odgovaraju tom skupu. Primjerice, upit od maloprije - ispiši sve polaznike kojima je šifra
1, 3 ili 5 - može se iskazati i jednostavnije:
USE Upisi
SELECT * FROM polaznici WHERE sifra IN (1,3,5)
GO

Možemo izabrati i sve ostale, tj. sve one kojima šifra nije 1, 3 ili 5:
USE Upisi
SELECT * FROM polaznici WHERE sifra NOT IN (1,3,5)
GO

Operator IN ima još jedan zgodan način korištenja. Lista koja se daje operatoru IN ne mora
se ručno utipkati, već se može dobiti pomoću nekog upita. Primjerice, zanimaju nas imena i
prezimena polaznika koji su upisali tečaj P01. Šifre polaznika koji su upisali tečaj P01 nalaze
se u tablici Upisi, a imena se nalaze u tablici Polaznici. Te su dvije tablice vezane relacijom na
temelju šifre polaznika.
USE Upisi
SELECT ime, prezime FROM polaznici
WHERE sifra IN (
SELECT sifra_polaznika FROM upisi
WHERE sifra_tecaja = 'P01'
)
GO

Znači, prvo smo u unutrašnjem upitu izabrali šifre polaznika koji su upisali tečaj P01, a onda
rezultat tog upita iskoristili u listi za IN.
Operator LIKE
Operator LIKE služi za uspoređivanje znakova (tj. stringova ili nizova znakova). Koristi se tako
da se zada određeni uzorak koji se zatim uspoređuje s danim stringom, i vraća se istina ili laž.
Sintaksa naredbe LIKE je:
izraz_za_trazenje [ NOT ] LIKE uzorak

www.algebra.hr
Str. 46 OSNOVE SQL-A I BAZA PODATAKA

Sintaksa koristi znakove za označavanje (engl. wildcard characters) prikazane u sljedećoj


tablici.

Znak Značenje Primjer


% bilo koji string koji se sastoji mjesto_stanovanja LIKE '%i%' će
od nitijednog ili više znakova izabrati sve gradove koji sadrže slovo i
(koje se može nalaziti na bilo kojem
mjestu)
_ podcrtano – bilo koji znak ime LIKE '_a%' će izabrati sva imena
(samo jedan!) kojima je prvo slovo bilo koje, drugo
slovo a i ostatak proizvoljan
[] bilo koji znak iz raspona npr. ime LIKE '[MS]a%' će izabrati sva
[a-d] ili skupa [abcd] imena koja počinju sa M ili S, imaju na
drugom mjestu a i ostatak proizvoljan
^ bilo koji znak koji nije iz ime LIKE '[^AM]%' će izabrati sva
raspona npr. [^a-d] ili skupa imena koja NE počinju slovima A ili M i
[^abcd] ostatak proizvoljan

Potražimo u tablici tečajeva sve tečajeve koje sadrže riječ Račun:


USE Upisi
SELECT naziv FROM tecajevi WHERE naziv LIKE '%Račun%'
GO

U ovom slučaju primjetimo da se ne razlikuju mala i velika slova! To se ponašanje može


podesiti na nivou DBMS-a (ili na nivou baze), a detalje potražite u literaturi.
Potražimo u tablici Polaznici sve polaznike čije prezime završava na ak ili sa rk:
USE Upisi
SELECT ime FROM polaznici WHERE ime LIKE '%[ar]k'
GO

Prvo može doći bilo što, pa onda jedno od slova a ili r, pa slovo k, nakon kojega nema više
ništa.
I za kraj, izaberimo iz tablice Polaznici sva mjesta stanovanja koja u svome nazivu ne sadrže
slovo s:
USE Upisi
SELECT DISTINCT mjesto_stanovanja FROM polaznici
WHERE mjesto_stanovanja NOT LIKE '%s%'
GO
3. poglavlje: RAD S PODACIMA U BAZI Str. 47

Operator BETWEEN

Operatorom BETWEEN specificiraju se rasponi koje testiramo. Primjerice, zanimaju nas svi
polaznici kojima je šifra u rasponu [2..4], tj. zanimaju nas šifre 2, 3 i 4:
USE Upisi
SELECT * FROM polaznici WHERE sifra BETWEEN 2 AND 4
GO

Sintaksa operatora BETWEEN je:

izraz_za_testiranje [ NOT ] BETWEEN pocetni_izraz AND krajnji_izraz

Prioriteti

Kada računalo dobije neki upit mora znati kojim će redoslijedom početi rješavati zadani upit (tj.
mora znati koji je operator jači), pa stoga postoji strogo definirana tablica prioriteta operatora.
U slučaju da u upitu imamo nekoliko operatora istog nivoa, izvršavanje ide slijeva nadesno.
Par zagrada '(' i ')' je najjači, tj. zagrade imaju najjači prioritet. Ako na istom nivou upita ima
više parova zagrada, rješava se slijeva nadesno, a ako su ugniježđene, rješavanje kreće od
najugnježđenije zagrade.

 *, /, %

 +, -

 =, >, <, >=, <=, <>, !=, !<, !>

 ^, &, |

 NOT

 AND

 BETWEEN, IN, LIKE, OR, ALL, ANY, SOME


U tablici su popisani samo oni operatori koje koristimo. Detalje i ostale operatore pogledajte u
literaturi.
Operatori koje podržava SQL Server su:

OPERATOR ZNAČENJE
+ Zbrajanje
- Oduzimanje
* Množenje
/ Dijeljenje
% Ostatak cjelobrojnog dijeljenja (npr.13%3=1 – ostatak kada
se 13 podijeli s 3)
= Dodjeljivanje vrijednosti
+ Spajanje znakovnih nizova
+ Pretvaranje broja u pozitivnu vrijednost
- Pretvaranje broja u negativnu vrijednost
~ Davanje unarnog komplementa broja
& AND primijenjen na bitove
| OR primijenjen na bitove

www.algebra.hr
Str. 48 OSNOVE SQL-A I BAZA PODATAKA

^ XOR primijenjen na bitove


= Usporedba
> Veće od
< Manje od
>= Jednako ili veće od
<= Jednako ili manje od
<> Različito od
!= Različito od
!> Nije veće od
!< Nije manje od
ALL Istina ako je u skupu usporedbi svaka istinita
AND Istina ako dva logička izraza imaju istinitu vrijednost
OR Istina ako jedan od dva logička izraza ima istinitu vrijednost
NOT Negacija drugih logičkih operatora
ANY Istina ako je u skupu više usporedbi istinita barem jedna
EXISTS Istina ako podupit sadrži barem jedan zapis
BETWEEN Istina ako je operand unutar zadanog intervala
IN Istina ako se operand nalazi na zadanoj listi vrijednosti

UPITI NAD VIŠE TABLICA


Ako trebamo pogledati podatke iz više tablica, koristiti ćemo spajanje tablica.
Spajanja ima nekoliko vrsta:

 cross-join

 unutarnje spajanje (inner join)

 lijevo vanjsko spajanje (left outer join)

 desno vanjsko spajanje (right outer join)

 puno vanjsko spajanje (full outer join)


Prva i najjednostavnija verzija spajanja je da spojimo svaki redak iz jedne tablice sa svakim
retkom iz druge. Tako dobivamo cross-join (ili svatko sa svakim).
Spojimo tablice nastavnik i mjesto:
USE fakultet
SELECT * FROM nastavnik, mjesto
GO

Kako tablica nastavnik ima 98 redaka, a tablica mjesto 273 retka, rezultirajuća tablica ima 98
* 273 = 26,754 redaka! Ono što smo dobili i nije baš nešto korisno jer smo za svakog
nastavnika dobili po 273 retka. Ovo spajanje se ponekada naziva i Kartezijev produkt.
Puno korisnija spajanja su vanjska i unutarnja spajanja (engl. inner join i outer join).
3. poglavlje: RAD S PODACIMA U BAZI Str. 49

UNUTARNJE SPAJANJE

Unutarnje spajanje (inner join) je dio SELECT izraza koji dohvaća zapise iz više tablica i daje
jedan skup zapisa kao rješenje upita.
Kako se kod spajanja stupaca iz različitih tablica često dogodi da dva stupca imaju isto ime,
moramo ih na neki način razlikovati. Uobičajeno je da se koristi imenovanje stupaca unutar
tablice: imeTablice.imeStupca. Znači, prvo se navede ime tablice, pa se stavi točka, pa se
navede ime stupca. Na taj smo način jednostavno odredili na koji točno stupac mislimo prilikom
pisanja upita.
PRIMJER: Prikažimo sada imena i prezimena nastavnika s nazivom mjesta u kojemu stanuju.
Lako je izabrati ime i prezime nastavnika, ali u toj tablici ne piše naziv mjesta nego samo poziv
na broj. Stoga te dvije tablice treba spojiti na temelju vrijednosti u stupcima s pozivom na broj.
Primijetimo da je u tablici mjesto poziv na broj primarni ključ, a u tablici nastavnik strani ključ
(tj. postoji relacija među tim dvjema tablicama).
SELECT imeNastavnik AS Ime,
prezNastavnik AS Prezime, nazMjesto AS 'Mjesto gdje živi'
FROM nastavnik
INNER JOIN mjesto ON mjesto.pbr = nastavnik.pbrStan
GO

Koristimo obični SELECT, samo smo ga malo proširili i to tako da smo dali formulu na osnovu
koje treba spojiti tablice Nastavnik i Mjesto. U popisu stupaca odmah naveli sve stupce (iz
obiju tablica) te u FROM dijelu naveli tablicu Nastavnik koja nam je primarna. Nakon toga naveli
smo ključnu riječ JOIN te ime tablice koja sadrži ostatak informacija (tablica Mjesto). Na kraju
smo naveli uvjet na temelju kojega treba spojiti te dvije tablice.
Kako ovo točno funkcionira? Prvo se uzme tablica iz FROM dijela (nastavnik) te se izaberu svi
njeni reci. Nakon toga se u drugoj tablici (iz JOIN dijela, mjesto) traži redak na odgovarajućem
mjestu za svaki redak iz prve tablice koji odgovara uvjetu. Tako spojeni reci ulaze u privremenu
tablicu iz koje se konačno odabiru stupci koje smo naveli u SELECT dijelu.

Kod ovog oblika spajanja (INNER JOIN) postoji i zastarjela varijanta koja specificira uvjet
spajanja u WHERE dijelu:

USE fakultet
SELECT imeNastavnik AS Ime,
prezNastavnik AS Prezime,
nazMjesto AS 'Mjesto gdje živi'
FROM nastavnik, mjesto WHERE mjesto.pbr = nastavnik.pbrStan
GO

Možda ovo izgleda nešto jednostavnije, ali praksa je pokazala da baš to malo skraćanje
sintakse (manje tipkanja) dovodi do nekih neugodnih situacija. Istina, one se ne događaju baš
često, ali kada se dogode vrlo ih je teško uočiti.
U dosadašnjim primjerima koristili smo skraćenje koje je zgodno kada nema puno stupaca s
istim nazivom. Pogledajmo kako zapravo izgleda upit bez skraćenja:

www.algebra.hr
Str. 50 OSNOVE SQL-A I BAZA PODATAKA

USE fakultet
SELECT nastavnik.imeNastavnik AS Ime,
nastavnik.prezNastavnik AS Prezime,
mjesto.nazMjesto AS 'Mjesto gdje živi'
FROM nastavnik
INNER JOIN mjesto ON mjesto.pbr = nastavnik.pbrStan
GO

Naravno, kada nema stupaca s istim imenima DBMS je u stanju razlikovati koji je stupac iz
koje tablice na temelju njegova imena, pa eksplicitno imenovanje tablica nije potrebno.
Specifikacija imena nekog objekta (u ovom slučaju stupca) u MS SQL Serveru ima razrađeniju
sintaksu nego što smo do sada vidjeli. Puno ime nekog objekta sastoji se od četiri dijela: imena
servera, imena baze, imena vlasnika objekta te imena samog objekta razdvojenih točkama.
Kada bismo pisali puno ime za tablicu mjesto u bazi fakultet na serveru na koji se spajamo,
pisali bismo:
Server.fakultet.dbo.mjesto

Ovdje se Server odnosi na server na koji se spajamo i ovisi o instalaciji,


fakultet se odnosi na ime baze s kojom radimo, dbo na vlasnika baze (dbo dolazi od engleskih
riječi database owner ili vlasnik baze), te zadnje dolazi ime samog objekta. Na ovaj način smo
jedinstveno odredili na koji točno objekt mislimo, te tako možemo referencirati bilo koji objekt
u SQL Serveru.
Kada smo pristupali stupcu, nakon naziva tablice stavili smo točku i naziv stupca, a nismo
pisali ništa prije toga. To je zato što se pretpostavlja da je server onaj na koji smo trenutno
spojeni, ime baze ono koje smo izabrali korištenjem USE naredbe te da je vlasnik dbo. Zato je
dovoljno napisati samo naziv objekta.
Ako se dogodi da u jednom spajanju moramo često pisati puni naziv tablice (ili pogleda), onda
se može uvesti privremeno ime za taj objekt, tj. može se uvesti alias. Alias se uvodi tako da
se nakon imena tablice navede još jedno ime:
... FROM nastavnik n INNER JOIN mjesto AS m ...

Može se korisiti bilo koji oblik: sa ili bez ključne riječi AS. Kada se tako uvede privremeno ime
za objekt, to se ime mora koristiti bilo gdje u upitu:
USE fakultet
SELECT n.imeNastavnik AS Ime,
prezNastavnik AS Prezime,
m.nazMjesto AS 'Mjesto gdje živi'
FROM nastavnik n
INNER JOIN mjesto AS m ON m.pbr = n.pbrStan
GO

Služimo se njime jer korištenje originalnog (starog) imena više nije dopušten (što je i logično
jer smo ime zamijenili novim, pa se objekt sa starim imenom više ne vidi).
3. poglavlje: RAD S PODACIMA U BAZI Str. 51

LIJEVO VANJSKO SPAJANJE

Unutrašnje spajanje radi na temelju uspoređivanja vrijednosti u stupcima. Lijevo vanjsko


spajanje (left outer join) kao rezultantni skup vraća sve retke iz lijeve tablice i odgovarajuće
retke iz desne tablice. Ako neki redak iz lijeve tablice nema odgovarajući redak u desnoj, onda
mu se pridružje NULL redak (redak koji za sve vrijednosti ima NULL).

PRIMJER:
Ispišimo imena i prezimena svih studenata zajedno s ispitima na koje su izašli i ocjenama koje
su dobili. Naravno, bit će studenata koji nisu ni jednom izašli na neki ispit, pa kod njih ne
možemo ispisati šifru ispita:
USE fakultet
SELECT s.imeStud, s.prezStud, i.sifPred, i.ocjena
FROM stud s
LEFT OUTER JOIN ispit i ON i.mbrStud = s.mbrStud
ORDER BY s.mbrStud
GO

DESNO VANJSKO SPAJANJE

Desno vanjsko spajanje (right outer join) kao rezultantni skup vraća sve retke iz desne tablice
i odgovarajuće retke iz lijeve. Ako za neki redak ne postoji odgovarajući, pridružuje mu se NULL
redak.
PRIMJER:
Ispišimo sve predmete i dvorane u kojima se predaje. Kako se neki predmeti ne predaju ovaj
semestar, oni nemaju rezerviranu dvoranu, pa će to biti reprezentirano NULL vrijednostima:

USE fakultet
SELECT r.oznDvorana, r.sat, p.nazPred
FROM rezervacija r
RIGHT OUTER JOIN pred p ON p.sifPred = r.sifPred
GO

POTPUNO VANJSKO SPAJANJE

Potpuno vanjsko spajanje (full outer join) vraća sve retke iz lijeve i sve iz desne tablice tako
da spoji one koji odgovaraju prema kriteriju spajanja, a one koji ne odgovaraju (i iz lijeve i iz
desne tablice) dopunjava NULL vrijednostima.

PRIMJER:
Odaberimo sve studente koji su izašli na ispite i sve predmete. Naravno, bit će studenata koji
nisu izašli ni na jedan predmet, ali i predmeta na koje nitko nije izašao. Da bismo si olakšali
posao, kreirajmo prvo jedan pogled (kreiranje pogleda pogledajte u lekciji „4.4 Pogledi“):
USE fakultet
GO

www.algebra.hr
Str. 52 OSNOVE SQL-A I BAZA PODATAKA

CREATE VIEW StudentiIspiti AS


SELECT s.mbrStud, s.imeStud, i.sifPred, i.ocjena
FROM ispit i
RIGHT OUTER JOIN stud s ON i.mbrStud = s.mbrStud
GO

Zatim, spojimo s predmetima:


USE fakultet
SELECT mbrStud, imeStud, ocjena, p.sifPred, nazPred
FROM StudentiIspiti s
FULL OUTER JOIN pred p ON s.sifPred = p.sifPred
ORDER BY mbrStud ASC
GO

Ovakve se situacije rijetko događaju i teško je naići na priliku kada treba koristiti FULL OUTER
JOIN, ali može se dogoditi.

Za sva spajanja postoje skraćene verzije, pa tako ako napišemo samo JOIN, onda se misli na
INNER JOIN, ako pak napišemo LEFT JOIN, misli se na LEFT OUTER JOIN i slično za ostala
dva vanjska spajanja. Ovdje smo koristili pune verzije zbog potpunosti, a u praksi uglavnom
susrećemo skraćene verzije.
Još se može spajati tablica sa samom sobom, npr. ako želimo ispisati sve organizacijske
jedinice s pripadajućim nadređenim organizacijskim jedinicama (primijetimo da je tablica
orgjed u relaciji sa samom sobom):
USE fakultet
SELECT o1.nazOrgjed AS 'Organizacijska jedinica',
o2.nazOrgjed AS 'Nadređena jedinica'
FROM orgjed o1
INNER JOIN orgjed o2
ON o2.sifOrgjed = o1.sifNadorgjed
GO

Uočimo da je kod postavljanja ON uvjeta bitno tko je prvi, a tko drugi. Ovakav način spajanja
naziva se i samospajanje ili engl. self-join.
3. poglavlje: RAD S PODACIMA U BAZI Str. 53

ZADACI ZA VJEŽBU
ZADATAK 3.1
Popunite i ostale tablice kako je prikazano na stranici 15.
Sve sijedeće zadatke riješite koristeći bazu podataka FAKULTET.
ZADATAK 3.2
Ispišite matični broj, ime i prezime svih studenata. Ime i prezime treba ispisati zajedno, u
jednom stupcu.
ZADATAK 3.3
Ispišite sva imena studenata tako da se ni jedno ne pojavi dva puta. Sortirajte imena silazno
po abecedi.
ZADATAK 3.4
Ispišite matične brojeve studenata koji su položili ispit iz predmeta sa šifrom 146.
ZADATAK 3.5
Ispišite imena i prezimena nastavnika, te njihovu plaću dobivenu formulom: (koeficijent + 0.4)
* 800.
ZADATAK 3.6
Ispišite imena i prezimena nastavnika iz prethodnog zadatka koji imaju plaću manju od 3500
ili veću od 8000.
ZADATAK 3.7
Ispišite imena i prezimena studenata koji su barem jednom pali na ispitu iz predmeta sa šiframa
od 220 do 240.
ZADATAK 3.8
Ispišite imena i prezimena studenata koji su na nekom ispitu dobili 3.
ZADATAK 3.9
Ispišite nazive predmeta na koje ni jedan student nije izašao.
ZADATAK 3.10
Ispišite nazive predmeta na koje je izašao barem jedan student.
ZADATAK 3.11
Ispišite sve podatke o studentima čije ime počinje i završava samoglasnikom.
ZADATAK 3.12
Ispišite sve podatke o studentima kojima ime počinje i završava bilo kojim znakom osim
samoglasnikom.
ZADATAK 3.13
Ispišite sve podatke o studentima kojima ime počinje ili završava samoglasnikom.
ZADATAK 3.14

www.algebra.hr
Str. 54 OSNOVE SQL-A I BAZA PODATAKA

Ispišite sve podatke o studentima kojima ime ili prezime bilo gdje sadrži slova n i k jedno iza
drugog.
ZADATAK 3.15
Ispišite ime i prezime studenta, te naziv i ocjenu za svaki ispit.
ZADATAK 3.16
Ispišite ime i prezime studenta te mjesto i županiju u kojoj su rođeni. Nakon toga dodajte mjesto
i županiju u kojoj stanuju.
ZADATAK 3.17
Ispišite nazive predmeta i organizacijske jedinice kojima pripadaju za one kolegije koji imaju
više od 20 upisanih studenata.
ZADATAK 3.18
Ispišite sve nazive mjesta u kojima barem jedan student stanuje. Imena mjesta smiju se pojaviti
samo jednom.
ZADATAK 3.19
Ispišite nazive mjesta u kojima je barem jedan student i rođen i stanuje. Imena mjesta smiju
se pojaviti samo jednom.
ZADATAK 3.20
Ispišite oznake dvorana i nazive kolegija za one kolegije koji imaju više od 2 sata predavanja
tjedno.
ZADATAK 3.21
Ispišite nazive kolegija i oznake dvorana u kojima imaju rezerviran termin. Ispišite i naziv
organizacijske jedinice kojoj kolegij pripada.
ZADATAK 3.22
Ispišite podatke o nastavnicima koji su ispitivali studente koji stanuju u istoj županiji u kojoj
stanuje i nastavnik.
ZADATAK 3.23
Ispišite podatke o studentima koji studiraju u mjestu različitom od mjesta rođenja, ali koje se
nalazi u istoj županiji u kojoj su i rođeni.
ZADATAK 3.24
Ispišite podatke o studentima i nastavnicima koji imaju ista prezimena.
ZADATAK 3.25
Ispišite podatke o studentima i njihovim mjestima stanovanja za one studente koji su barem
jednom pali na ispitu „Osnove baza podataka“.
ZADATAK 3.26
Ispišite ime i prezime nastavnika, mjesto stanovanja i županiju nastavnika te naziv kolegija za
nastavnike koji su ispitivali studente koji su dobili ocjenu 2 ili 3 iz tog kolegija.
4. poglavlje: SQL - IZMJENE U BAZI
PODATAKA

U ovom poglavlju naučit ćete:

mijenjanje podataka u bazi

brisanje podataka iz baze

naredba SELECT INTO

kreiranje pogleda
Str. 56 OSNOVE SQL-A I BAZA PODATAKA

IZMJENA PODATAKA U TABLICI


Za promjenu postojećih podataka u tablici koristimo naredbu UPDATE. Pojednostavljena
sintaksa naredbe UPDATE je:

UPDATE ime_tablice
SET ime_stupca = nova_vrijednost
[, ime_stupca = nova_vrijednost ... ]
[ WHERE uvjet ]

Npr. promijenimo mjesto stanovanja polaznika iz Zagreb u Samobor:


USE Upisi
UPDATE polaznici
SET mjesto_stanovanja = 'Samobor' WHERE mjesto_stanovanja = 'Zagreb'
GO

Uvjet pod WHERE može vratiti proizvoljan broj redaka, ali može i vratiti sve retke.

Napomena: Ako se ne navede uvjet prema kojem se može odlučiti koji se reci mijenjaju,
promjena se vrši nad svim recima!

BRISANJE PODATAKA IZ BAZE


Brisati se može gotovo sve: podaci iz tablice, cijele tablice, baze ... Zapravo, svi objekti koji
postoje.
Za brisanje podataka iz tablice služi naredba DELETE. Njena sintaksa je:

DELETE FROM ime_tablice [ WHERE uvjet ]

Primjerice, želimo iz tablice Upisi izbrisati podatke o polazniku sa šifrom 6:


USE Upisi
DELETE upisi WHERE sifra_polaznika = 6
GO

Napomena: Ako se ne navede uvjet u WHERE dijelu, brišu se SVI podaci iz tablice.

Ako se zbog povrede referencijalnog integriteta zapis ne može obrisati, DELETE odustaje od
brisanja.
Izraz TRUNCATE TABLE je funkcionalno ekvivalentan izrazu DELETE u kojemu zadajete jednu
tablicu, bez izraza WHERE. Ovo je efikasniji tj. brži način brisanja svih podataka iz jedne tablice,
jer DELETE briše zapis po zapis i za svaki obrisani zapis u dnevnik transakcija upisuje jednu
stavku. TRUNCATE TABLE radi tako da oslobađa sve stranice s podacima koji pripadaju tablici,
pri čemu se samo podaci o operacijama upisuju u dnevnik transakcija.
4. poglavlje: SQL - IZMJENE U BAZI PODATAKA Str. 57

Sintaksa TRUNCATE naredbe je:

TRUNCATE TABLE ime_tablice

Primjerice, želimo izbrisati podatke iz tablice Upisi:


USE Upisi
TRUNCATE TABLE upisi
GO

Izraz TRUNCATE TABLE ima i svoja ograničenja: kad brišete podatke iz tablice koja sadrži polje
tipa identity, brojač koji daje vrijednost za to polje postavlja se u početno stanje (ako treba
sačuvati zadnje stanje brojača, koristite izraz DELETE). Nije moguće izbrisati zapise iz tablice
čije se ime navodi u ograničenju FOREIGN KEY druge tablice (treba koristiti izraz DELETE).

Brisanje tablice ne vrši se naredbom DELETE nego naredbom DROP (hrv. ispustiti). Primjerice,
brisanje (ili možda bolje: ispuštanje) cijele tablice dobijemo naredbom:
USE Upisi
DROP TABLE upisi
GO

Naredba DROP služi i za brisanje drugih objekata, pa treba pisati i ključnu

riječ TABLE. Kod brisanja objekata treba dobro pripaziti jer je brisanje nepovratno, a DBMS
neće dva puta pitati, nego će naredbu odmah izvršiti.
Cijelu bazu podataka Upisi možemo obrisati jednom naredbom, kao što smo vidjeli i prije:
USE master
DROP DATABASE Upisi
GO

Nije loše još jednom upozoriti da ova naredba neće pitati za potvrdu, nego će se odmah izvršiti.
Tako da trebamo biti oprezni s brisanjima, a prije takvih zahvata preporučljivo je napraviti
rezervnu kopiju baze.

KREIRANJE TABLICA NAREDBOM SELECT INTO


Upit SELECT može se iskoristiti i za kreiranje nove tablice i njeno popunjavanje. Znači, umjesto
da kreiramo novu tablicu naredbom CREATE TABLE i onda naredbama INSERT ubacujemo
retke, oba koraka možemo izvršiti odjednom.
Sintaksa:
SELECT lista_polja INTO
ime_nove_tablice FROM
ime_izvorne_tablice [
WHERE uvjet ]
[ GROUP BY izraz ]

www.algebra.hr
Str. 58 OSNOVE SQL-A I BAZA PODATAKA

HAVING uvjet
[ ORDER BY izraz ]

Naredba SELECT INTO uzima rezultate izraza SELECT iz jedne tablice i s njima kreira novu
tablicu.
Moguće je napraviti i privremenu tablicu. Prvi znak naziva tablice mora biti znak hash - #.
Privremene tablice korisne su kada imate pohranjenu proceduru i želite privremeno uskladištiti
određene podatke tijekom izvršavanja te procedure. Kada završite s korištenjem privremenih
tablica, SQL Server ih automatski briše.
Tablice nastale pomoću izraza SELECT INTO nemaju indekse, primarne ključeve, default
vrijednosti i slično, a ako vam oni trebaju, tada tablicu napravite pomoću izraza CREATE TABLE
i zatim je uz pomoć izraza INSERT popunite podacima.

Kreirajmo tablicu Osjecani u kojoj se nalaze podaci samo polaznika iz tablice Polaznici čije je
mjesto stanovanja Osijek:
USE Upisi
SELECT * INTO Osjecani
FROM polaznici
WHERE sifra WHERE mjesto_stanovanja = 'Osijek'
GO

Kreirajmo sada privremenu tablicu Splicani u kojoj se nalaze podaci samo polaznika iz tablice
Polaznici čije je mjesto stanovanja Split:
USE Upisi
SELECT * INTO #Splicani
FROM polaznici
WHERE sifra WHERE mjesto_stanovanja = 'Split'
GO

POGLEDI
Pogled je virtualna tablica koja reprezentira podatke iz jedne ili više tablica. Najviše smisla
ima u suradnji sa sigurnosnim postavkama DBMS-a.
Npr., u nekom se poduzeću vode podaci o zaposlenima i njihovim plaćama. Plaća svakog
zaposlenika povjerljiv je podatak i nema smisla da ga bilo koji korisnik baze može vidjeti. Stoga
se kreiraju pogledi na tablicu koja sadrži te podatke, te se na nju postavi ograničenje na
otvaranje (tj. pregledavanje cijele tablice dopusti se samo npr. voditelju knjigovodstva).
Pogledu se pridruže samo neki stupci, te se njemu dodijeli pravo čitanja tih stupaca iz
originalne tablice. Time smo dobili virtualnu tablicu koja vidi samo neki dio trenutne tablice.
Virtualnu zato što se podaci dohvaćaju iz druge tablice, tj. ona se ne pohranjuje kao zaseban
objekt u bazi. U bazu se pohranjuje samo upit.
Pogled se koristi u sljedećim slučajevima:

 kada želimo ograničiti korisnika tablice na samo neke retke ili stupce
 kada želimo spojiti više stupaca iz različitih tablica tako da izgleda da oni zajedno čine
jednu tablicu
 kada želimo prikazati skupne podatke umjesto detalja
4. poglavlje: SQL - IZMJENE U BAZI PODATAKA Str. 59

Pogledi se kreiraju tako da zadajemo naredbu SELECT:

CREATE VIEW ime_pogleda AS


SELECT select_izraz

Primjerice, u fakultetskoj bazi kreirajmo pogled na predmete, koji ne sadrži koliko je upisano
studenata i kojoj organizacijskoj jedinici pripada:
USE fakultet
GO
CREATE VIEW PopisPredmeta AS
SELECT sifPred AS Šifra, kratPred AS Kratica, nazPred
AS Naziv
FROM pred
GO

Na ovaj smo način kreirali novi objekt u bazi. Taj objekt nadalje možemo promatrati kao tablicu,
tj. gdje god smo do sada u nekom upitu koristili tablicu, možemo korisiti i pogled (postoje
slučajevi kada to nije tako, pa ćemo to i napomenuti):
USE fakultet
SELECT * FROM PopisPredmeta
GO

U ovom slučaju dobit ćemo skraćenu verziju tablice pred po stupcima sa svim recima (nismo
postavili nikakav uvjet WHERE).

Ako u SELECT dijelu kreiranja pogleda navedemo i uvjet WHERE, skraćujemo bazu po recima,
tj. pogled nam služi kao filter podataka. Primjerice, kreirajmo pogled kojim vidimo samo
predmete s parnim šiframa:
GO
CREATE VIEW PopisParnihPredmeta AS
SELECT sifPred AS Šifra, kratPred AS Kratica, nazPred
AS Naziv
FROM pred WHERE sifPred%2 = 0
GO
SELECT * FROM PopisParnihPredmeta
GO

Kada koristimo ovakav pogled ,mi uopće ne znamo da postoje i još neki reci u tablici jer
nemamo kako razlikovati pogled od tablice (iako je praksa poglede imenovati tako da iz imena
bude jasno da je riječ o pogledu, npr. ViewPopisParnihPredmeta ili slično...).
Na ova dva načina možemo ograničiti korisnika baze da vidi samo neke retke ili samo neke
stupce.
Poglede je dobro kreirati kad god postoji vjerojatnost da će takva informacija često zatrebati.
Naravno, ne treba ih kreirati za svaku sitnicu, nego za češće korištene informacije.

www.algebra.hr
Str. 60 OSNOVE SQL-A I BAZA PODATAKA

ISPRAVAK I UBACIVANJE PODATAKA


KORIŠTENJEM POGLEDA
Kada se podaci ubacuju ili ispravljaju u pogledu, može se dogoditi nekoliko stvari. Prvo, možda
nemamo pravo ubaciti ili ispraviti podatke u svim tablicama koje se koriste u pogledu, pa je
potrebno paziti kako se dodjeljuju prava na tablice i poglede. Drugo, ako je pogled dobiven
filtriranjem, kod ubacivanja se može dogoditi da se taj novoubačeni zapis ne pojavi u pogledu
jer ne odgovara zahtjevu filtriranja ili, ako se promijeni podatak, da ga ta promjena izbaci iz
pogleda.
Kod kreiranja pogleda može se uključiti opcija zabrane promjene podataka ili ubacivanja
podataka koji bi prekršili uvjet filtriranja:
USE fakultet
GO
CREATE VIEW StudentiIspiti AS
SELECT s.mbrStud, s.imeStud, i.sifPred, i.ocjena
FROM ispit i
RIGHT OUTER JOIN stud s ON i.mbrStud = s.mbrStud
WITH CHECK OPTION
GO

Dalje se ubacivanje ili ispravljanje pogleda vrši isto kao i kod tablice.
4. poglavlje: SQL - IZMJENE U BAZI PODATAKA Str. 61

ZADACI ZA VJEŽBU
ZADATAK 4.1
U bazi podataka Upisi, u tablici Tečajevi promijenite naziv tečaja P02 iz „Microsoft Word“ u
„Osnove obrade teksta – MS Word“.
ZADATAK 4.2
U tablici Upisi za polaznika sa šifrom 6 promijenite šifru tečaja u O03.
ZADATAK 4.3

Iz tablice Upisi izbrišite sve zapise gdje je šifra tečaja P01.


ZADATAK 4.4

U bazi Fakultet kreirajte novu tablicu PredmetiDvorane u kojoj ćete imati informacije o
predmetima i dvoranama u kojim se održavaju predavanja.
ZADATAK 4.5
Kreirajte pogled koji ispisuje imena i prezimena nastavnika s nazivom mjesta u kojemu stanuju.
ZADATAK 4.6
Kreirajte pogled koji ispisuje ime i prezime studenta, naziv i ocjenu za svaki ispit, te ime i
prezime profesora koji je održao ispit.

www.algebra.hr
5. poglavlje: FUNKCIJE

U ovom poglavlju naučit ćete:

matematičke funkcije

funkcije za rad s tekstom

funkcije za pretvorbu tipova podatka

datumske i vremenske funkcije


Str. 64 OSNOVE SQL-A I BAZA PODATAKA

UVOD
Funkcije služe za obavljanje nekog zadatka. To su zapravo mali ugrađeni programi koje
možemo pozvati da nam obave neki zadatak. Primjerice, da nam izračunaju najveću ili
najmanju vrijednost u nekom stupcu.
Dijele se u nekoliko kategorija, a mi ćemo ovdje pogledati skalarne funkcije. Ostale kategorije
razmatrat ćemo u sljedećoj skripti.
Sve funkcije uzimaju neke ulazne vrijednosti (koje onda zovemo parametri funkcije), kojih
može biti nula ili više, te vraćaju neku izračunatu vrijednost. Svaka od skalarnih funkcija vraća
točno jednu vrijednost bez obzira na broj parametara.

MATEMATIČKE FUNKCIJE
Ove nam se neće svidjeti, ali ponekad dobro dođe.

ABS CEILING FLOOR


POWER RAND ROUND

SIGN SQUARE SQRT

Ovdje je prikazan samo jedan dio, one koje bi nam mogle zatrebati.
ABS (broj) – vraća pozitivnu vrijednost danog broja
CEILING (broj) – zaokružuje realan broj na prvi manji cijeli broj
FLOOR (broj) – zaokružuje realan broj na prvi veći cijeli broj
POWER (broj, potencija) – vraća brojpotencija
RAND () – vraća slučajan realan broj (tipa float) u rasponu 0 do 1
ROUND (broj, broj_znamenki) – zaokružuje realan broj na zadani broj znamenki
SIGN (broj) – vraća predznak broja (tj. vrijednosti -1, 0 ili 1)
SQUARE (broj) – vraća kvadrat danog broja
SQRT (broj) – vraća korijen danog broja

Mogu se pozivati direktno (pa koristiti kao kalkulator):


SELECT CEILING(25.4), FLOOR(25.4)
GO
SELECT RAND(), SQUARE(3.4), SQRT(9.99)
GO

Ili se mogu koristiti u upitima:


USE fakultet
SELECT SQRT(ocjena), SQUARE(ocjena) FROM ispit
GO
5. poglavlje: FUNKCIJE Str. 65

FUNKCIJE ZA RAD S TEKSTOM


Ove funkcije rade sa znakovnim nizovima (tekstom, stringovima) te vraćaju odgovarajući string
ili brojčanu vrijednost.

LEFT LEN LOWER


LTRIM REPLACE REPLICATE
REVERSE RIGHT RTRIM
SUBSTRING UPPER

LEFT (string, broj) vraća prvi broj znakova niza string; npr. LEFT ('Baze
podataka', 4) daje kao rezultat 'Baze'
LEN (string) vraća duljinu stringa (broj znakova) bez razmaka s kraja;
npr. LEN ('Baze podataka') daje kao rezultat 13
LOWER (string) vraća isti string uz velike znakove pretvorene u male; npr.
LOWER ('Baze podataka') daje kao rezultat 'baze podataka'
LTRIM (string) vraća stringa bez razmaka s početka; npr. LTRIM (' Baze
podataka') daje kao rezultat 'Baze podataka'
REPLACE (string1, string2, u stringu1 zamjenjuje sva pojavljivanja string2 sa string3;
string3) npr. REPLACE ('Borg borgira borgovijom', 'Borg', 'Zork') - daje
kao rezultat 'Zork Zorkira Zorkovijom'
REPLICATE (string, broj) ponavlja string broj puta; npr. REPLICATE ('baze', 2) - daje
kao rezultat 'bazebaze'
REVERSE (string) okreće string; npr. REVERSE ('Baze') - daje kao rezultat 'ezaB'
RIGHT (string, broj) vraća zadnjih broj znakova niza string; npr. RIGHT ('Baze
podataka', 5) daje kao rezultat 'ataka'
RTRIM (string) vraća stringa bez razmaka s kraja; npr. RTRIM ('Baze
podataka ') daje kao rezultat 'Baze podataka'

www.algebra.hr
Str. 66 OSNOVE SQL-A I BAZA PODATAKA

SUBSTRING (string, vraća dio stringa string počevši od znaka na mjestu pocetak
pocetak, duljina) duljine duljina; npr. SUBSTRING ('Baze podataka', 6, 7) daje
kao rezultat 'podatak'
UPPER ( string ) vraća isti string uz male znakove pretvorene u velike; npr.
UPPER ('BAZE podataka') daje kao rezultat 'BAZE PODATAKA

Ovdje nedostaje jedino neka funkcija koja bi spajala stringove, no za to se koristi poseban
operator, tzv. operator konkatenacije, koji se standardno označava sa '+' (znakom plus).

Primjerice, ispišimo imena i prezimena studenata u jednom stupcu:


USE fakultet
SELECT RTRIM(imeStud) + ' ' + RTRIM(prezStud) AS 'Ime i prezime'
FROM stud
GO

Prvo smo očistili sve razmake nakon imena, dodali razmak, te na to dodali prezime.
5. poglavlje: FUNKCIJE Str. 67

FUNKCIJE ZA PRETVORBU TIPOVA


Može se dogoditi da nam neki neki podatak po svom tipu ne odgovara u nekom izrazu.
Primjerice, želimo li iz tablice Stud ispisati rečenice oblika: Jure Ribarić ima matični broj: 1137,
prvi pokušaj bi bio:
USE fakultet
SELECT RTRIM(imeStud) + ' ' + RTRIM(prezStud) +
' ima matični broj ' + mbrStud
FROM stud
GO

Naravno, ovo javlja grešku: tipovi podataka ne odgovaraju. Zapravo, računalo ne zna što znači
zadnji operator plus (+): kako zbrojiti nvarchar i int? Naravno, takvo što nema ni smisla
definirati. Stoga trebamo pomoći računalu tako što ćemo mu odgovarajući podatak pretvoriti iz
jednoga u drugi tip podatka. U našem slučaju trebamo pretvoriti mbrStud iz int u nvarchar tako
da operator plus postane smislen.
Pretvaranje vršimo pomoću dviju funkcija:
CAST (izraz AS ciljni_tip) - pretvara izraz iz tipa u kojem je u ciljni_tip
Npr. CAST (mbrStud AS nvarchar) pretvara broj u tekst
CONVERT ( tip_podataka [ ( duljina ) ] , izraz [ , stil ] ) - pretvara izraz iz tipa u kojem je u
ciljni_tip tako da uzme u obzir duljinu ako se radi o tipu kod kojeg to ima smisla (char, varchar
...), te poštuje stil stil, koji je također ovisan o tipu. Najčešće se koristi kada treba pretvoriti
datum u tekst ili kada treba formatirati realan broj.

Npr. CONVERT(nvarchar, neki_datum, 104) kao rezultat daje datum formiran kako ga koristimo
u Hrvatskoj.
Popravimo sada prethodni primjer:
USE fakultet
SELECT RTRIM(imeStud) + ' ' + RTRIM(prezStud) +
' ima matični broj ' + CAST(mbrStud AS nvarchar)
FROM stud
GO

Ispišimo sve studente i njihove datume rođenja u obliku: Jure Ribarić je rođen 02.11.1983.
USE fakultet
SELECT RTRIM(imeStud) + ' ' + RTRIM(prezStud) + ' je rođen(a) ' +
CONVERT(nvarchar, datRodStud, 104)
FROM stud
GO

Nemaju sve pretvorbe smisla, pa tako treba paziti kada se što može pretvoriti, a kada ne.
Datumske pretvorbe proučit ćemo detaljnije u lekciji o datumskim funkcijama, a o ostalim
pretvorbama pogledajte u literaturi.

www.algebra.hr
Str. 68 OSNOVE SQL-A I BAZA PODATAKA

FUNKCIJE ZA RAD S DATUMOM I VREMENOM


Zapisivanje vremena jedan je od problematičnijih aspekata u radu s bazom podataka. Svaki
DBMS definira neku svoju varijaciju, a postoji i puno različitih formata zapisa koji ovise o kulturi
u kojoj se koriste (mi koristimo oblik dd.mm.gggg., a npr. u USA koriste mm.dd.gggg).
Jedan problem koji će nas stalno mučiti jest kada utipkamo datum, kako ga interpretirati?
Primjerice, ako utipkamo 7.8.5., je li 7 dan osmog mjeseca 2005. godine ili osmi dan sedmog
mjeseca 2005. ili 5 dan osmog mjeseca 2007.? Moguće kombinacije su: dmg, dgm, mgd, mdg,
gmd, gdm, pa se treba dogovoriti koji se od njih koristi i kako će se onda shvatiti utipkani
brojevi.
Kod SQL Servera je postavljeni jezik engleski (us_english) ako drukčije nije odabrano pri
instalaciji. Jezik se može privremeno promijeniti tako da izvršimo naredbu:
SET LANGUAGE 'Hrvatski'

Vratiti se na engleski možemo uz pomoć:


SET LANGUAGE 'English'

Kada je postavljen engleski jezik, utipkani se brojevi shvaćaju u obliku mdg, a kada je
postavljen hrvatski, shvaćaju se u obliku dmg. Mada to uglavnom ne radi, pa moramo
pribjegavati direktnijim metodama. Način shvaćanja može se podesiti i ovako:
SET DATEFORMAT format

Format može biti neki od: mdy, dmy, ymd, ydm, myd ili dym (ovdje y označava g, a kako se
koristi engleski, moramo tipkati y). Ovo isključivo služi kod pretvorbe teksta u datumski format
i nema utjecaja ni na što drugo. Kod utipkavanja datuma brojkom moramo koristiti neki od
separatora: točka (.), crtica(-) ili kosa crta (/). Npr. 10-08-05, s tim da brojke odgovaraju
postavljenim pozicijama.
Datum se još može utipkati u brojčanom formatu bez separatora. Tada uvijek vrijedi format:
gmd. Npr. [20]051806 jest 18. lipnja 2005. godine.
Kod prikazivanja stupaca koji sadrže datum, ovo nema utjecaja tako da se datum standardno
prikazuje u obliku:
gggg-mm-dd ss:mm:ss.ttt
Spomenuli smo tipove koji se koriste za zapisivanje datuma i vremena: datetime i
smalldatetime. Ne postoji tip koji bi prikazivao samo datum ili samo vrijeme.
Funkcije koje služe za rad s datumima su sljedeće:

DATEADD DATEDIFF DATENAME


DATEPART DAY GETDATE
GETUTCDATE MONTH YEAR
5. poglavlje: FUNKCIJE Str. 69

DATEADD (dio, broj, Dodaje broj objekata tipa dio datumu datum. Npr. DATEADD
datum) (day, 42, datum_rod) dodaje 42 dana datumu datum_rod.
Moguće vrijednosti za dio su:
 year, yy, yyyy
 quarter, qq, q
 month, mm, m
 dayofyear, dd, d
 week, wk, ww
 hour, hh
 minute, mi, m
 second, ss, s
 milisecond, ms
DATEDIFF (dio, Vraća koliko je objekata tipa dio između datuma
pocetni_datum, pocetni_datum i datuma krajnji_datum. Npr. DATEDIFF ( ay,
krajnji_datum) '12.05.2007', '19.05.2007') daje kao rezultat 7. Moguće
vrijednosti za dio pogledati gore.
DATENAME (dio, datum Vraća string koji predstavlja dio datuma. Npr. DATENAME (m,
'12.05.2007') daje kao rezultat 'svibanj'. Moguće vrijednosti
za dio pogledati gore. Korišten je hrvatski jezik i postavka
SET DATEFORMAT mdy. Da je bio engleski ,vraćeni string bio
bi 'december'.
DATEPART (dio, datum) Vraća cijeli broj koji predstavlja dio datuma. Npr. DATEPART
(m, '12.05.2007') daje kao rezultat 5. Moguće vrijednosti za
dio pogledati gore. Korišten je hrvatski jezik i postavka SET
DATEFORMAT mdy. Da je bio engleski vraćeni broj bio bi 12.
DAY (datum) Ekvivalentno pozivu: DATEPART (dd, datum).
GETUTCDATE () Vraća datetime format vremena na Greenwich-u, tj. formatu
Universal Time Coordinate.
Ovo ovisi o postavkama sata i zone u kojoj se nalazi
računalo na kojem radi SQL Server.
MONTH (datum) Ekvivalentno pozivu: DATEPART (mm, datum).
YEAR (datum) Ekvivalentno pozivu: DATEPART (yy, datum).

Prikažimo imena i prezimena studenata te mjesec u kojem su rođeni:


USE fakultet
SELECT RTRIM(imeStud) + ' ' + RTRIM(prezStud)
AS 'Ime i prezime studenta',
DATENAME( m, datRodStud ) AS 'Mjesec rođenja'
FROM stud
GO

www.algebra.hr
Str. 70 OSNOVE SQL-A I BAZA PODATAKA

KOD ZNAČENJE
dd ili d Dan
dy ili d Dan u godini (1 do 365)
mm ili m Mjesec
yy ili yyy Godina
wk ili ww Tjedan
qq ili q Tromjesečje
hh Sat
mi ili n Minuta
ss ili s Sekunda
ms Milisekunda
5. poglavlje: FUNKCIJE Str. 71

ZADACI ZA VJEŽBU
ZADATAK 5.1
Ispišite ime i prezime te mjesto rođenja studenata kojima ime počinje slovom F.
ZADATAK 5.2.

Ispišite ime i prezime nastavnika koji živi u mjestu koje na trećem mjestu ima slovo Z.
ZADATAK 5.3

Ispišite ime i prezime studenata te imena i prezimena nastavnika koji u imenu na petom mjestu
imaju isto slovo.
ZADATAK 5.4

Ispišite nazive županija kojima je duljina imena duža od 13 znakova, a kraća od 20 znakova.
ZADATAK 5.5
Ispišite ime i prezime studenata koji su rođeni u svibnju.
ZADATAK 5.6
Ispišite ime i prezime studenata koji su na ispit izašli između 10. i 20. u mjesecu.
ZADATAK 5.7

Pronađite podatke o onim nastavnicima koji su u lipnju ispitivali studente čije je mjesto rođenja
isto mjestu nastavnikova stanovanja. Ispišite ime i prezime nastavnika, naziv mjesta u kojem
stanuje, ime i prezime studenta te naziv mjesta u kojem je rođen.

www.algebra.hr
6. poglavlje: RAD S UPITIMA U SQL
SERVERU 2019

U ovom poglavlju naučit ćete:

kreiranje upita u Management Studiju

spremanje i otvaranje upita

različite prikaze rezultata upita

Query Designer
Str. 74 OSNOVE SQL-A I BAZA PODATAKA

RAD S UPITIMA U MANAGEMENT STUDIJU


Većina administrativnih zadaća u SQL Serveru 2019 izvodi se koristeći SQL Server
Management Studio.
Pokreće se na Start  All Programs  Microsoft SQL Server Tools Sql Server
Management Studio.
Otvara se dijaloški okvir za povezivanje na server. Za rad s bazama na SQL Serveru iz
padajućeg izbornika treba odabrati Database Engine.

Odaberimo da će nas, kao korisnika baze, provjeravati Windows operativni sustav (Windows
authentication).
Management Studio ima urednike za pisanje i izvršavanje upita: Query editors. To su
interaktivni grafički alati koji administratorima i programerima omogućavaju pisanje upita,
simultano izvršenje višestrukih upita, pregled rezultata, analizu plana upita i dobivanje pomoći
kako bi se poboljšale performanse upita.
Prozor za rad s upitima otvaramo klikom na gumb New Query na alatnoj traci.
6. poglavlje: RAD S UPITIMA U SQL SERVERU 2019 Str. 75

Prozor za rad s upitima u SQL Serveru 2019:

Prikaz Object Explorera

Kartica za
rad s upitima

Odabir baze Gumbi za pokretanje i Odabir oblika prikaza


stopiranje izvršavanja upita rezultata upita

Na prikazanoj padajućoj listi za odabir baze, treba odabrati bazu nad kojom želite postavljati
upite.
Kako biste vidjeli rezultate upita, u prozor upita trebate upisati tekst SQL upita i kliknuti gumb
(u setu gumba za pokretanje i stopiranje izvršavanja upita) ili pritisnuti tipku F5 na
tipkovnici.

Izvršavanje upita zaustavlja se klikom na gumb .

Moguće je i provjeriti sintaksu upita bez izvršavanja samog upita klikom na gumb .
Management Studio naredbe boji u plavo, tekstove u crveno, komentare u zeleno, a funkcije
u ružičastu boju kako bi kasnije kôd upita bio čitljiviji.

www.algebra.hr
Str. 76 OSNOVE SQL-A I BAZA PODATAKA

PRIMJER: Ispiši sve polaznike iz Zagreba.

Kartica prikaza rezultata upita

Kartica prikaza poruke o grešci

SPREMANJE, OTVARANJE I PRIKAZIVANJE


REZULTATA UPITA

SPREMANJE UPITA

SQL Server ima mogućnost spremanja grupe SQL izraza u tekstualnu datoteku kako bismo
kasnije iste te izraze mogli ponovno koristiti.
Kako bismo spremili upit, idemo u izbornik File Save SQLQueryX.sql As (X predstavlja broj
upita 1, 2 itd. koji nam je trenutno novootvoren) ili pritisnemo gumb Save na liniji alata, a
pritom je potrebno zadati naziv datoteke.
Ako ne navedete drukčije, datoteka se sprema s ekstenzijom .sql.

Napomena: ako nemate instaliran SQL Server, upit snimljen s ekstenzijom .sql moguće je
otvoriti i u Notepadu te ju kopirati u bilo koji program za rad s upitima.

OTVARANJE UPITA

Kako bismo otvorili prethodno spremljeni upit, iz izbornika treba izabrati naredbu File Open
File, pronaći upit koji treba otvoriti i pritisnuti OK. Upit će se prikazati u kartici za upite i biti
spreman za izvršavanje.
6. poglavlje: RAD S UPITIMA U SQL SERVERU 2019 Str. 77

PRIKAZIVANJE REZULTATA UPITA

Management Studio ima mogućnost prikazivanja rezultata upita u dva formata - u obliku teksta
i u obliku tablice. Prelazak iz jednog prikaza u drugi određujemo preko izbornika Query 
Results to  Results to Text/Results to Grid.

Results to Text

Results to Grid

Također, rezultate upita moguće je snimiti i u datoteku preko izbornika Query  Results to
 Results to File. Datoteka je tipa Report files s ekstenzijom .rpt

Navedene prikaze rezultata moguće je promijeniti i koristeći gumbe na alatnoj traci .

DIZAJNER UPITA

Kao i u Microsoft Accessu, tako je i u Management Studiju moguće koristiti grafičko sučelje za
kreiranje nekih upita bez poznavanja same SQL sintakse.
Query Designer otvara se odabirom naredbe iz izbornika Query Design Query in Editor.

www.algebra.hr
Str. 78 OSNOVE SQL-A I BAZA PODATAKA

DODATAK A – FAKULTETSKA BAZA

Oznaka PK znači primarni ključ (engl. Primary Key), a oznaka FK znači strani ključ (engl.
Foreign Key). Primarni ključ je izdvojen i podcrtan. Na vrhu je naziv tablice, strelice označavaju
relacije među tablicama, a podebljan naziv stupca označava ograničenje NOT NULL.

You might also like