Professional Documents
Culture Documents
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
SELECT ("read")
w -- UPDATE ("write")
a -- INSERT ("append")
d -- DELETE
R -- RULE
x -- REFERENCES
t TRIGGER
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();
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.
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!
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 ,
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
select naziv from kompanija where not exists (select * from film 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;
select naziv, count(*) from kompanija, film where kompanija.id=film.kompanija group by naziv;
select naziv, count(*) from kompanija, film where kompanija.id=film.kompanija group by naziv
having count(*)>3;
ili
select naslov from film where kompanija in (select id from kompanija where naziv='X');
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.
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);