You are on page 1of 42

OSNOVE SQL-A I BAZA

PODATAKA
ZBIRKA ZADATAKA
Tina Kaštelan

Luka Nekić

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

Urednica:
Dolores Kujek

Naslov:
Osnove SQL-a i baza podataka

Izdanje:
1. izdanje

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 001108620.

ISBN 978-953-322-411-4
Sadržaj
1. poglavlje: RELACIJSKI MODEL BAZE PODATAKA ...................................................... 5
ER-DIJAGRAM I NORMALIZACIJA ........................................................................................ 6
2. poglavlje: SQL JEZIK .....................................................................................................13
KREIRANJE OBJEKATA BAZE PODATAKA ....................................................................... 14
3. poglavlje: RAD S PODACIMA U BAZI ............................................................................19
UBACIVANJE PODATAKA U TABLICU................................................................................ 20
DOHVAĆANJE PODATAKA IZ TABLICA ............................................................................. 22
UPITI NAD VIŠE TABLICA .................................................................................................... 24
4. poglavlje: SQL - IZMJENE U BAZI PODATAKA ............................................................31
IZMJENE PODATAKA U TABLICAMA.................................................................................. 32
5. poglavlje: FUNKCIJE ......................................................................................................35
FUNKCIJE ............................................................................................................................. 36
6. poglavlje: POHRANJENE PROCEDURE ........................................................................39
6.1 POHRANJENE PROCEDURE .................................................................................................... 40
DODATAK A – FAKULTETSKA BAZA .............................................................................................. 42
1. poglavlje: RELACIJSKI MODEL BAZE
PODATAKA
Str. 6 OSNOVE SQL-A I BAZA PODATAKA

ER-DIJAGRAM I NORMALIZACIJA
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.
Rješenje:
ER - dijagram:

Svaki zaposlenik radi u nekom odjelu, tj. svaki odjel ima nekoliko zaposlenika. Neki od
zaposlenika su šefovi odjela, tj. svaki odjel ima svog šefa.
Koje su nam informacije potrebne?
šifra zaposlenika, ime i prezime zaposlenika, odjel u kojem radi, šifra odjela, naziv odjela,
lokacija odjela, šef odjela (to je šifra nekog zaposlenika)
Ako to prikažemo s nekim izmišljenim podacima u tablici, to bi moglo izgledati ovako:

Zaposlenici i odjeli
Šifra Ime Naziv Lokacija Šef
zaposlenika zaposlenika odjela odjela odjela
(DA/NE)
1 Ivo Markić Prodaja 1 Zagreb NE
2 Marko Anić Nabava 1 Varaždin DA
3 Anita Marić Prodaja 1 Zagreb DA
4 Mirjana Galić Prodaja 2 Split DA
5 Anita Krivaj Prodaja 2 Split NE
6 Matej Fedor Nabava 1 Varaždin NE
... ... ... ... ...

No, uočite probleme koji se pojavljuju: duplikacija podataka, problemi kod ispravke ili promjene
podataka i problemi kod dodavanja...
Normalizacija nas vodi korak po korak: prvo je potrebno tablicu dovesti u 1NF, što smo pogodili
iz prve.
1. poglavlje: RELACIJSKI MODEL BAZE PODATAKA Str. 7

Ali još uvijek to nije baš kako treba jer imamo puno ponavljanja podataka po stupcima. To
riješimo ako tablicu rastavimo na dvije.

Odjeli
Šifra Naziv Lokacija
odjela odjela odjela
P01 Prodaja 1 Zagreb
N01 Nabava 1 Varaždin
P02 Prodaja 2 Split
... ...

Zaposlenici i odjeli
Šifra Ime Prezime Šifra
zaposlenika zaposlenika zaposlenika odjela
1 Ivo Markić P01
2 Marko Anić N01
3 Anita Marić P01
4 Mirjana Galić P02
5 Anita Krivaj P02
6 Matej Fedor N01
... ... ...

Skoro pa je odlično, jedino smo izgubili informaciju o tome tko je šef kojeg odjela. Mogli smo
to riješiti i tako da u tablicu Zaposlenici dodamo još jedan stupac koji govori da li je neki
zaposlenik šef odjela u kojem radi ili ne. Ali i već sad tablica Zaposlenici sadrži previše
informacija, tj. stupac Šifra odjela koji govori u kojem odjelu je zaposlen koji zaposlenik nam
onemogućava zapisivanje informacije da npr. Marko Anić koji je šef nabave u Varaždinu je
istovremeno i referent u nabavi, pa bi i taj podatak trebao postojati.
Znači, još je tablicu Zaposlenici potrebno smanjiti i dodati dvije nove tablice: tablicu koja
zapisuje informacije o šefovima i tablicu koja zapisuje informacije o tome koji je zaposlenik
zaposlen u kojem odjelu. Sve zajedno to izgleda ovako:

Zaposlenici Šefovi
Šifra Ime Prezime Šifra Šifra
zaposlenika zaposlenika zaposlenika odjela zaposlenika
1 Ivo Markić P01 3
2 Marko Anić N01 2
3 Anita Marić P02 4
4 Mirjana Galić ... ...
5 Anita Krivaj
6 Matej Fedor
... ... ...

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

Odjeli Zaposlenici u odjelu


Šifra Naziv Lokacija Šifra Šifra
odjela odjela odjela zaposlenika odjela
P01 Prodaja 1 Zagreb 1 P01
N01 Nabava 1 Varaždin 5 P02
P02 Prodaja 2 Split 6 N01
... ... ... ... ...

Sada se bilo koja informacija može dodati ili prepraviti, a da se ne pojavi neki od problema.
Problem smo mogli riješiti i bez uvođenja dviju novih tablica, nego uvođenjem samo jedne
nove (tablica šefovi), a u tablici zaposlenici zapisivati u kojem odjelu dani zaposlenik radi.

Zaposlenici
Šifra Ime Prezime Šifra
zaposlenika zaposlenika zaposlenika odjela
1 Ivo Markić P01
2 Marko Anić N01
3 Anita Marić P01
4 Mirjana Galić P02
5 Anita Krivaj P02
6 Matej Fedor N01
... ... ... ...

Odjeli Šefovi
Šifra Naziv Lokacija Šifra Šifra
odjela odjela odjela odjela zaposlenika
P01 Prodaja 1 Zagreb P01 3
N01 Nabava 1 Varaždin N01 2
P02 Prodaja 2 Split P02 4
... ... ... ... ...

Ili čak samo preraspodjelom stupaca, npr. tako da zapišemo u tablici sa odjelima šifru
zaposlenika koji je šef tog odjela. Koje je rješenje najbolje ovisi o puno faktora, pa donijeti
odluku nije lako.
Primijetite da ne pratimo direktno slijed 1NF – 2NF – 3NF, nego više koristimo intuiciju da
riješimo problem. Kada budemo gotovi, onda je lakše provjeriti normalne forme i potvrditi našu
intuiciju. Isto tako primijetite da 1NF zahtjeva da nema ponavljanja podataka, a kod nas smo
zapravo došli u situaciju da se šifra nekog odjela pojavljuje više puta (npr. P01 se pojavljuje 3
puta), što znači da trošimo neki prostor na zapisivanje tih informacija. To nije problem jer smo
taj ponavljajući podatak izabrali tako da ne troši puno prostora, a on je ujedno i primarni ključ,
od kojega imamo i dodatne koristi.
Dobili smo na kraju ovakav dijagram, prema kojem ćemo kasnije kreirati tablice baze.
1. poglavlje: RELACIJSKI MODEL BAZE PODATAKA Str. 9

ZADATAK 1.2
Trgovina ima nekoliko skladišnih mjesta po kojima grupira svoje proizvode. Npr. cigle i crjepovi
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.

Rješenje:
Kao i u prethodnom zadatku, moguće je više rješenja. Navest ćemo ovdje dva rješenja.
Uzmimo neka svaki radnik radi samo u jednom skladištu. Svaki proizvod nalazi se u samo
jednom skladištu.
U prvom rješenju odlučili smo da informaciju tko je voditelj kojeg skladišta spremimo u tablici
Radnik. Radnik radi samo u jednom skladištu i tu informaciju čuvamo u polju Sifra_skladista.
Kako bismo čuvali informaciju u bazi je li radnik voditelj skladišta u kojem radi ili ne, dodamo
polje Voditelj_skladista u kojem će se čuvati informacija DA ili NE.

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

U drugom prijedlogu rješenja izdvojili smo informaciju o voditelju skladišta u zasebnu tablicu
Voditelji. U ovom se slučaju mogu pratiti informacije o voditeljima i ako je jedan radnik voditelj
više skladišta. U prethodnom rješenju to bi bilo nezgodno radi pojave problema dupliciranja
podataka u tablici Radnik.
1. poglavlje: RELACIJSKI MODEL BAZE PODATAKA Str. 11

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 jednoga dana i
ako ga član ne vrati u navedeno vrijeme, zaračunava mu se zakasnina.
Rješenje:
ER-dijagram

ČLAN posuđuje FILM

je
ima

ŽANRA
CJENIK

Ovaj zadatak može imati više predloženih rješenja dizajna tablica. Navest ćemo jedan. Za
entitete: Član, Film, Cjenik, Žanr odlučili smo koje podatke želimo čuvati u bazi podataka. To
su nam njihovi atributi. Na osnovu te odluke prvo ćemo kreirati tablice Član, Film, Cjenik, Žanr.
U ovom slučaju odlučili smo u tablici Cjenik čuvati podatke o vrsti medija koji je posuđen i
kategoriju filma: stari, hit ili trajna posudba... Preko ovako definiranog cjenika točno znamo je
li član videoteke posudio film na VHSu ili DVDu i po kojoj cijeni.

CJENIK
Sifra_cjenika Kategorija Cijena
1 Hit DVD 15,00 kn
2 DVD 12,00 kn
3 Hit VHS 12,00 kn
4 VHS 10,00 kn
5 Stari VHS 8,00 kn

Vezu „Film je žanra“ ostvarili smo u bazi dodavši strani ključ Sifra_zanra u tablici Filmovi. Time
smo između tablica Zanr i Filmovi ostvarili vezu 1 – n.
Vezu „Film ima cjenik“ smo ostvarili na način da smo u tablicu Posudba dodali strani ključ
Sifra_cjenika koji smo povezali na istoimeni primarni ključ u tablici Cjenik. Cijenu filma smo
mogli definirati i u tablici Filmovi. No bilo bi nam problematično svakodnevno ažurirati cijene
kada se neki film prvo naplaćuje po cijeni hit filma, a onda za nekoliko dana dobije standardnu
cijenu od 12,00 kn.

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

Veza „Član posuđuje film“ je veza m – n i kao takva ne dozvoljava direktno ostvarivanje veze
među tablicama Clanovi i Filmovi. Zato uvodimo novu tablicu Posudba. Definirali smo
višestruki primarni ključ koji se sastoji od polja Clanski_broj, Sifra_filma, Datum_posudbe. To
je najmanji broj polja u ovoj tablici, koji garantira jedinstvenost svakog zapisa. Naime, ne može
se dogoditi da jedan član u istome danu posudi isti film 2 puta. Cijena filma se odnosi na
posudbu na jedan cijeli dan.
U tablici Posudba dodali smo polje Datum_povrata kako bismo vodili evidenciju kada je član
vratio film, a ujedno i računali zakasninu, ukoliko ga nije vratio sljedeći dan.
Ovo sve gore navedeno nas vodi do dijagrama baze podataka:
2. poglavlje: SQL JEZIK
Str. 14 OSNOVE SQL-A I BAZA PODATAKA

KREIRANJE OBJEKATA BAZE PODATAKA


ZADATAK 2.1
Provjerite gdje je instaliran Microsoft SQL Server, locirajte mapu Data, te provjerite postojanje
odgovarajućih datoteka za 4 sistemske baze.
Rješenje:
Ukoliko tijekom instalacije korisnik nije drugačije naveo, Microsoft SQL Server 2008 se instalira
u mapu:
C:\Program Files\Microsoft SQL Server
Sve sistemske baze podataka nalaze se spremljene u mapi: C:\Program Files\Microsoft SQL
Server\MSSQL.1\MSSQL\Data 4 su sistemske baze podataka:

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)
2. poglavlje: SQL JEZIK Str. 15

ZADATAK 2.2

Kreirajte bazu podataka iz zadatka 1.1 za tvrtku s radnicima iz nekoliko odjela, te zatim kreirajte
odgovarajuće tablice.
Rješenje:
CREATE DATABASE Zaposlenici
GO

USE Zaposlenici
GO

CREATE TABLE Zaposlenici(


Sifra_zaposlenika bigint NOT NULL PRIMARY KEY,
Ime nvarchar(50) NOT NULL,
Prezime nvarchar(50) NOT NULL,
Sifra_odjela nchar(10) NOT NULL
REFERENCES Odjeli(Sifra_odjela)
)
GO

CREATE TABLE Odjeli(


Sifra_odjela nchar(10) NOT NULL PRIMARY KEY,
Naziv_odjela nvarchar(50) NOT NULL,
Lokacija_odjela nvarchar(50) NOT NULL,
)
GO

CREATE TABLE Sefovi (


Sifra_zaposlenika bigint FOREIGN KEY
REFERENCES Zaposlenici(Sifra_zaposlenika),
Sifra_odjela nchar(10) FOREIGN KEY
REFERENCES Odjeli(Sifra_odjela),
CONSTRAINT PK_sifre PRIMARY KEY
(Sifra_zaposlenika, Sifra_odjela)
)
GO

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

ZADATAK 2.3

Kreirajte bazu podataka iz zadatka 1.2 za skladište trgovine, te zatim kreirajte odgovarajuće
tablice.
Rješenje:
Kreirat ćemo bazu podataka za drugi prijedlog iz rješenja zadatka 1.2.
CREATE DATABASE Skladiste
GO
USE Skladiste
GO
CREATE TABLE Skladisno_mjesto(
Sifra_skladista int NOT NULL PRIMARY KEY,
Naziv nchar(30),
Mjesto nchar (20)
)
GO

CREATE TABLE Radnik (


Sifra_radnika int NOT NULL PRIMARY KEY,
Ime nchar(30),
Prezime nchar(30), Sifra_skladista int
FOREIGN KEY
REFERENCES Skladisno_mjesto (Sifra_skladista)
)
GO

CREATE TABLE Proizvod (


Sifra_proizvoda int NOT NULL PRIMARY KEY,
Naziv nchar(30),
Sifra_skladista int FOREIGN KEY
REFERENCES Skladisno_mjesto (Sifra_skladista)
)
GO

CREATE TABLE Voditelji (


Sifra_radnika int NOT NULL FOREIGN KEY
REFERENCES Radnik(Sifra_radnika),
Sifra_skladista int NOT NULL FOREIGN KEY
REFERENCES Skladisno_mjesto(Sifra_skladista),
CONSTRAINT PK_sifre PRIMARY KEY (Sifra_radnika, Sifra_skladista)
)
GO
2. poglavlje: SQL JEZIK Str. 17

ZADATAK 2.4

Kreirajte bazu podataka iz zadatka 1.3 za poslovanje videoteke, te zatim kreirajte


odgovarajuće tablice.
Rješenje:
CREATE DATABASE Videoteka
GO
USE Videoteka
GO

CREATE TABLE Clanovi(


Clanski_broj int NOT NULL
PRIMARY KEY,
Ime nvarchar(30),
Prezime nvarchar (30),
Adresa nvarchar(30),
Telefon char(15),
Datum_uclanjenjadatetime
)
GO

CREATE TABLE Zanr (


Sifra_zanra int NOT NULL PRIMARY KEY,
Naziv nvarchar(30)
)
GO

CREATE TABLE Filmovi (


Sifra_filma int NOT NULL PRIMARY KEY,
Naziv nvarchar(30),
Reziser nvarchar(30),
Glavni_glumci nvarchar(100),
Godina_izdanja int,
Kolicina_DVD int,
Kolicina_VHS int,
Slika_naslovniceimage,
Sifra_zanra int FOREIGN KEY
REFERENCES Zanr (Sifra_zanra)
)
GO

CREATE TABLE Cjenik (


Sifra_cjenika int NOT NULL PRIMARY KEY,
Kategorija nvarchar(30),
Cijena smallmoney
)
GO

CREATE TABLE Posudba (


Clanski_broj int NOT NULL FOREIGN KEY

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

REFERENCES Clanovi(Clanski_broj),
Sifra_filma int NOT NULL FOREIGN KEY
REFERENCES Filmovi(Sifra_filma),
Datum_posudbe datetime,
Datum_povrata datetime,
Sifra_cjenika int NOT NULL FOREIGN KEY
REFERENCES Cjenik(Sifra_cjenika),
CONSTRAINT PK_sifre PRIMARY KEY (Clanski_broj, Sifra_filma,
Datum_posudbe)
)
GO

ZADATAK 2.5
Prepravite bazu podataka iz zadatka 2.3 za skladište trgovine s odgovarajućim ograničenjima.
Dodajte novo polje Mjesto skladišta trgovine. Mjesta smiju biti samo Zagreb, Rijeka ili Sisak.
Rješenje:
Promjene nad objektima radimo naredbom ALTER. Mijenjamo samo tablicu pa smo zato
upotrijebili naredbu ALTER TABLE. Novo polje u tablici i traženo ograničenje dodajemo
naredbom ADD.

ALTER TABLE Skladisno_mjesto


ADD
Mjesto nchar (20)
CONSTRAINT ck_provjera CHECK
(Mjesto IN('Zagreb','Rijeka','Sisak'))
GO
3. poglavlje: RAD S PODACIMA U BAZI
Str. 20 OSNOVE SQL-A I BAZA PODATAKA

UBACIVANJE PODATAKA U TABLICU


ZADATAK 3.1
Kreirajte bazu podataka 'Upisi_polaznika' i tablice, te ih zatim popunite podacima kako je
prikazano na slici:

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 Šifra Šifra
tečaja Naziv tečaja polaznika tečaja
P01 Osnove rada PC računala 1 P01
P02 Microsoft Word 2 P02
N01 SQL - osnove 3 N01
O01 Računalni operator – uredsko 4 O01
poslovanje 5 O02
O02 Specijalist poslovne primjene 6 P01
računala
O03 Grafički dizajner

Rješenje:
CREATE DATABASE Upisi_polaznika
GO
USE Upisi_polaznika
GO
CREATE TABLE polaznici (
sifra_polaznika int NOT NULL
CHECK (sifra_polaznika BETWEEN 1 AND 1000) PRIMARY KEY,
ime nvarchar(50) NOT NULL,
prezime nvarchar(50) NOT NULL,
mjesto_stanovanja nchar(25)
)
GO
CREATE TABLE tecajevi (
sifra_tecaja char(3) NOT NULL PRIMARY KEY,
naziv_tecaja nvarchar(50) NOT NULL
)
GO

CREATE TABLE upisi (


3. poglavlje: RAD S PODACIMA U BAZI Str. 21

sifra_polaznika int
FOREIGN KEY
REFERENCES polaznici(sifra_polaznika),
sifra_tecaja char(3)
FOREIGN KEY
REFERENCES tecajevi(sifra_tecaja),
CONSTRAINT PK_sifre PRIMARY KEY (sifra_polaznika, sifra_tecaja))

GO
INSERT INTO polaznici VALUES ( 1, 'Ana',' Milić','Zagreb')
GO
INSERT INTO polaznici VALUES ( 2, 'Sanja','Tarak','Split')
GO
INSERT INTO polaznici VALUES ( 3, 'Mladen','Gork', 'Osijek')
GO
INSERT INTO polaznici VALUES ( 4, 'Ivana','Matkić', 'Split')
GO
INSERT INTO polaznici VALUES ( 5, 'Marina','Anić', 'Osijek')
GO
INSERT INTO polaznici VALUES ( 6, 'Ivica','Limić','Split')

GO
INSERT INTO tecajevi VALUES ('P01 ', 'Osnove rada PC računala')
GO
INSERT INTO tecajevi VALUES ('P02 ', 'Microsoft Word' )
GO
INSERT INTO tecajevi VALUES ('N01 ', 'SQL – osnove' )
GO
INSERT INTO tecajevi VALUES ('O01 ', 'Računalni operator – uredsko
poslovanje' )
GO
INSERT INTO tecajevi VALUES (' O02 ', 'Specijalist poslovne primjene
računala')
GO
INSERT INTO tecajevi VALUES (' O03 ', 'Grafički dizajner' )

GO
INSERT INTO upisi VALUES (1, 'P01')
GO
INSERT INTO upisi VALUES (2, 'P02')
GO
INSERT INTO upisi VALUES (3, ' N01')
GO
INSERT INTO upisi VALUES (4, ' O01')
GO
INSERT INTO upisi VALUES (5, ' O02')
GO
INSERT INTO upisi VALUES (6, ' P01')
GO

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

DOHVAĆANJE PODATAKA IZ TABLICA


Sve sljedeće zadatke riješite koristeći bazu podataka FAKULTET.
ZADATAK 3.2

Ispišite samo imena i prezimena nastavnika. Rješenje:


Ovdje su nam potrebna samo 2 polja iz tablice Nastavnik.
USE Fakultet
SELECT imeNastavnik, prezNastavnik
FROM nastavnik

ZADATAK 3.3
Ispišite matični broj, ime i prezime svih studenata. Ime i prezime treba ispisati zajedno, u
jednom stupcu.
Rješenje:
Ime i prezime spajamo znakom + u jedan stupac. Kako ne želimo dobiti spojena polja npr.
'DanijelMarović', između imena i prezimena ćemo staviti razmak (u navodnicima, jer se razmak
smatra tekstualnim znakom).
USE Fakultet
SELECT mbrStud, imeStud+' '+prezStud AS 'Ime i prezime'
FROM stud

ZADATAK 3.4

Ispišite sva imena studenata tako da se ni jedno ne pojavi dva puta. Sortirajte imena silazno
po abecedi.
Rješenje1:
U ovom se upitu moramo riješiti dupliciranih vrijednosti prilikom ispisa rezultata. To možemo
učiniti na 2 dolje navedena načina.
SELECT DISTINCT imeStud FROM stud
ORDER BY imeStud DESC

Rješenje2:
SELECT imeStud FROM stud
GROUP BY imeStud
ORDER BY imeStud DESC
3. poglavlje: RAD S PODACIMA U BAZI Str. 23

ZADATAK 3.5

Ispišite matične brojeve studenata koji su položili ispit iz predmeta sa šifrom


146. Rješenje:
SELECT mbrStud FROM ispit
WHERE sifPred=146

ZADATAK 3.6
Ispišite imena i prezimena nastavnika, te njihovu plaću dobivenu formulom: (koeficijent + 0.4)
* 800.
Rješenje:
U upitu dodajemo novo polje Plaća. To je izračunato polje dobiveno formulom: (koeficijent +
0.4) * 800
SELECT imeNastavnik,
prezNastavnik, (koef+0.4)*800 AS 'Plaća'
FROM nastavnik

ZADATAK 3.7
Ispišite imena i prezimena nastavnika iz prethodnog zadatka koji imaju plaću manju od 3500
ili veću od 8000.
Rješenje:
Pod kriterij moramo dodati provjeru uvijeta da je cijeli izračun plaće manji od 3500 ili veći od
8000.
SELECT imeNastavnik,
prezNastavnik,
(koef+0.4)*800 AS 'Plaća'
FROM nastavnik
WHERE ((koef+0.4)*800<3500) OR ((koef+0.4)*800>8000)

ZADATAK 3.8

Ispišite sve podatke o studentima čije ime počinje i završava samoglasnikom.


Rješenje:
Za rješenje ovog zadatka trebamo operator LIKE.
SELECT * FROM stud
WHERE imeStud LIKE '[aeiou]%[aeiou]'

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

ZADATAK 3.9

Ispišite sve podatke o studentima kojima ime počinje i završava bilo kojim znakom osim
samoglasnikom.
Rješenje:
SELECT * FROM stud
WHERE imeStud LIKE '[^aeiou]%[^aeiou]'

ZADATAK 3.10
Ispišite sve podatke o studentima kojima ime počinje ili završava samoglasnikom.
Rješenje:
SELECT * FROM stud
WHERE imeStud LIKE '[aeiou]%'OR imeStud LIKE '%[aeiou]'

ZADATAK 3.11

Ispišite sve podatke o studentima kojima ime ili prezime bilo gdje sadrži slova n i k jedno iza
drugog.
Rješenje:
SELECT * FROM dbo.stud
WHERE imeStud LIKE '%nk%' OR prezStud LIKE '%nk%'

UPITI NAD VIŠE TABLICA


Ako trebamo pogledati podatke iz više tablica, koristiti ćemo spajanje tablica naredbom JOIN.
Kako se kod spajanja stupaca iz različitih tablica često dogodi da dva stupca imaju isto ime,
moramo imati neki način razlikovanja među njima. Stoga se koristi jedno uobičajeno
imenovanje stupaca unutar tablice: imeTablice.imeStupca.

Napomena: Ukoliko u upitu sudjeluju tablice koje nemaju direktnu relaciju, treba dodati
dovoljan broj tablica da se zatvori relacija između takvih tablica.

ZADATAK 3.12

Ispišite imena i prezimena studenata koji su barem jednom pali na ispitu iz predmeta sa šiframa
od 220 do 240.
Rješenje 1:
Ovaj zadatak ima moguća 2 rješenja. Zadatak možemo riješiti koristeći WHERE naredbu za
provjeru uvjeta da je šifra studenta iz tablice Ispiti jednaka šifri studenta tablice Stud. Uz to
provjerit ćemo i uvjet da je ocjena 1 (znači da je student pao na ispitu) i da su šifre studenata
u intervalu 220 – 240.
3. poglavlje: RAD S PODACIMA U BAZI Str. 25

SELECT imeStud,prezStud FROM stud, ispit


WHERE stud.mbrStud=ispit.mbrStud
AND ocjena=1
AND (sifPred BETWEEN 220 AND 240)

Rješenje 2:
Drugo moguće rješenje je koristeći unutarnje spajanje INNER JOIN, odnosno možemo koristiti
i kraću verziju naredbe – JOIN. Opet, svakako u upitu moramo reći da tražimo studente čija je
šifra studenta iz tablice Ispiti jednaka šifri studenta tablice Stud.
SELECT imeStud,prezStud
FROM stud JOIN ispit
ON stud.mbrStud=ispit.mbrStud
WHERE ocjena=1 AND (sifPred BETWEEN 220 AND 240)

ZADATAK 3.13

Ispišite imena i prezimena studenata koji su na nekom ispitu dobili 3.


Rješenje:
S obzirom da nas u ovom zadatku ne zanima svaki ispit i ocjena 3, nego student koji je barem
jednom dobio 3 iz nekog ispita, duplicirane vrijednosti ćemo eliminirati u rezultatu upita
naredbom DISTINCT.
SELECT DISTINCT imeStud, prezStud
FROM stud JOIN ispit
ON stud.mbrStud=ispit.mbrStud
WHERE ocjena=3

ZADATAK 3.14
Ispišite nazive predmeta na koje je izašao barem jedan student.
Rješenje:
SELECT DISTINCT nazPred
FROM pred JOIN ispit
ON ispit.sifPred=pred.sifPred

ZADATAK 3.15

Ispišite nazive predmeta na koje ni jedan student nije izašao. Rješenje 1:


Kako bi dobili sve predmete bez obzira jesu li se ikada pojavili u tablici 'ispit' moramo navesti
da želimo sve zapise iz tablice 'pred'.
Najlakše je ovako pogledati:
Pogledajmo kako je napisano FROM pred JOIN ispit. Tablica 'pred' se nalazi s lijeve strane
riječi JOIN, a 'ispit' s desne. S obzirom da su nam potrebni svi zapisi iz tablice 'pred' bez obzira

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

jesu li se ili nisu nikada pojavili u tablici 'ispit', upotrebljavamo lijevo unutarnje spajanje, tj.
naredbu LEFT JOIN.
SELECT nazPred
FROM pred LEFT JOIN ispit
ON pred.sifPred=ispit.sifPred
WHERE datIspit IS NULL ORDER BY nazPred

Rješenje 2:
Ovaj upit je moguće riješiti koristeći operator NOT IN i podupit (podupiti se rade na seminaru
SQL - napredni).
SELECT nazPred
FROM pred
WHERE nazPred NOT IN ( SELECT DISTINCT nazPred
FROM pred, ispit
WHERE ispit.sifPred=pred.sifPred)

ZADATAK 3.16
Ispišite oznake dvorana i nazive kolegija za one kolegije koji imaju više od 2 sata predavanja
tjedno.
Rješenje:
SELECT nazPred,oznDvorana
FROM pred LEFT JOIN rezervacija
ON pred.sifPred=rezervacija.sifPred
WHERE brojSatiTjedno>2

ZADATAK 3.17
Ispišite nazive predmeta i organizacijske jedinice kojima pripadaju za one kolegije koji imaju
više od 20 upisanih studenata.
Rješenje:
SELECT nazPred,nazOrgjed,upisanoStud
FROM pred JOIN orgjed
ON pred.sifOrgjed=orgjed.sifOrgjed
WHERE upisanoStud>20
3. poglavlje: RAD S PODACIMA U BAZI Str. 27

ZADATAK 3.18

Ispišite sve nazive mjesta u kojima barem jedan student stanuje. Imena mjesta smiju se pojaviti
samo jednom.
Rješenje:
SELECT DISTINCT nazMjesto
FROM mjesto JOIN stud
ON mjesto.pbr=stud.pbrStan

ZADATAK 3.19

Ispišite ime i prezime studenta, te naziv i ocjenu za svaki ispit. Rješenje:


U ovom upitu trebamo podatke iz tri tablice – Ispit, Stud, Pred. Te tri tablice treba spojiti na
temelju vrijednosti ključeva u stupcima. Primijetimo da je u tablici Stud mbrStud primarni ključ,
a u tablici Ispit strani ključ (tj. postoji relacija među tim dvjema tablicama). U tablici Pred sifPred
je primarni ključ, a u tablici Ispit je strani ključ. Povežimo sada te tablice preko ključeva
unutarnjim spajanjem - JOIN.
Kako nam se upit proširio većim brojem tablica, moguće je skratiti pisanje koda uvođenjem
ALIAS naziva. Umjesto da pišemo cijeli naziv tablice Ispiti pisat ćemo samo slovo i.Umjesto
Stud pišemo s i umjesto tablice Pred p.
SELECT imeStud,prezStud,nazPred,ocjena
FROM ispit i
JOIN stud s ON i.mbrStud=s.mbrStud
JOIN pred p ON p.sifPred=i.sifPred

ZADATAK 3.20
Ispišite nazive kolegija i oznake dvorana u kojima imaju rezerviran termin. Ispišite i naziv
organizacijske jedinice kojoj kolegij pripada.
Rješenje:
SELECT nazPred,oznDvorana, nazOrgjed
FROM pred JOIN rezervacija
ON pred.sifPred=rezervacija.sifPred
JOIN orgjed ON orgjed.sifOrgjed=pred.sifOrgjed

ZADATAK 3.21

Ispišite podatke o studentima i njihovim mjestima stanovanja za one studente koji su barem
jednom pali na ispitu „Osnove baza podataka“.
Rješenje:
SELECT DISTINCT imeStud,prezStud,nazMjesto
FROM stud

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

JOIN mjesto ON mjesto.pbr=stud.pbrStan JOIN ispit ON


stud.mbrStud=ispit.mbrStud JOIN pred ON pred.sifPred=ispit.sifPred
WHERE nazPred='Osnove baza podataka' AND ocjena=1

ZADATAK 3.22
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.
Rješenje:
SELECT imeNastavnik, prezNastavnik, nazMjesto, nazZupanija, nazPred,ocjena
FROM nastavnik
JOIN mjesto ON mjesto.pbr=nastavnik.pbrStan
JOIN zupanija ON zupanija.sifZupanija=mjesto.sifZupanija
JOIN ispit ON ispit.sifNastavnik=nastavnik.sifNastavnik
JOIN pred ON pred.sifPred=ispit.sifPred
WHERE ocjena=2 OR ocjena=3
ORDER BY nazPred

ZADATAK 3.23

Ispišite ime i prezime studenta, te mjesto i županiju u kojoj su rođeni. Nakon toga dodajte
mjesto i županiju u kojoj stanuju.
Rješenje:
Ovo nam je nešto kompliciraniji upit. Trebamo ispisati mjesto i županiju u kojoj je student rođen
i u kojoj stanuje. U tablici Stud su spremljeni samo poštanski broj mjesta rođenja (pbrRod) i
mjesta stanovanja (pbrStan). Kako bismo saznali naziv mjesta rođenja i stanovanja, moramo
povezati te poštanske brojeve s poštanskim brojem pbr tablice Mjesto. No, te veze moramo
nekako nazvati kako bismo ih razlikovali. Nazvat ćemo ih m i m2. Iz istog razloga, veze koje
kreiramo zbog dobivanja naziva županije u kojoj je student rođen i u kojoj sada živi, nazvat
ćemo z i z2.

SELECT imeStud,prezStud,
m.nazMjesto AS 'Mjesto rođenja',
z.nazZupanija AS 'Županija rođenja',
m2.nazMjesto AS 'Mjesto Boravka',
z2.nazZupanija AS 'Županija boravka'
FROM stud s
JOIN mjesto m ON m.pbr=s.pbrRod
JOIN zupanija z ON z.sifZupanija=m.sifZupanija
JOIN mjesto m2 ON s.pbrStan=m2.pbr
JOIN zupanija z2 ON z2.sifZupanija=m2.sifZupanija
3. poglavlje: RAD S PODACIMA U BAZI Str. 29

ZADATAK 3.24

Ispišite nazive mjesta u kojima je barem jedan student i rođen i stanuje. Imena mjesta smiju
se pojaviti samo jednom.
Rješenje:
Ovdje u kriteriju ispitujemo je li poštanski broj mjesta stanovanja studenta jednak poštanskom
broju mjesta rođenja. Duplikati u ispisu rezultata nas ne zanimaju, pa ih izbacujemo naredbom
DISTINCT.
SELECT DISTINCT nazMjesto
FROM mjesto JOIN stud
ON mjesto.pbr=stud.pbrStan
WHERE pbrStan=pbrRod

ZADATAK 3.25

Ispišite podatke o nastavnicima koji su ispitivali studente koji stanuju u istoj županiji u kojoj
stanuje i nastavnik.
Rješenje:
SELECT DISTINCT imeNastavnik,prezNastavnik
FROM nastavnik
JOIN ispit ON ispit.sifNastavnik=nastavnik.sifNastavnik
JOIN stud ON ispit.mbrStud=stud.mbrStud
JOIN mjesto m1 ON m1.pbr=stud.pbrStan
JOIN mjesto m2 ON m2.pbr=nastavnik.pbrStan
WHERE m1.sifZupanija=m2.sifZupanija

ZADATAK 3.26
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.
Rješenje:
SELECT imeStud,prezStud
FROM stud
JOIN mjesto m1 on stud.pbrrod = m1.pbr
JOIN mjesto m2 on stud.pbrstan = m2.pbr
WHERE pbrrod <> pbrstan AND m1.sifzupanija = m2.sifzupanija

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

ZADATAK 3.27

Ispišite podatke o studentima i nastavnicima koji imaju ista prezimena.


Rješenje:
SELECT stud.*, nastavnik.*
FROM stud,nastavnik
WHERE stud.prezStud=nastavnik.prezNastavnik
4. poglavlje: SQL - IZMJENE U BAZI
PODATAKA
Str. 32 OSNOVE SQL-A I BAZA PODATAKA

IZMJENE PODATAKA U TABLICAMA


ZADATAK 4.1
U bazi podataka Upisi_polaznika, u tablici Tečajevi promijenite naziv tečaja
P02 iz „Microsoft Word“ u „Osnove obrade teksta – MS Word“.
Rješenje:
Podatke mijenjamo u tablici naredbom UPDATE.
USE Upisi_polaznika
UPDATE Tecajevi
SET naziv_tecaja='Osnove obrade teksta – MS Word'
WHERE naziv_tecaja='Microsoft Word'

ZADATAK 4.2
U tablici Upisi za polaznika sa šifrom 6 promijenite šifru tečaja u O03.
Rješenje:
USE Upisi_polaznika
UPDATE Upisi
SET sifra_tecaja='O03'
WHERE sifra_polaznika=6

ZADATAK 4.3
Iz tablice Upisi izbrišite sve zapise gdje je šifra tečaja P01.
Rješenje:

USE Upisi_polaznika
DELETE Upisi
WHERE sifra_tecaja='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.
Rješenje:
Novu tablicu koristeći podatke iz drugih tablica kreiramo naredbom SELECT INTO. U Novu
tablicu PredmetiDvorane spremit ćemo podatke iz stupaca oznDvorana, nazPred, sat.
USE Fakultet
SELECT oznDvorana, nazPred, sat INTO PredmetiDvorane
FROM pred join rezervacija
ON pred.sifPred=rezervacija.sifPred
4. poglavlje: SQL - IZMJENE U BAZI PODATAKA Str. 33

ZADATAK 4.5

Kreirajte pogled Stanovanje koji ispisuje imena i prezimena nastavnika s nazivom mjesta u
kojemu stanuju.
Rješenje:
USE Fakultet
GO
CREATE VIEW Stanovanje
AS
SELECT imeNastavnik,prezNastavnik,nazMjesto
FROM nastavnik JOIN mjesto
ON nastavnik.pbrStan=mjesto.pbr

Za pregled podataka iz kreiranog pogleda koristimo sljedeću naredbu:


SELECT * FROM Stanovanje

ZADATAK 4.6
Kreirajte pogled ProlaznostIspita koji ispisuje ime i prezime studenta, naziv i ocjenu za svaki
ispit, te ime i prezime profesora koji je održao ispit.
Rješenje:
USE Fakultet
GO
CREATE VIEW ProlaznostIspita
AS
SELECT imeStud, prezStud, nazPred, ocjena, imeNastavnik, prezNastavnik
FROM stud JOIN ispit
ON stud.mbrStud=ispit.mbrStud
JOIN nastavnik
ON nastavnik.sifNastavnik=ispit.sifNastavnik
JOIN pred
ON pred.sifPred=ispit.sifPred

Za pregled podataka iz kreiranog pogleda koristimo sljedecu naredbu:


SELECT * FROM Prolaznostispita

www.algebra.hr
5. poglavlje: FUNKCIJE
Str. 36 OSNOVE SQL-A I BAZA PODATAKA

FUNKCIJE
ZADATAK 5.1
Ispišite ime i prezime te mjesto rođenja studenata kojima ime počinje slovom F.
Rješenje1:
Ovaj upit je moguće riješiti na 2 načina. Riješimo ga prvo koristeći tekstualnu funkciju LEFT.
Pomoću nje uzet ćemo samo prvo slovo F iz imena studenata.
SELECT imeStud,prezStud,nazMjesto
FROM stud JOIN mjesto
ON mjesto.pbr=stud.pbrRod
WHERE LEFT(imeStud,1)='F'

Rješenje2:
Zadatak možemo riješiti i koristeći operator LIKE.
SELECT imeStud,prezStud,nazMjesto
FROM stud JOIN mjesto
ON mjesto.pbr=stud.pbrRod
WHERE imeStud LIKE 'F%'

ZADATAK 5.2.

Ispišite ime i prezime nastavnika koji živi u mjestu koje na trećem mjestu ima slovo Z.
Rješenje:
SELECT imeNastavnik,prezNastavnik
FROM nastavnik
JOIN mjesto ON mjesto.pbr=nastavnik.pbrStan
WHERE SUBSTRING(nazMjesto,3,1)='Z'

ZADATAK 5.3

Ispišite ime i prezime studenata te imena i prezimena nastavnika koji u imenu na petom mjestu
imaju isto slovo.
Rješenje:
SELECT imeStud,prezStud,imeNastavnik,prezNastavnik
FROM stud
JOIN ispit
ON ispit.mbrStud=stud.mbrStud
JOIN nastavnik
ON ispit.sifNastavnik = nastavnik.sifNastavnik
WHERE
SUBSTRING(imeStud,5,1)=SUBSTRING(imeNastavnik,5,1)
5. poglavlje: FUNKCIJE Str. 37

ZADATAK 5.4

Ispišite nazive županija kojima je duljina imena duža od 13 znakova, a kraća od 20 znakova.
Rješenje:
SELECT nazZupanija
FROM zupanija
WHERE LEN(nazZupanija) BETWEEN 13 AND 20

ZADATAK 5.5

Ispišite ime i prezime studenata koji su rođeni u svibnju.


Rješenje:
SELECT imeStud, prezStud
FROM stud
WHERE DATENAME(m,datRodStud)='may'

Rješenje2:
SELECT imeStud, prezStud
FROM stud
WHERE MONTH(datRodStud)=5
ZADATAK 5.6
Ispišite ime i prezime studenata koji su na ispit izašli između 10. i 20. u mjesecu.
Rješenje:
SELECT DISTINCT imeStud,prezStud
FROM stud JOIN ispit
ON stud.mbrStud=ispit.mbrStud
WHERE DAY(datIspit) BETWEEN 10 AND 20

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.
Rješenje:
SELECT imeNastavnik, prezNastavnik, m1.nazMjesto, imeStud, prezStud,
m2.nazMjesto
FROM nastavnik
JOIN ispit ON ispit.sifNastavnik=nastavnik.sifNastavnik
JOIN mjesto m1 ON m1.pbr=nastavnik.pbrStan
JOIN stud ON stud.mbrStud=ispit.mbrStud
JOIN mjesto m2 ON m2.pbr=stud.pbrRod
WHERE MONTH(datIspit)=6 AND m1.nazMjesto=m2.nazMjesto

www.algebra.hr
6. poglavlje: POHRANJENE PROCEDURE

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

6.1 POHRANJENE PROCEDURE


ZADATAK 6.1
Kreirajte primjer pohranjene procedure bez parametara, tako da ispišete ime i prezime
nastavnika, mjesto stanovanja i županiju nastavnika. Isto tako, napišite naziv kolegija za
nastavnike koji su ispitivali studente prilikom čega su navedeni studenti dobili ocjenu 2 ili 3 iz
tog kolegija. Pozovite novokreiranu procedure.
Rješenje:
CREATE PROCEDURE ListaNastavnika
AS
BEGIN
SELECT imeNastavnik, prezNastavnik, m1.nazMjesto, imeStud, prezStud, m2.naz
Mjesto
FROM nastavnik
JOIN ispit ON ispit.sifNastavnik=nastavnik.sifNastavnik
JOIN mjesto m1 ON m1.pbr=nastavnik.pbrStan
JOIN stud ON stud.mbrStud=ispit.mbrStud
JOIN mjesto m2 ON m2.pbr=stud.pbrRod
WHERE MONTH(datIspit)=6 AND m1.nazMjesto=m2.nazMjesto;
END;

EXEC ListaPolaznika;

ZADATAK 6.2

Kreirajte primjer pohranjene procedure bez parametara, tako da ispišete nazive predmeta i
organizacijske jedinice kojima pripadaju za one kolegije koji imaju više od 20 upisanih
studenata. Pozovite novokreiranu procedure.
Rješenje:
CREATE PROCEDURE ListaPredmetaOrgJedinica
AS
BEGIN
SELECT nazPred,nazOrgjed,upisanoStud
FROM pred JOIN orgjed
ON pred.sifOrgjed=orgjed.sifOrgjed
WHERE upisanoStud>20;
END;

EXEC ListaPolaznika;
6. poglavlje: POHRANJENE PROCEDURE Str. 41

ZADATAK 6.3

Kreirajte primjer pohranjene procedure s parametrima koja će unositi zapise u tablicu


„polaznici“, a nalazi se u bazi podataka „Upisi_polaznika“. Pozovite novokreiranu proceduru.
Rješenje:
CREATE PROCEDURE NoviPolaznik(
@param_sifra AS int,
@param_ime AS nvarchar(50) ,
@param_prezime AS nvarchar(50) ,
@param_mjesto_stanovanja AS nchar(25)
)
AS
BEGIN
INSERT INTO polaznici (sifra, ime, prezime, mjesto_stanovanja) VALUES
(@param_sifra, @param_ime, @param_prezime, @param_mjesto_stanovanja);
END;

EXEC NoviPolaznik 1, 'Ana', 'Milić', 'Zagreb';


EXEC NoviPolaznik 2, 'Sanja', 'Tarak', 'Split';
EXEC NoviPolaznik 2, 'Mladen', 'Gork', 'Osijek';
Str. 42 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čuju
relacije među tablicama, a podebljan naziv stupca označava ograničenje NOT NULL.

You might also like