You are on page 1of 33

da ne gleda velika mala slova gornji primjer s ilike,

sve ispadne za primjer gore kartezijev produkt

katedra koja ima tocno 1 predmet ;

spajamo katedru i broj predmeta grupiran prema katedri, having count(*) = max od svih brojeva
predmeta
max od svih brojeva predmeta = ( select max(novoime.broj_predmeta) from ( select katedra_id,
count(*) as broj_predmeta from predmeti group by katedra_id) as novoime);

AKTIVNI KOMPLEMENT

AKTIVNI komplement

create domain pozitivan_broj as smallint default 0 check( value>0).


create table brojevi_domena ( broj pozitivan_broj).
alter domain , drop domain
create unique index ime on tablica(redovi); drop index ;
create table ime as select distinct ime2 from ime

psql < baza


psql < brisi
Sekvence su objekti kojima se generiraju brojaci,
CREATE SEQUENCE brojac;
SELECT * FROM brojac;
SELECT NEXTVAL (brojac);
SELECT CURRVAL (brojac);
SELECT SETVAL(brojac',120);
SELECT NEXTVAL (brojac);
DROP SEQUENCE brojac;
RESTRICT ne dozvoljava promjenu ili brisanje
Indeksi su objekti sustava za upravljanje bazama podataka
koji poboljavaju upitne performanse baze podataka.
Indeksi omogucuju bre pretraivanje podataka u
tablicama
RESTRICT ne dozvoljava promjenu ili brisanje PK
CASCADE kaskadno se radi promjena i brisanje
SET NULL vrijednost VK postaje NULL
SET DEFAULT vrijednost VK se postavlja na DEFAULT
B-tree indeksi
R-tree indeksi
Hash indeksi
GiST indeksi

Transakcija zapocinje naredbom BEGIN; nakon toga


dolaze preostale naredbe sve do naredbe COMMIT ili
ROLLBACK (ABORT):
GRANT SELECT ON autor TO PUBLIC;

SELECT ("read")
w -- UPDATE ("write")
a -- INSERT ("append")
d -- DELETE
R -- RULE
x -- REFERENCES
t TRIGGER

REVOKE SELECT ON autor FROM PUBLIC;


SELECT prezime, ime
INTO autori_clanovi
FROM autor
UNION
SELECT prezime, ime FROM clan;
CREATE FUNCTION zbroji (integer, integer)
RETURNS integer
AS 'select $1 + $2;'
LANGUAGE SQL;

DROP FUNCTION zbroji (integer, integer);

Kreirajte funkciju koja brie sve podatke iz


tablice autori_clanovi:

CREATE FUNCTION isprazni() RETURNS void AS '


DELETE FROM autori_clanovi; '
LANGUAGE SQL;
SELECT isprazni();

INSERT INTO autori_clanovi


SELECT prezime, ime FROM autor
UNION SELECT prezime, ime FROM clan;

CREATE FUNCTION provjera_datuma_vracanja () RETURNS


trigger as '
BEGIN
IF new.datum_posudbe>new.datum_vracanja THEN
RAISE EXCEPTION '' Datum vracanja je manji od datuma

posudbe!'';
END IF;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
CREATE TRIGGER provjera_datuma_vracanja BEFORE INSERT
OR UPDATE ON posudba FOR EACH ROW EXECUTE
PROCEDURE provjera_datuma_vracanja();

INSERT INTO posudba VALUES (1,1,'200701-10','2007-01-05');


ERROR: Datum vracanja je manji od datuma
posudbe!

DROP TRIGGER provjera_datuma_vracanja ON


posudba;
DROP FUNCTION provjera_datuma_vracanja();

Zadatak 1
Kreirajte funkciju koja ima dva parametra,
prezime i ime autora, te ta dva parametra
sprema u tablicu autora (parametrima se
pristupa pomocu $1 i $2). Nakon toga,
kreirajte transakciju u kojoj se koristi ta
funkcija.
CREATE FUNCTION podaci (varchar, varchar)
RETURNS void AS '
INSERT INTO autor VALUES (default, $1, $2); '
language SQL;
33

Zadatak 2
Koritenjem SELECT INTO naredbe
kreirajte tablicu koja sadri broj posudbi
prema prezimenima i imenima clanova koji
su posudili knjige. Kreirajte funkciju koja
ima jedan parametar (broj), te aurirajte
vrijednost atributa posudba u novokreiranoj
tablici tako da vrijednost u svim redovima
povecate za proslijedeni parametar.

SELECT prezime, ime, count(*) as broj_pos


INTO Posudbe
FROM clan, posudba
WHERE posudba.clan = clan.sifra
GROUP BY 1, 2;
CREATE FUNCTION azuriraj(integer)
RETURNS void AS '
UPDATE posudbe SET broj_pos=broj_pos + $1;
language SQL;
34

Zadatak 3
Kreirajte funkciju koja vraca najveci broj
posudbi.
CREATE FUNCTION clan_pos() RETURNS bigint AS '
SELECT broj_pos FROM posudbe
ORDER BY broj_pos DESC LIMIT 1;
' language SQL;
SELECT clan_pos();
35

Zadatak 4
Kreirajte funkciju koja za danog autora (ime
i prezime autora) vraca broj knjiga koje je
taj autor napisao.
36

Zadatak 4 - rjeenje
CREATE FUNCTION br_knjiga (varchar, varchar)
RETURNS bigint AS '
SELECT count(*) FROM autor, autor_knjige
WHERE autor.sifra = autor_knjige.autor AND
autor.prezime= $1 AND autor.ime = $2
GROUP BY autor.prezime, autor.ime;'
LANGUAGE SQL;

1. Koja naredba u PostgreSQL-u omogudava brisanje kreiranih indeka (dvije kljune rijei)?
DROP INDEX
2. Prilikom davanja prava nad nekom tablicom odreenom korisniku u PostgreSQL-u taj korisnik ni
pod kojim uvjetom ne moe ta prava dati drugim korisnicima.
NETONO
3. Koja se to kluna rije koristi prilikom kreiranja upita, a koja nam omogudava specificiranje
tablice (tablica) iz koje (kojih) se dohvadaju podaci ?
FROM
4. Prilikom kreiranja upita koja kljuna rije nam omogudava da provjerimo da je vrijednost nekog
atributa u skupu vrijednosti koje nam vrada pod-upit ?
WHERE EXISTS
5. Naredbom ALTER TABLE nije mogude promjeniti tip podatka odreenog atributa.
NETONO.
6. Prilikom kreiranja tablice definicija atributa mora obavezno sadravati:
IME ATRIBUTA I TIP PODATKA
7. Da bi slogove u upitu grupirali koristimo klauzulu
GROUP BY
8. Kad oduzimamo prava (npr. Koritenje tablice) nekom korisniku, ispred korisnikog imena kojem
oduzimamo ovlasti dolazi koja kljuna rije ?
FROM, a kada dodajemo stoji kljuna rije TO.
9. Naredba UPDATE slui dodavanju novih vrijednosti u tablicu.
NETONO, slui za auriranje postojedih vrijednosti u tablici.
10. SQL je za krajnjeg korisnika proceduralan jezik.
NETONO, one je proceduralan jezik za korisnika.
11. Koja kljuna rije omogudava spajanje dva upita i dohvat onih slogova koji se nalaze u prvom
upitu i ne nalaze se u drugom?
EXCEPT ili MINUS.
12. Naredbom UPDATE mogude je
AURIRATI VIE SLOGOVA, odjednom!
13. Funkcija kreirana u PostgreSQL-u mora uvijek vradati neku vrijednost.
TONO, ona mora vratiti neku vrijednost!

14. NULL znak odgovara nuli odnosno praznini.


Tono. ???
15.Prilikom kreiranja upita i usporeivanja vrijednosti odreenog atributa sa unaprijed definiranim
predlokom u PostgreSQL-u, koji posebni znak nam zamjenjuje jedan znak ?
_ (underscore), a vie znakova zamjenjuje % (postotak)
16. Prilikom dodavanja novih slogova u tablicu uvijek je potrebno navesti imena atributa u koje
elimo spremiti vrijednost koje unosimo.
TONO!
17. Koja se kljuna rije koristi prilikom kreiranja upita, a koja nam omogudava specificiranje uvjeta
koje slogovi u odgovoru moraju zadovoljavati ?
WHERE .
18. U PostgreSQL-u ne postoji mogudnost da poveemo dva upita s istim brojem atributa (i tipom
podatka) u odgovoru.
NETONO, to moemo napraviti preko naredbe INTERSECT.
19. Ako korisnik eksplicitno ne navede najmanju i najvedu vrijednost sekvence u PostgreSQL-u, one
su zadane automatski.
TONO!
20. Korisniki definirane funkcije mogu biti napisane samo u SQL-u.
TONO!
21. Koja kljuna rije u PostgreSQL-u prilikom kreiranja tablice omogudava da se tablica kreira na
temelju neke ved postojede tablice, s time da meu njima (nakon kreiranja nove tablice) ne postoji
nikakva veza?
LIKE INTO
22. Koja kljuna rije prilikom kreiranja upita (koji sadri pod-upit) provjerava da li pod-uvijet vrada
slogove ili ne?
EXISTS IN
23. Naredba SELECT slui iskljuivo dohvatu podataka i ne moe se koristiti za nita drugo.
NETONO.
24.Naredbom ALTER TABLE u tablicu nije mogude dodati tablino ogranienje.
NETONO.
25.Koja naredba omogudava brisanje sekvence u PostgreSQL-u? (dvije kljune rijei)
DROP SEQUENCE;

26. Koja naredba omogudava unos novih vrijednosti u tablicu?


INSERT
27. Koliko je ukupno pravila definirao autor relacijskog modela, a koja omogudavaju utvrivanje da
li se radi o relacijskom sustavu ili ne ?
12 (sa nultim 13)
28.Da bi pohranili datum i vrijeme u PostgreSQL-u koristimo koji tip podatka?
DATETIME
29. Svako ogranienje nad atributom mora imati ime.
NETONO.
30. Da bi rezultat upita bio posloen abecednim redom, koristimo klauzulu
ORDER BY
1. to od entiteta,veza i atributa se najede ne nalazi na era dijagramu?
atributi
2. Brisanje objekta o kojem ovise neki drugi objekti nije mogude? T ili N?
tono
3. Prilikom zadavanja upita sam rezultat upita mogude je sortirati samo po jednom atributu. T ili N?
netono
4. Prilikom kreiranja upita i usporeivanja vrijednosti odreenog atributa sa unaprijed definiranim
predlokom u PostgreSQLu, koji posebni znak nam zamjenjuje jedan znak?
_
5. Ako prilikom zadavanja nekog upita u odgovoru (umjesto originalnog imena atributa) elimo da
se ispie neko drugo ime , koristim koju rije?
As
6. Koja kljuna rije omoguduje implementaciju vanjskog kljua ,tj. Da se vrijednost referencira na
neku drugu vrijednost (ogranienje na razini atributa)?
REFERENCES.
7. Prilikom kreiranja upita u psql-u koju kljunu rije koristimo da ograniimo broj slogova u
odgovoru?
limit
8. koja naredba omogudava unos slogova u tablicu? (jedna rije)
insert

9. koja funkcija nam omoguduje da vrijednost sekvence u sqlu postavimo na neku novu vrijednost
(jedna rije)
setval
10. prilikom brisanja objekta, koju je kljunu rije potrebno dodati naredbi za brisanje pa da bi se
tim objektom izbrisali i svi (drugi) s njime povezani objekti?
from
11. koja naredba ne spada u naredbe dml-a? Drop,delete,insert,update?
drop
12. koja kljuna rije omoguduje da se iz odgovora na postavljeni upit iskljue grupe koje ne
zadovoljavaju navedeni uvjet?
except
13. koja je to kljuna rije koja se navodi kod kreiranja objekata , a koja nam omoguduje da kreirani
objekt bude privremenog karaktera?
temp
14. to od navedenog ne spada direktno u relacijski model? Relacijska shema,relacija,entitet, slog
slog, mislim
1. Definirajmo SQL upit koji vrada sve one nazive knjiga koje imaju definirani ISBN:
SELECT naziv
FROM knjiga
WHERE isbn X;
X = IS NOT NULL
2. Kreirajte funkciju broj koja za danog autora (funkcija prima prezime autora kao prvi argument
i ime kao drugi) vrada broj knjiga koje je taj autor napisao.
CREATE FUNCTION X1 (varchar, X2) RETURNS X3 AS X4
SELECT count(*) from autor, autor_knjige
WHERE autor.sifra=autor_knjige.autor AND autor.prezime = X5 AND autor.ime = X6
GROUP BY autor.prezime,autor.ime
LANGUAGE X7;
X3 = BIGINT

3. Recimo da treba dodati imenovano ogranienje na razini tablice kojim kolona sifra postaje
primarni klju. to treba upisati umjesto x kako bi naredba bila ispravna?
ALTER TABLE temp ADD x pk1 PRIMARY KEY (sifra);
X = CONSTRAINT
4. Sustav za upravljanje bazama podataka MS Access ne podrava naredbu GRANT.
NETONO
5. to od navedenog je tono?
GRANT TO PUBLIC SELECT ON autor;
GRANT autor ON SELECT TO PUBLIC;
GRANT PUBLIC ON SELECT TO autor;
GRANT SELECT ON autor TO PUBLIC; <--- TOCNO
6. Kreirajte tablicu osobe u koju de biti umetnuti svi lanovi i autori koji postoje u bazi (njihova
prezimena i imena). to treba dodati u upit kako bi on bio ispravan (umjesto x dolazi to) ?
SELCT prezime, ime
X
FROM autor
UNION
SELECT prezime,ime FROM clan;
X = INTO osobe
7. Kreirajte pogled na temelju upita kojim se vrada broj posudbi prema datumu posudbe, ali samo
ako je broj posudbi prema datumu posudbe minimalno 2. to nedostaje u sljededem pogledu kako
bi on bio ispravan (umjesto X dolazi to) ?
CREATE VIEW pos2 AS
SELECT datum_posudbe,count(*)
FROM posudba
GROUP BY x
HAVING count(*)>1;
X = datum_posudbe
(ili 1)
8. Promjenite strukturu tablice izdavac i dodajte atribut adresa text.
ALTER TABLE izdavac ADD COLUMN adresa text;

9. Dajte svima pravo brisanja iz tablice izdavac (dobivene ovlasti ne mogu se dalje davati).
GRANT DELETE ON izdavac TO PUBLIC;
10. Kreirajte funkciju broj koja za danog autora (funkcija prima prezime autora kao prvi
argument i ime kao drugi) vrada broj knjiga koje je autor napisao.
CREATE FUNCTION X1 (varchar,X2) returns X3 AS X4
SELECT count(*) from autor,autor_knjige
WHERE autor.sifra=autor_knjige.autor AND autor.prezime=X5 AND autor.ime=X6
GROUP BY autor.prezime,autor.ime
Language X7;
X5 = $1
11. Dodajte dva lana u tablicu lanova. Kreirajte upit koji vrada prezimena clanova koji nisu
posudili niti jednu knjigu (operator in).
INSERT INTO clan(prezime,ime) values('Ivic','Ivo');
INSERT INTO clan(prezime,ime) values('Anic','Ana');
SELECT prezime,sifra FROM clan WHERE sifra IN (SELECT clan FROM posudba);

12. Zaponite transakciju koja moe samo itati podatke, s time da moe vidjeti podatke neke
druge transakcije koja je u meuvremenu zavrila s izvravanjem.
BEGIN ISOLATION LEVEL SERIALIZABLE READ ONLY;
13. Neka je kreirana tablica filmovi, s tim da postoji atribut trajanje koji oznaava trajanje filma
u minutama. Kreirajte upit koji vrada prosjeno trajanje svih filmova iz tablice filmovi.
SELECT AVG(trajanje) FROM filmovi;
14. Kod BNF notacije uglate zagrade oznaavaju opcionalnost.
TONO
15. Kreirajte funkciju broj koja za danog autora (funkcija prima prezime autora kao prvi
argument i ime kao drugi) vrada broj knjiga koje je autor napisao.
CREATE FUNCTION X1 (varchar,X2) returns X3 AS X4
SELECT count(*) from autor,autor_knjige
WHERE autor.sifra=autor_knjige.autor AND autor.prezime=X5 AND autor.ime=X6
GROUP BY autor.prezime, autor.ime;

Language X7;
X7 = SQL
Kreirajte funkciju broj koja za danog autora (funkcija prima prezime autora kao prvi argument i
ime kao drugi) vrada broj knjiga koje je taj autor napisao.
CREATE FUNCTION X1 (varchar, X2) RETURNS X3 AS X4
SELECT count(*) from autor, autor_knjige
WHERE autor.sifra=autor_knjige.autor AND autor.prezime = X5 AND autor.ime = X6
GROUP BY autor.prezime,autor.ime
LANGUAGE X7;
x1= broj, x2= (50) , x3= BIGINT , x4= ' , x5= $1 , x6= $2, x7= SQL ,

1. Kreiraj tablicu dobavljaci sa atributima sifra (cjelobrojana vrijednost raste automatski


primarni kljuc, imenovano ogranicenje na razini reda) i naziv tekst duljine 30
CREATE TABLE dobavljaci (sifra SERIAL CONSTRAINT pk_dob PRIMARY
KEY,naziv VARCHAR (30));
2. Unesi redove u tablicu koristeci dvije varijante naredbe insert
INSERT INTO dobavljaci VALUES (default, 'dobavljac1'), (default, 'dobavljac2');
INSERT INTO dobavljaci (naziv) VALUES ('dobavljac3'), ('dobavljac4');
3. Kreiraj tablicu artikli sa atributima sifra ( tekst duljine 13 primarni kljuc), naziv i
dobavljac (vanjski kljuc referencira se na sifru dobavljaca iz tablice dobavljaci) i
popuni tablicu, da neki artikli nemaju dobavljaca a neki dobavljaci ne dostavljaju ni
jedan artikl sa dvije varijante naredbe insert
CREATE TABLE dobavljaci (sifra SERIAL CONSTRAINT pk_dob PRIMARY
KEY,naziv VARCHAR (30));
INSERT INTO artikli VALUES (1, 'artikl1', 1);
INSERT INTO artikli VALUES (2, 'artikl1',NULL);
INSERT INTO artikli (sifra, naziv) values (3,'artikl3');
INSERT INTO artikli VALUES (4, 'artikl4',3);
4. Daj svima pravo citanja i brisanja nad artiklima
GRANT SELECT, DELETE ON artikli TO PUBLIC
5. Kreiraj indeks nad atributom dobavljac u tablici artikli
CREATE INDEX indx_dob ON artikli (dobavljac);
6. Kreiraj novu tablicu koja je popunjena redcima koje vraca upit koji vraca sve artikle i
dobavljace bez obzira dali dobavljaci imaju artikl ili artikl ima dobvljaca
CREATE TABLE nova_tablica AS SELECT artikli.naziv AS artikl, dobavljaci.naziv AS
dobavljac FROM artikli FULL JOIN dobavljaci ON artikli.dobavljac = dobavljaci.sifra;

7. Kreiraj upit koji vraca broj artikala koje dobavlja dobavljac (koristi JOIN USING i
preimenovanje po potrebi)
SELECT naziv,podupit.broj_artikala FROM dobavljaci JOIN (SELECT dobavljac AS sifra,
COUNT (*) AS broj_artikala FROM artikli GROUP BY 1) podupit USING (sifra);
(Ovaj ne ispisuje 0 za dobavljace koji ne dostavljaju ni jedan artikl, donji ispisuje )
Moze i na jednostavniji nacin
SELECT naziv, (SELECT COUNT (*) FROM artikli WHERE artikli.dobavljac =
dobavljaci.sifra) FROM dobavljaci;
Ovaj nacin bi isto priznao jer niko nije znao rijesiti sa USING JOIN

8. Kreiraj funkciju koja za ime dobavljaca vraca broj artikala koje dostavlja
CREATE OR REPLACE FUNCTION funkcija1 (varchar) RETURNS BIGINT AS 'SELECT
COUNT (*) FROM artikli, dobavljaci WHERE artikli.dobavljac = dobavljaci.sifra AND
dobavljaci.naziv = $1;' LANGUAGE SQL;

VJEBA 9 - RJEENJA

1. Nazive filmova sortirane uzlazno po abecedi

select * from film order by naslov desc;

2. Nazive filmova koji su izdani poslije 2000 sortirano po abecedi

select naslov from film where godina>2000 order by naslov;

3. Prosjeno trajanje svih filmova,

select avg(trajanje) from film;

4. Najdue i najkrade vrijeme trajanja nekog filma,

select min(trajanje), max(trajanje) from film;

5. Nazive kompanija za koje adresa nije poznata,

Select naziv from kompanija where adresa is not null;

6. Nazive filmova iji naslov zapoinje slovom 'D',

select naslov from film where naslov like 'D%';

7. Naziv(e) kompanije(a) koja nije vlasnike ni jednog filma (sa EXISTS),

select naziv from kompanija where not exists (select * from film where
kompanija.id=film.kompanija);

8. Ukupan broj slogova u tablici kompanija,

select count(*) from kompanija;

9. Broj kompanija za koje je adresa poznata,

select count(*) from kompanija where adresa is not null;

10. Broj filmova prema ifri filmske kompanije,

select kompanija, count(*) from film group by kompanija;

11. Naslov filma i naziv kompanije (za svaki film),

select naslov,naziv from film, kompanija where kompanija.id=film.kompanija;

12. Naslov filma, oznaku tipa filma i naziv kompanije (za svaki film),

select naslov, naziv, tip from film, kompanija, tipfilma where film.kompanija=kompanija.id and
film.tip=tipfilma.id;

13. Broj filmova prema nazivu kompanije,

select naziv, count(*) from kompanija, film where kompanija.id=film.kompanija group by naziv;

14. Nazive kompanija koje u vlasnitvu imaju barem 3 filma i

select naziv, count(*) from kompanija, film where kompanija.id=film.kompanija group by naziv
having count(*)>3;

15. Naite sve nazive filmova u vlasnitvu dane kompanije X.

select naslov from film, kompanija where kompanija.id=film.kompanija and kompanija.id=X;

ili

select naslov from film where kompanija in (select id from kompanija where naziv='X');

Napravite poglede na temelju upita pod brojem 10, 11 i 14.

Pogled upit10

create view upit10 as select kompanija, count(*) from film group by kompanija;
pozivanje: select * from upit10;

Pogled upit11
create view upit11 as select naslov,naziv from film, kompanija where kompanija.id=film.kompanija;
pozivanje: select * from upit11;

Pogled upit14
create view upit14 as select naziv, count(*) from kompanija, film where kompanija.id=film.kompanija
group by naziv having count(*)>3
pozivanje: select * from upit14;

Koritenjem naredbe ALTER TABLE dodajte atribut "telefon" u tablicu kompanija (po defaultu je
vrijednost null). Koritenjem iste naredbe dodajte imenovano ogranienje kojim se trai da
vrijednosti atributa "telefon" budu jedinstvene.

Dodavanje atributa telefon:

alter table kompanija add telefon char(9);

Dodavanje imenovanog ogranienja na atribut telefon:

alter table kompanija add constraint jedinstven unique(telefon);

Koritenjem SELECT INTO naredbe kreirajte tablicu na temelju upita br. 13

select naziv, count(*) as "broj_filmova" into proba from kompanija, film where
kompanija.id=film.kompanija group by naziv;

Kreirajte funkciju koja ima jedan argument (broj filmova), i koja brie iz novokreirane tablice one
kompanije koje imaju manje filmova od proslijeenog argumenta

create function azuriraj(integer) returns void as 'delete from proba where broj_filmova<$1;' language
sql;

pozivanje funkcije: select azuriraj(ovdje upiete br filmova, npr. ako upiete 2, iz gore kreiranje
tablice pomodu select into izbrisat de se sve one kompanije koje su izdale manje od 2 filma)

Nakon toga, kreirajte upit koji de odrediti nazive kompanija iz tablice kompanija koji su izbrisani
pozivom funkcije (koritenjem presjeka).

Koritenjem razlike:
select naziv from kompanija except select naziv from proba;

Koritenjem presjeka:
select naziv from kompanija where naziv not in (select naziv from kompanija intersect select naziv
from proba);

You might also like