Upload
marta-sostarec
View
18
Download
0
Embed Size (px)
Citation preview
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 poboljšavaju upitne performanse baze podataka.
• Indeksi omogucuju brže pretraživanje 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 briše 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,'2007-
01-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 Korištenjem SELECT INTO naredbe
kreirajte tablicu koja sadrži broj posudbi
prema prezimenima i imenima clanova koji
su posudili knjige. Kreirajte funkciju koja
ima jedan parametar (broj), te ažurirajte
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 - rješenje 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 ključne riječi)?
DROP INDEX
2. Prilikom davanja prava nad nekom tablicom određenom korisniku u PostgreSQL-u taj korisnik ni
pod kojim uvjetom ne može ta prava dati drugim korisnicima.
NETOČNO
3. Koja se to klučna riječ koristi prilikom kreiranja upita, a koja nam omogudava specificiranje
tablice (tablica) iz koje (kojih) se dohvadaju podaci ?
FROM
4. Prilikom kreiranja upita koja ključna 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 određenog atributa.
NETOČNO.
6. Prilikom kreiranja tablice definicija atributa mora obavezno sadržavati:
IME ATRIBUTA I TIP PODATKA
7. Da bi slogove u upitu grupirali koristimo klauzulu
GROUP BY
8. Kad oduzimamo prava (npr. Korištenje tablice) nekom korisniku, ispred korisničkog imena kojem
oduzimamo ovlasti dolazi koja ključna riječ ?
FROM, a kada dodajemo stoji ključna riješ TO.
9. Naredba UPDATE služi dodavanju novih vrijednosti u tablicu.
NETOČNO, služi za ažuriranje postojedih vrijednosti u tablici.
10. SQL je za krajnjeg korisnika proceduralan jezik.
NETOČNO, one je proceduralan jezik za korisnika.
11. Koja ključna 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
AŽURIRATI VIŠE SLOGOVA, odjednom!
13. Funkcija kreirana u PostgreSQL-u mora uvijek vradati neku vrijednost.
TOČNO, ona mora vratiti neku vrijednost!
14. NULL znak odgovara nuli odnosno praznini.
Točno. ???
15.Prilikom kreiranja upita i uspoređivanja vrijednosti određenog atributa sa unaprijed definiranim
predloškom u PostgreSQL-u, koji „posebni“ znak nam zamjenjuje jedan znak ?
_ (underscore), a više znakova zamjenjuje % (postotak)
16. Prilikom dodavanja novih slogova u tablicu uvijek je potrebno navesti imena atributa u koje
želimo spremiti vrijednost koje unosimo.
TOČNO!
17. Koja se ključna 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 povežemo dva upita s istim brojem atributa (i tipom
podatka) u odgovoru.
NETOČNO, to možemo napraviti preko naredbe INTERSECT.
19. Ako korisnik eksplicitno ne navede najmanju i najvedu vrijednost sekvence u PostgreSQL-u, one
su zadane automatski.
TOČNO!
20. Korisnički definirane funkcije mogu biti napisane samo u SQL-u.
TOČNO!
21. Koja ključna riječ u PostgreSQL-u prilikom kreiranja tablice omogudava da se tablica kreira na
temelju neke ved postojede tablice, s time da među njima (nakon kreiranja nove tablice) ne postoji
nikakva veza?
LIKE INTO
22. Koja ključna riječ prilikom kreiranja upita (koji sadrži pod-upit) provjerava da li pod-uvijet vrada
slogove ili ne?
EXISTS IN
23. Naredba SELECT služi isključivo dohvatu podataka i ne može se koristiti za ništa drugo.
NETOČNO.
24.Naredbom ALTER TABLE u tablicu nije mogude dodati tablično ograničenje.
NETOČNO.
25.Koja naredba omogudava brisanje sekvence u PostgreSQL-u? (dvije ključne riječi)
DROP SEQUENCE;
26. Koja naredba omogudava unos novih vrijednosti u tablicu?
INSERT
27. Koliko je ukupno pravila definirao autor relacijskog modela, a koja omogudavaju utvrđivanje 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 ograničenje nad atributom mora imati ime.
NETOČNO.
30. Da bi rezultat upita bio posložen abecednim redom, koristimo klauzulu
ORDER BY
1. Što od entiteta,veza i atributa se najčešde ne nalazi na era dijagramu?
atributi
2. Brisanje objekta o kojem ovise neki drugi objekti nije mogude? T ili N?
točno
3. Prilikom zadavanja upita sam rezultat upita mogude je sortirati samo po jednom atributu. T ili N?
netočno
4. Prilikom kreiranja upita i uspoređivanja vrijednosti određenog atributa sa unaprijed definiranim
predloškom u PostgreSQLu, koji „posebni“ znak nam zamjenjuje jedan znak?
_
5. Ako prilikom zadavanja nekog upita u odgovoru (umjesto originalnog imena atributa) želimo da
se ispiše neko drugo ime , koristim koju riječ?
As
6. Koja ključna riječ omoguduje implementaciju vanjskog ključa ,tj. Da se vrijednost referencira na
neku drugu vrijednost (ograničenje na razini atributa)?
REFERENCES.
7. Prilikom kreiranja upita u psql-u koju ključnu riječ koristimo da ograničimo 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 ključnu 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 ključna riječ omoguduje da se iz odgovora na postavljeni upit isključe grupe koje ne
zadovoljavaju navedeni uvjet?
except
13. koja je to ključna 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 ograničenje 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 podržava naredbu GRANT.
NETOČNO
5. Što od navedenog je točno?
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. Započnite transakciju koja može samo čitati podatke, s time da može vidjeti podatke neke
druge transakcije koja je u međuvremenu završila s izvršavanjem.
BEGIN ISOLATION LEVEL SERIALIZABLE READ ONLY;
13. Neka je kreirana tablica “filmovi”, s tim da postoji atribut “trajanje” koji označava trajanje filma
u minutama. Kreirajte upit koji vrada prosječno trajanje svih filmova iz tablice filmovi.
SELECT AVG(trajanje) FROM filmovi;
14. Kod BNF notacije uglate zagrade označavaju opcionalnost.
TOČNO
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;
VJEŽBA 9 - RJEŠENJA
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. Prosječno trajanje svih filmova,
select avg(trajanje) from film;
4. Najduže 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 započinje 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 vlasništvu imaju barem 3 filma i
select naziv, count(*) from kompanija, film where kompanija.id=film.kompanija group by naziv
having count(*)>3;
15. Nađite sve nazive filmova u vlasništvu 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;
Korištenjem naredbe ALTER TABLE dodajte atribut "telefon" u tablicu kompanija (po defaultu je
vrijednost null). Korištenjem iste naredbe dodajte imenovano ograničenje kojim se traži da
vrijednosti atributa "telefon" budu jedinstvene.
Dodavanje atributa „telefon“:
alter table kompanija add telefon char(9);
Dodavanje imenovanog ograničenja na atribut „telefon“:
alter table kompanija add constraint jedinstven unique(telefon);
Korištenjem 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 briše iz novokreirane tablice one
kompanije koje imaju manje filmova od proslijeđenog argumenta
create function azuriraj(integer) returns void as 'delete from proba where broj_filmova<$1;' language
sql;
pozivanje funkcije: select azuriraj(ovdje upišete br filmova, npr. ako upišete 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 (korištenjem presjeka).
Korištenjem razlike:
select naziv from kompanija except select naziv from proba;
Korištenjem presjeka:
select naziv from kompanija where naziv not in (select naziv from kompanija intersect select naziv
from proba);