SQL_zadaci1
ER model š ER model šeme baze podataka: Šema relacione baze
podataka: RADNIK({Mbr, Prez, Ime, Sef, Plata, Datr}, {Mbr})
PROJEKAT({Sifp, Nazp, Ruk}, {Sifp}) RADPROJ({Mbr, Sifp, BrSati},
{Mbr+Sifp}) RADNIK [Sef] ⊆ RADNIK [Mbr] PROJEKAT [Ruk] ⊆ RADNIK
[Mbr] RADPROJ [Mbr] ⊆ RADNIK [Mbr] RADPROJ [Sifp] ⊆ PROJEKAT [Sifp]
Null (PROJEKAT, Ruk) = ⊥
(0, N) (0, 1)
1. UPITI NAD JEDNOM TABELOM SELECT * FROM <naziv relacije
Prikaz svih torki date relacije – vrednosti svih obeleja 1.
Prikazati sadraj svake od relacija (tabela). SELECT * FROM radnik;
SELECT <lista obelezja> FROM <naziv relacije> <lista
obelezja> - niz naziva obeleja, razdvojenih zarezom, iza
poslednjeg elementa u nizu NE stavlja se zarez, redosled navoñenja
obeleja je proizvoljan 1. Prikazati prezimena i imena svih radnika.
SELECT prez, ime FROM radnik; Opcija DISTINCT SELECT DISTINCT
<lista obelezja> FROM <naziv relacije> 1. Prikazati sva
razliita prezimena i imena svih radnika. SELECT DISTINCT prez, ime
FROM radnik;
3
2. Prikazati sve razliite plate radnika. SELECT DISTINCT plata FROM
radnik 3. Prikazati razliite šifre projekata na kojima je angaovan
bar jedan radnik. SELECT DISTINCT Sifp FROM radproj;
SELECT <izraz_1 [AS] [ naziv_1]> {, <izraz_n [AS] [
naziv_n]>} FROM <naziv relacije>
Operatori: +, -, *, /, || Operandi: obelezja, funkcije, izrazi
Komentar znaenja zagrada: < > - oznaavaju da je potrebno
upisati neki konkretan naziv ili izraz, naravno, bez navodjenja
ovih zagrada [ ] – oznaavaju opcione delove naredbe { } – oznaavaju
deo naredbe koji se moze ponavljati 0, 1, 2 ili n puta 1. Prikazati
prezimena i imena radnika i njihove plate uvecane za 20%. SELECT
prez, ime, plata*1.20 FROM radnik; 2. Prikazati prezimena i imena
radnika i njihove plate uveane za 20%, pri emu naziv tree kolone
treba da bude Povisica. SELECT prez, ime, plata*1.20 as Povisica
FROM radnik; SELECT prez, ime, plata, plata*1.20 AS "plata sa po
visicom" FROM radnik; 3. Prikazati prezimena i imena radnika i
njihove plate uvecane za 20%, pri cemu naziv trece kolone treba da
bude Povecanje plate. SELECT prez, ime, plata*1.20 as “Povecanje
plate” FROM radnik;
4
4. Prikazati prezimena i imena radnika, ali u jednoj koloni, sa
jednim praznim mestom izmedju imena i prezimena. SELECT ime || ‘ ‘
|| prezime FROM radnik; 2. Prikazati maticni broj i u jednoj koloni
ime i prezime radnika SELECT mbr AS "maticni broj", ime||' '||prez
AS rad nik FROM radnik; SORTIRANJE SELECT <lista izraza> FROM
<naziv relacije> ORDER BY <obelezje [ASC|DESC]> {,
<obelezje [ASC|DESC]>} 1. Prikazati prezimena i imena radnika
i njihove plate, sortirano po rastuem redosledu plata. SELECT prez,
ime, plata FROM radnik ORDER BY plata; 2. Prikazati prezimena i
imena radnika i njihove plate, sortirano po rastuem redosledu plata
i unutar iste plate po opadajuem redosledu prezimena. SELECT prez,
ime, plata FROM radnik ORDER BY plata, prezime DESC; SELEKCIJA
torki SELECT <lista izraza> FROM <naziv relacije> WHERE
<uslov selekcije>
Operandi uslova: izrazi Operatori: <, >, <=, >=, =, !=,
<> 1. Prikazati vrednosti svih obeleja radnika sa datim
prezimenom (Mirkovic). SELECT * FROM radnik WHERE prez =
’Mirkovic’;
5
2. Prikazati prezimena, imena i plate radnika sa datim prezimenom
(Mirkovic). SELECT prez, ime, plata FROM radnik WHERE
prez=’Mirkovic’; SELECT prez, ime, plata FROM radnik WHERE LOWER
(prez)=’mirkovic’; SELECT prez, ime, plata FROM radnik WHERE
UPPER(prez)=’ MIRKOVIC’; 3. Prikazati prezimena, imena i plate
radnika sa platom vecom od 50000. SELECT prez, ime, plata FROM
radnik WHERE plata > 50000; 4. Prikazati prezimena, imena i
plate radnika sa platom vecom od 50000 i manjom od 60000. SELECT
prez, ime, plata FROM radnik WHERE plata > 50000 and plata <
60000; Dodatni operatori poredjenja: x BETWEEN y AND z x [NOT] LIKE
<uzorak> x IS [NOT] NULL _ zamena za jedan, % za vise znakova
Operatori testa pripadnosti: x [NOT] IN (< lista vrednosti>)
x *ANY (< lista vrednosti>) x *ALL (< lista vrednosti>)
* ∈∈∈∈ {<, >, <=, >=, =, !=} Operator egzistencije
vrednosti: [NOT] EXISTS (< lista vrednosti>) Prioritet
logickih operatora: 1. Operatori poredjenja, pripadnosti i
egzistencije/
6
2. NOT/ 3. AND/ 4. OR 4. Prikazati prezimena, imena i plate radnika
sa platom vecom od 50000 i manjom od 60000. SELECT prez, ime, plata
FROM radnik WHERE plata BETWEEN 50000 AND 60000; 5. Prikazati
prezimena, imena i plate radnika koji se zovu Petar ili Dragana.
SELECT prez, ime, plata FROM radnik WHERE ime = ‘Petar’ or ime
=’Dragana’; ILI SELECT prez, ime, plata FROM radnik WHERE ime IN
(‘Petar’, ’Dragana’); ILI SELECT prez, ime, plata FROM radnik WHERE
ime = ANY (‘Petar’, ’Dragana’); 5. Prikazati prezimena, imena i
plate radnika ije je drugo i poslednje slovo imena ‘a’. SELECT
prez, ime, plata FROM radnik WHERE ime LIKE ‘_a%a’; 6. Prikazati
prezimena, imena i plate radnika koji se ne zovu ni Aca ni Ivan.
SELECT prez, ime, plata FROM radnik WHERE ime <> ‘Petar’and
ime <>’Dragana’; ILI SELECT prez, ime, plata FROM radnik
WHERE ime NOT IN (‘Petar’, ’Dragana’); ILI SELECT prez, ime, plata
FROM radnik WHERE ime <> ALL (‘Petar’, ’Dragana’); 7.
Prikazati radnike koji su rodjeni izmedju 1980. i 1984. godine u
formatu: Radnik: Jovic Jovan ima platu: 15670 dinara. SELECT
‘Radnik: ’ || prez || ‘ ‘ || ime || ‘ ima pl atu: ‘ || plata || ‘
dinara.’ AS “Plate radnika” FROM radnik
7
8. Prikazati sve radnike koji zaradjuju vise od 15000 i koji nemaju
svog rukovodioca. SELECT * FROM radnik WHERE plata > 15000 AND
sef IS NULL 9. Prikazati sve radnike koji imaju rukovodioca. SELECT
* FROM radnik WHERE sef IS NOT NULL FORMATIRANJE KOLONA COLUMN Prez
FORMAT A10 COLUMN Plata FORMAT 99,999.00 SELECT * FROM radnik CLEAR
COLUMN SQL FUNKCIJE naziv_funkcije(agr1, arg2,...argn) funkcija
uvek ima vrednost datog tipa VRSTE FUNKCIJA:
• karakter funkcije • numericke funkcije • datumske funkcije •
funkcije za konverziju podataka • grupne funkcije •
KARAKTER FUNKCIJE: LOWER( char) UPPER(char) LTRIM( char)
RTRIM(char) CONCAT(char1,char2) REPLACE(char, trazeni string,
zamena) SUBSTR(char, m, n) LENGTH( char) vraca numericku
vrednost
8
NUMERICKE FUNKCIJE: ROUND(n[,m]) MOD(m,n) SIGN(n) ABS(n) SIN,
COS,TAN, SQRT ... DATUMSKE FUNKCIJE: ADD_MONTHS(d, n)
MONTHS_BETWEEN(d1, d2) SYSDATE FUKCIJE ZA KONVERZIJU PODATAKA
TO_CHAR(d[,fmt]) TO_CHAR(n[,fmt]) TO_DATE(char[,fmt])
TO_NUMBER(char[,fmt]) GRUPNE FUNKCIJE AVG([DISTINCT|ALL]n)
COUNT({*|[DISTINCT|ALL] izraz}) MAX( izraz) MIN( izraz)
SUM([DISTINCT|ALL] izraz) (| - oznaava da se moze koristiti samo
jedna od navedenih opcija) 1. Prikazati prezimena i imena radnika i
matini broj šefa, prikazujui 0 u sluaju kada je matini broj šefa
NULL. SELECT prez, ime, NVL(sef,0) AS Rukovodilac FROM radnik; 2.
Prikazati matini broj, prezime velikim slovima i tree i etvrto
slovo prezimena za svakog radnika. SELECT mbr, UPPER(prez),
SUBSTR(prez, 3,2) FROM radnik; 3. Prikazati prezimena i imena
radnika i njihove plate uveane za 6.33% zaokruene na jednu
decimalu. SELECT prez, ime, ROUND(plata*1.633, 1) AS Povisica FROM
radnik;
9
4. Prikazati prezimena i imena radnika i matini broj njihovog šefa,
pri emu za radnike koje nemaju šefa treba da piše DIREKTOR. SELECT
prez, ime, NVL(TO_CHAR(sef), ‘DIREKTOR’) FROM radnik; 5. Prikazati
prosecnu platu radnika. SELECT AVG(plata) FROM radnik; 6. Prikazati
najvee angaovanje (broj sati) radnika na projektu. SELECT
MAX(brsati) FROM radproj; 7. Prikazati broj razliitih rukovodilaca
projekata (koliko je radnika angaovanih kao rukovodioci projekata).
SELECT COUNT(DISTINCT ruk) FROM projekat; 8. Prikazati ukupan broj
radnika. SELECT COUNT(*) AS "Broj radnika" FROM radnik; 9.
Prikazati ukupan broj radnika koji imaju šefa. SELECT COUNT(sef)
FROM radnik; Grupisanje podataka tabele po kolonama sa istom
vrednošu SELECT <lista izraza> FROM <naziv relacije>
GROUP BY <obelezje> {, <obelezje>} SELECT sifp, mbr
FROM radproj GROUP BY sifp, mbr; 1. Za svaki projekat prikazati
šifru projekta i broj radnika koji su na njemu angaovani SELECT
sifp, COUNT(mbr) FROM radproj GROUP BY sifp;
10
2. Za svakog radnika prikazati matini broj i broj projekata na koji
je angaovan (pa moe maksimalni ili minimalni broj sati angaovanja
ili proseno angaovanje datog radnika) SELECT mbr, COUNT(sifp) FROM
radproj GROUP BY mbr; 3. Za svakog radnika koji je sef prikazati
matini broj i broj radnika kojima je šef i njihovu prosenu platu
SELECT sef, COUNT(mbr) FROM radnik GROUP BY sef; Selektovanje grupa
podataka SELECT <lista izraza> FROM <naziv relacije>
GROUP BY <obelezje> {, <obelezje>} HAVING <uslov
selekcije grupe> (WHERE se odnosi na torke, a HAVING na grupe
torki i uvek ide uz GROUP BY) 1. Prikazati šifru projekta i prosean
broj sati angaovanja radnika, za projekte na kojima je angaovano
više od 3 radnika. SELECT sifp, AVG(brsati) FROM radproj GROUP BY
sifp HAVING COUNT(mbr) > 2; 2. Prikazati šifru projekta i
prosean broj sati angaovanja radnika, za projekte ija je prva cifra
razliita od 1 i na kojima je angaovano više od 3 radnika. SELECT
sifp, AVG(brsati) FROM radproj WHERE
SUBSTR(TO_CHAR(sifp),1,1)<>’1’ GROUP BY sifp HAVING
COUNT(mbr) > 2;
11
2. SPAJANJE TABELA SELECT <lista izraza> FROM <lista
tabela> <lista tabela>: <naziv tabele> [<
sinonim>] {, < naziv tabele> [< sinonim>]} 1.
Prikazati sve mogue kombinacije radnika i projekata. SELECT * FROM
radnik, projekat; ILI SELECT * FROM radnik r, projekat p; SELECT
<lista izraza> FROM <lista tabela> WHERE
<uslov>
Operandi uslova: izrazi Operatori: <, >, <=, >=, =, !=,
<> 1. Prikazati nazive svih projekata i prezime i ime
njihovih rukovodilaca. SELECT nazp, prez, ime FROM radnik, projekat
WHERE ruk = mbr; 2. Prikazati prezimena i imena onih radnika koji
su rukovodioci nekog projekta. SELECT DISTINCT prez, ime FROM
radnik, projekat WHERE ruk = mbr; 3. Prikazati prezimena i imena
onih radnika koji su rukovodioci nekog projekta, sortirane po
rastuem prezimenu. SELECT DISTINCT prez, ime FROM radnik, projekat
WHERE ruk = mbr ORDER BY prez; 4. Prikazati matine brojeve,
prezimena i imena radnika, šifre i nazive projekata na kojima su
angaovani i broj sati angaovanja.
12
SELECT r.mbr, prez, ime, p.sifp, brsati FROM radnik r, radproj rp,
projekat p WHERE r.mbr = rp.mbr AND rp.sifp = p.sifp; 5. Prikazati
imena i prezimena radnika koji rade na projektu sa šifrom 201 i
urediti ih saglasno opadajuem redosledu imena. SELECT prez, ime
FROM radnik r, radproj rp WHERE r.mbr = rp.mbr and rp.sifp = 201
ORDER BY ime DESC; 6. Prikazati nazive projekata na kojima radi
radnik sa datim imenom i prezimenom. SELECT nazp FROM radnik r,
radproj rp, projekat p WHERE prez = ‘Peric’ AND ime = ‘Sandra’ AND
r.mbr = rp.mbr AND rp.sifp = p.sifp; 7. Prikazati nazive projekata
i ukupan broj sati angaovanja na projektima na kojima je ukupno
angaovanje vee od 10 sati. SELECT nazp, SUM(brsati) FROM projekat
p, radproj rp WHERE p.sifp=rp.sifp GROUP BY nazp HAVING SUM(brsati)
> 10; 8. Prikazati prezimena i imena radnika i broj projekata na
kojima su angaovani, za one radnike iji je prosean broj sati
angaovanja na projektima vei od 20 sati. SELECT prez, ime,
COUNT(sifp) FROM radnik r, radproj rp WHERE r.mbr = rp.mbr GROUP BY
prez, ime HAVING AVG(brsati) > 20; sva obeleja koja se navode u
SELECT, moraju se navesti u GROUP BY Spajanje tabele same sa sobom
SELECT <lista izraza> FROM <lista tabela>
Ista tabela se u <lista tabela> pojavljuje najmanje dva puta
sa razliitimm sinonima (ulogama)
13
1. Za svakog radnika prikazati njegov matini broj, prezime, ime i
prezime njegovog šefa. SELECT r.mbr, r.prez, r.ime, s.prez as
"prezime se fa" FROM radnik r, radnik s WHERE r.sef = s.mbr; 2. Za
sve rukovodioce radnika izlistati prezime, ime i broj radnika
kojima rukovode. SELECT s.prez, s.ime, COUNT(*) FROM radnik r,
radnik s WHERE r.sef = s.mbr GROUP BY s.prez, s.ime;
3. UGNJEDENI UPITI SELECT <lista izraza> FROM <lista
tabela> WHERE <obelezje> [NOT] [IN|*[ANY]|*[ALL]] (SELECT
... FROM ...)
*∈∈∈∈{<,<=,>,>=,=,!=} 1. Prikazati prezimena, imena i
plate radnika koji zaradjuju više od prosene plate. SELECT prez,
ime, plata FROM radnik WHERE plata > ANY (SELECT AVG(plata) FROM
radnik); 2. Prikazati prezimena, imena i plate radnika koji ne
zaradjuju minimalnu (maksimalnu) platu. SELECT prez, ime, plata
FROM radnik WHERE plata <> ALL (SELECT MIN(plata) FROM
radnik); SELECT prez, ime, plata FROM radnik WHERE plata <>
(SELECT MIN(plata) FROM radnik); 3. Prikazati prezimena, imena i
plate radnika ije je meseno angaovanje na nekom od projekata manje
ili jednako angaovanju bilo kog radnika na projektu sa šifrom 202.
SELECT prez, ime, plata FROM radnik r, radproj rp
14
WHERE r.mbr = rp.mbr AND rp.brsati <= ALL (SELECT DISTINCT br
sati FROM r adproj WHERE sifp=202); 4. Prikazati prezimena, imena i
platu svih radnika koji nisu angaovani ni na jednom projektu.
SELECT prez, ime, plata FROM radnik WHERE mbr NOT IN (SELECT
DISTINCT mbr FROM radproj) ; ZAVISNI UGNJEDENI UPITI 1. Prikazati
matine brojeve, prezimena, imena i plate radnika, iji je broj sati
angaovanja na nekom projektu vei od prosenog broja sati angaovanja
na tom projektu. SELECT r.mbr, r. prez, r.ime, r.plata FROM radnik
r, radproj rp WHERE r.mbr = rp.mbr AND rp.brsati > ANY (SELECT
AVG(brsati) FROM radproj rp1 WHERE rp.sifp=rp1.s ifp); 2. Prikazati
prezimena i imena radnika koji ne rade na projektu 201. SELECT
prez, ime FROM radnik r WHERE NOT EXISTS (SELECT rp.mbr FROM
radproj rp WHERE r.mbr = rp.mbr AND rp.sifp= 201); 3. Prikazati
prezimena i imena radnika koji ne rade ni na jednom projektu.
SELECT prez, ime FROM radnik r WHERE NOT EXISTS (SELECT rp.mbr FROM
radproj rp WHERE r.mbr = rp.mbr); 4. Prikazati prezimena i imena
radnika koji nisu rukovodioci projekata. SELECT prez, ime FROM
radnik r WHERE NOT EXISTS (SELECT DISTINCT p.ruk FROM projekat p
WHERE p.ruk = r.mbr);
15
5. Prikazati prezime i ime najstarijeg rukovodioca projekta. SELECT
prez, ime FROM radnik r, projekat p WHERE r.mbr = p.ruk AND NOT
EXISTS (SELECT * FROM radnik r1 WHERE r.datr >= r1.datr) ;
SELECT prez, ime FROM radnik r, projekat p WHERE r.mbr=p.ruk and
NOT EXISTS(SELECT * FROM radnik r1, projekat p1 WHERE r1.mbr=p1.ruk
and r1.datr>r.datr)
4. REKURZIVNO SELEKTOVANJE PODATAKA SELECT <lista izraza> [,
LEVEL] FROM tab1 t1 [, <lista tabela>] CONNECT BY t1.att1 =
PRIOR t1.att2 START WITH t1.att1 <*> <vrednost>
Objašnjenje: CONNECT BY t1.att1 = PRIOR t1.att2 t1.att1 u narednom
koraku selekcije uzima vrednost koju je u prethodnom koraku imao
t1.att2 START WITH t1.att1 <*> <vrednost> t1.att1 u
prvom koraku selekcije uzima vrednost koja je zadata putem t1.att1
<*> <vrednost> 1. Prikazati, rekurzivno, matini broj,
prezime, ime i matini broj šefa, saglasno hijerarhijskoj strukturi
rukovodjenja, poev od generalnog direktora (radnik koji nema šefa).
SELECT LEVEL, mbr, prez, ime, sef FROM radnik CONNECT BY sef =
PRIOR mbr START WITH sef IS NULL; SELECT LEVEL, mbr, prez, ime, sef
FROM radnik CONNECT BY sef = PRIOR mbr START WITH sef =100;
16
2. Prikazati, rekurzivno, matini broj, prezime, ime i matini broj
šefa, svih šefova radnika sa datim matinim brojem. SELECT LEVEL,
mbr, prez, ime, sef FROM radnik CONNECT BY mbr = PRIOR sef START
WITH mbr = 101;
5. UNIJA, PRESEK i RAZLIKA rezultata upita UNION - uniranje
kompatibilnih skupova torki INTERSECT - presek MINUS - razlika 1.
Prikazati prezimena, imena i plate radnika koji se zovu Aca ili
Ivan. SELECT prez, ime, plata FROM radnik WHERE ime = ‘Petar’ UNION
SELECT prez, ime, plata FROM radnik WHERE ime =’Dragana’;
17
Drugi as
Zavisni ugnjedeni upiti, nastavak 1. Prikazati prva etiri radnika
po visini zarade u preduzeu SELECT * FROM radnik r1 WHERE 4>
(SELECT COUNT(*) FROM radnik r2 WHERE r2.plata>r1.plata); 2.
Prikazati matine brojeve, prezimena, imena i plate radnika koji su
angaovani na svakom projektu. SELECT mbr, ime, prez, plata FROM
radnik r WHERE NOT exists (SELECT p.sifp FROM projekat p WHERE
p.sifp NOT IN (SELECT rp.s ifp FROM radproj rp WHERE rp.sifp=p.sifp
AND r.mbr=rp.mbr)); Klauzula JOIN SELECT table1.column,
table2.column FROM table1 [NATURAL JOIN table2] | /*spaja dve
tabele na osnov u jednakog naziva kolone*/ [JOIN table2 USING
(column_name)] | [JOIN table2 ON (table1.column_name =
table2.column_name)] | [LEFT| RIGHT|FULL OUTER JOIN table2 ON
(table1.column_name = table2.column_name)] | [CROSS JOIN table2];
NATURAL JOIN spaja vrste iz dve tabele koje imaju jednake vrednosti
u svim kolonama sa jednakim nazivima Primer: izlistati imena,
prezimena i šifre svih projekata na kojima rade SELECT ime, prez,
sifp FROM radnik NATURAL JOIN radproj; JOIN USING. Ukoliko nekoliko
kolona imaju jednake nazive a podaci nisu svi jednaki, moe se
dodati klauzula USING u cilju odreñivanja koje kolone elimo
koristiti.
18
SELECT ime, prez, sifp FROM radnik JOIN radproj USING (mbr); /* u
ovom sluaju je isti efekat jer dve tabele imaju samo jednu
istoimenu kolonu. /* kolone koje se navedu u USING klauzuli ne
smeju se nigde u upitu pozvati sa npr. r.mbr JOIN ON. Primarna
namena mu je lakše razumevanja koda, i kad elimo da spojimo tavele
preko dve kolone razliitog imena. SELECT r.ime, r.prez, rp.sifp
FROM radnik r JOIN radproj rp ON r.mbr = rp.mbr; Primer 1:
povezivanje tabele sa sobom. Lista prezimena radnika i prezimena
njihovih šefova. SELECT r1.prez radnik, r2.prez sef FROM radnik r1
JOIN radnik r2 ON (r1.sef = r2.mbr); Primer 2: Moe se dodati i još
po neki uslov, na primer da je šef sa odreñenom šifrom: SELECT
r1.prez radnik, r2.prez sef FROM radnik r1 JOIN radnik r2 ON
(r1.sef = r2.mbr) AND r2.mbr=100; Primer 3: Mogue je spojiti i više
tabela: Izlistati lista imena i prezimena radnika i nazive
projekata na kojima rade: SELECT r.ime "ime radnika" , r.prez
"prezime radnik a", p.nazp "naziv projekta" FROM radproj rp JOIN
radnik r ON (r.mbr = rp.mbr) JOIN projekat p ON (p.sifp = rp.sifp)
LEFT| RIGHT|FULL OUTER JOIN. Koristi se za spajanje tabela i za
prikazivanje torki koje nemaju odgovarajueg para u drugoj tabeli
Primer 1: Prikazati ime i prezime radnika i šifre projekata na
kojima su zaposleni: SELECT ime, prez, sifp FROM radnik r LEFT
OUTER JOIN radproj rp ON (r.mbr = rp.mbr)
19
/* rezultat prikazuje i radnike koje ne rade ni na jednom projektu
/* desni u ovom sluaju ne bi se razlikovao od obinog povezivanja
jer nema projekata na kojima ne radi ni jedan radnik /* potpuni
(FULL) bi dao isti rezultat kao i levi u ovom sluaju /*skraena
verzija: SELECT ime, prez, sifp FROM radnik r, radproj rp WHERE
r.mbr = rp.mbr (+) Primer 2: Prikazati imena i prezimena svih
radnika, kao i imena i prezimena njihovih šefova: SELECT r1.ime
"ime radnika", r1.prez "prezime", r2.ime "ime sefa", r2.prez
"prezime sefa" FROM radnik r1 LEFT OUTER JOIN radnik r2 ON (r1.sef
= r2.mbr) /* umesto praznog polja, kod direktora ispisuje poruku
SELECT r1.ime "ime radnika", r1.prez "prezime",
NVL(r2.ime,'Direktor') "ime sefa", NVL(r2.prez,'je glavni')
"prezime sefa" FROM radnik r1 LEFT OUTER JOIN radnik r2 ON (r1.sef
= r2.mbr) /*skraeno: SELECT r1.ime "ime radnika", r1.prez
"prezime", r2.ime "ime sefa", r2.prez "prezime sefa" FROM radnik
r1, radnik r2 WHERE r1.sef = r2.mbr(+) CROSS JOIN. Kada je uslov
JOIN netaan ili potpuno izostavljen dešava se spajanje svih vrsti
iz jedne tabele sa svim vrstama iz druge tabele, tj. prave se sve
kombinacije vrsti dve tabele. Taj efekat se moe postii i opcijom
CROSS JOIN. Kada prva tabela ima na primer 8 torki a druga 20,
rezultat ove naredbe je dobijanje 8 x 20 = 160 vrsti. CROSS JOIN
slui za kojekakva testiranja kada elimo da generišemo veliki broj
vrsti u cilju simulacije dobijanja velike koliine podataka.
20
SELECT ime, sifp FROM radnik CROSS JOIN radproj; DML data
manipulation language Sintaksa INSERT naredbe INSERT INTO
table[(column [, column] ) ] VALUES (value [, value] ); Primer 1:
Unos radnika INSERT INTO radnik (mbr, ime, prez) VALUES (112,
'Majkl', 'Dzekson'); INSERT INTO radnik VALUES (100, 'Mitrovic' ,
'Milan' , null , 75000 , '31-05-1975' ); Sintaksa UPDATE naredbe
UPDATE table SET column = value [, column = value] [WHERE
condition]; Primer 2: Update radnika UPDATE radnik SET sef = 103,
plata = 10000, datr = '15-08-1965' WHERE mbr = 112; /* Ako
izostavimo WHERE klauzulu auriraju se sve torke sa tim podacima
Primer 3. Update radnika sa šifrom 112 da ima platu kao radnik sa
šifrom 100 UPDATE radnik SET plata = (SELECT plata FROM radnik
WHERE mbr = 1 00) WHERE mbr = 112; Sintaksa DELETE naredbe DELETE
[FROM] table [WHERE condition]; Primer 1: Brisanje tabele radnik
DELETE radnik;
21
Primer 2: Brisanje vrste iz tabele DELETE FROM radnik WHERE mbr =
112; Spisak naredbi za formiranje i popunjavanje tabeli radnik,
projekat i radproj: CREATE TABLE radnik (mbr number(6) NOT NULL,
prez varchar(12) NOT NULL, ime varchar(12) NOT NULL, sef number(6),
plata number(15), datr date ); CREATE Table projekat (sifp
number(6) NOT NULL, nazp varchar(20) NOT NULL, ruk number(6) );
CREATE TABLE radproj (mbr number(6) NOT NULL, sifp number(6) NOT
NULL, brsati number(2) ); CREATE UNIQUE INDEX idx_radnik ON radnik
(mbr asc); CREATE UNIQUE INDEX idx_projekat ON projekat (sifp);
CREATE UNIQUE INDEX idx_radproj ON radproj (mbr, sifp); INSERT INTO
radnik VALUES (100, 'Mitrovic','Milan',null,75000, '31-05-1975');
INSERT INTO radnik VALUES (101, 'Mirkovic','Dragana',100,65000,
'12-06-1978'); INSERT INTO radnik VALUES (102,
'Filipovic','Petar',100,65000, '17-11-1979'); INSERT INTO radnik
VALUES (103, 'Kljajic','Marija',100,65000, '18-06-1979'); INSERT
INTO radnik VALUES (104, 'Psodorov','Laza',101,45000,
'19-10-1984');
22
INSERT INTO radnik VALUES (105, 'Kapidzic','Pera',101,45000,
'21-01-1983'); INSERT INTO radnik VALUES (106,
'Peric','Sandra',102,45000, '27-12-1980'); INSERT INTO radnik
VALUES (107, 'Lazic','Dragana',103,55000, '12-05-1980'); INSERT
INTO radnik VALUES (108, 'Nadj','Ana',103,55000, '14-11-1986');
INSERT INTO radnik VALUES (109, 'Kopanja','Maja',103,25000,
'28-10-1988'); INSERT INTO radnik VALUES (110,
'Mirkovic','Aleksandar',102,25000, '12-01-1980'); INSERT INTO
radnik VALUES (111, 'Bojic','Petar',102,27000, '10-12-1982');
INSERT INTO Projekat VALUES (200, 'IS banke',100); INSERT INTO
Projekat VALUES (201, 'IS osig drustva',101); INSERT INTO Projekat
VALUES (202, 'IS skole',101); INSERT INTO Projekat VALUES (203, 'IS
kafica',101); INSERT INTO Projekat VALUES (204, 'IS Kafane',102);
INSERT INTO Projekat VALUES (205, 'IS fakulteta',103); INSERT INTO
radproj VALUES (100, 200,4); INSERT INTO radproj VALUES (101,
201,6); INSERT INTO radproj VALUES (101, 202,7); INSERT INTO
radproj VALUES (101, 203,16); INSERT INTO radproj VALUES (102,
204,12); INSERT INTO radproj VALUES (103, 205,5); INSERT INTO
radproj VALUES (107, 201,13); INSERT INTO radproj VALUES (108,
201,3); INSERT INTO radproj VALUES (109, 202,21);
23
INSERT INTO radproj VALUES (110, 202,14); INSERT INTO radproj
VALUES (111, 203,8); INSERT INTO radproj VALUES (110, 203,7);
INSERT INTO radproj VALUES (111, 204,35); INSERT INTO radproj
VALUES (109, 205,44); INSERT INTO radproj VALUES (109, 204,47);
INSERT INTO radproj VALUES (108, 205,44);
24
TREI AS funkcije ROLLUP, CUBE i GROUPING koriste se sa GROUP BY,
slue za generisanje izveštaja sa grupisanjem podataka
• ROLLUP se koristi za dobijanje zbirnih vrednosti po kategorijama
• CUBE je zamena za višestruke upotrebe GROUP BY funkcije za
višestruka
izraunavanja uz pomo pojedinane SELECT naredbe • GROUPING se
koristi sa CUBE ili ROLLUP operatorima, slui za pronalaenje
grupa koje formiraju zbirne rezultate i za razlikovanje NULL
vrednosti iz baze i NULL vrednosti koje su generisale funkcije CUBE
i ROLLUP, tj slui kao pomo pri razumevanju na koji nain su dobijene
zbirne vrednosti
podseanje na sintaksu GROUP BY SELECT <lista izraza> FROM
<naziv relacije> GROUP BY <obelezje> [,
<obelezje>] Primer 1: izlistati šifre projekata i broj
radnika koji na njima rade SELECT sifp, COUNT(mbr) FROM radproj
GROUP BY sifp; Treba dodati dve kolone odsek i funkcija u tabelu
radnik i popuniti ih podacima SELECT mbr, ime, prez, plata, odsek,
funk FROM radnik; ALTER TABLE radnik ADD (odsek number(2), funk
number(2)); ALTER TABLE radnik MODIFY (sef number(4), plata number
(4)); ALTER TABLE radnik DROP (funk, odsek); UPDATE radnik SET funk
= 1 WHERE plata = 75000; UPDATE radnik SET funk = 2 WHERE plata
BETWEEN 64000 AND 74000;
25
UPDATE radnik SET funk = 3 WHERE plata <64000; UPDATE radnik SET
odsek = 0 WHERE mbr=100; UPDATE radnik SET odsek = 1 WHERE mbr=101;
UPDATE radnik SET odsek = 2 WHERE mbr=102; UPDATE radnik SET odsek
= 3 WHERE mbr=103; UPDATE radnik SET ODSEK = (SELECT odsek FROM
radnik WHERE mbr = 101) WHERE sef =101; UPDATE radnik SET ODSEK =
(SELECT odsek FROM radnik WHERE mbr = 102) WHERE sef =102; UPDATE
radnik SET ODSEK = (SELECT odsek FROM radnik WHERE mbr = 103) WHERE
sef =103; ROLLUP Koristi se za dobijanje zbirnih vrednosti po
kategorijama Primer 1. Prikaz sume plata grupisanih po odseku i
funkcijama koje radnici obavljaju
SELECT odsek, funk, sum(plata) FROM radnik GROUP BY ROLLUP (odsek,
funk); Primer 2. Prikaz sume plata grupisanih po funkcijama koje
radnici obavljaju na prvom odseku
SELECT odsek, funk, sum(plata) FROM radnik WHERE odsek = 1 GROUP BY
ROLLUP (odsek, funk);
26
Primer 3. Prikaz sume plata grupisanih po funkcijama koje radnici
obavljaju pa potom po odseku
SELECT funk, odsek, sum(plata) FROM radnik GROUP BY ROLLUP (funk,
odsek); Primer 4. Prikaz proseka plata grupisanih po odseku i
funkcijama koje radnici obavljaju
SELECT odsek, funk, round(avg(plata),0) as "prosek plate" FROM
radnik GROUP BY ROLLUP (odsek, funk) CUBE
Primer 1. Prikazati maksimalne plate po odsecima, funkcijama i po
odsecima u zavisnosti od funkcija
SELECT odsek, funk, max(plata) FROM radnik GROUP BY CUBE (odsek,
funk); GROUPING Vraa nulu ili jedinicu, koristi kao argument neki
od naziva kolona iz klauzule GROUP BY Ako vraa nulu znai da je
jedno od sledea dva:
• Izraz je korišen za dobijanje konane vrednosti • NULL vrednost u
izveštaju je NULL iz tabele
Ako je vraena jedinica to znai jedno od naredna dva: • Izraz nije
korišen za dobijanje konane vrednosti • NULL vrednost u u izveštaju
je kreirana sa ROLLUP ili CUBE funkcijom
SELECT odsek, funk, max(plata), GROUPING (odsek), GROUPING (funk)
funkcija FROM radnik GROUP BY ROLLUP (odsek, funk); Upravljanje
transakcijama Komande za upravljanje transakcijama odreñuju
rezultat izvrpavanja transakcije. U ove komande spadaju COOMIT,
ROLLBACK i SAVEPOINT Komanda COMMIT Kada hoemo da sve izmene koje
je napravila tekua transakcijapostanu trajne i nepovratne i
oslobode se svi podaci koje je ta transakcija zakljuala, izdaje
sledeu komandu:
27
COMMIT
Time se tekua transakcija implicitno završava i zapoinje nova
Komanda ROLLBACK Da bi smo poništili sve izmene koje je napravila
tekua transakcija (kao da se nisu ni dogodile) i oslobodili sve
podatke koje je ta transakcija zakljuala, izdajemo naredbu:
ROLLBACK
Kada se jedna transakcija poništi, implicitno, zapoinje nova.
Komanda SAVEPOINT Unutar opsene tranakcije mogu se postaviti
kontrolne take (savepoints) koje rašlanuju radnje u transakciji:
INSERT... UPDATE... DELETE... SAVEPOINT jedan INSERT... UPDATE...
DELETE... SAVEPOINT dva INSERT... UPDATE... DELETE... ... Kontrolne
take omoguuju poništavanje pojedinih delova transakcije, bez
uticaja na ostale: ROLLBACK TO SAVEPOINT dva Ova komanda poništava
uinak svih komandi posle kontrolne take DVA. Transakcija oslobaña i
sve podatke koje su poništene komande zakljuale ime omoguuje drugim
transakcijama pristup tim podacima. Posle poništavanja do kontrolne
take transakcija ostaje aktivna. Primer 1 COMMIT; INSERT INTO
radnik (mbr, ime, prez) VALUES (113, 'Marko', 'Popadic'); SAVEPOINT
prvi; INSERT INTO radnik (mbr, ime, prez) VALUES (114, 'Dragan',
'Stojic');
28
SAVEPOINT dva; INSERT INTO radnik (mbr, ime, prez) VALUES (115,
'Milana', 'Peric'); ROLLBACK TO prvi;
Masivni upis u tabelu Naredba INSERT ALL Primer 1. Uneti podatke o
angaovanju radnika u tabelu RADPROJ koji nisu angaovani ni na
jednom projektu, na projekat sa šifrom 204, sa po 10 sati za svakog
INSERT ALL INTO radproj VALUES (MAT, 204, 10) SELECT mbr MAT FROM
radnik
WHERE mbr NOT IN (SELECT DISTINCT mbr FROM radproj); Naredba MERGE
Slui za uslovni upis podataka u tabelu. Izvršava UPDATE ili INSERT
u zavisnosti da li red postoji ili ne. Sintaksa MERGE naredbe:
MERGE INTO tabela USING tabela|pogled|podupit ON uslov povezivanja
WHEN MATCHED THEN UPDATE SET col1 = col1_vrednost col2 =
col2_vrednost … WHEN NOT MATCHED THEN INSERT (lista kolona) VALUES
(vrednosti kolona) Primer 1. Sinhronizacija telefonskog imenika na
telefonu i imenika na raunaru. Neka se jedan kontakt u imeniku uva
u formatu: (naziv, tel1, tel2, tel3, tel4)
29
MERGE INTO kontaktiPC pc USING kontaktiMob mob ON pc.naziv =
mob.naziv WHEN MATCHED THEN UPDATE SET pc.tel1 = mob.tel1 pc.tel2 =
mob.tel2
pc.tel3 = mob.tel3 pc.tel4 = mob.tel4
WHEN NOT MATCHED THEN INSERT (naziv, tel1, tel2, tel3, tel4) VALUES
(mob.naziv, mob.tel1, mob.tel2, mob.tel3, mob.tel4)
30
ETVRTI AS CREATE VIEW Kreiranje pogleda. CREATE VIEW <naziv
pogleda>[(<lista obelezja>)] AS SELECT <upit> Na
primer napraviti pogled na sve rukovodioce odseka. CREATE VIEW
ruk_ods (mbr, ime, prez, ods) AS SELECT mbr, ime, prez, ods FROM
radnik WHERE funk = 2; Sada se taj pogled koristi kao i svaka druga
tabela. Na primer, selektovati sve rukovodioce odseka: SELECT *
FROM ruk_ods; Brisanje pogleda se vrši sa DROP VIEW <naziv
pogleda> tj. DROP VIEW ruk_ods; Mehanizmi automatskog
zakljuavanja podataka na nivou SUBP Zakljuavanje cele tabele je u
nekim sluajevima efikasnije od zakljuavanja pojedinanih redova LOCK
TABLE LOCK TABLE <naziv tabele> IN [ROW] SHARE |
[[SHARE] ROW] EXCLUSIVE | SHARE UPDATE
MODE Primer: Zakljuavanje podataka tabele RADNIK na iskljuiv nain:
LOCK TABLE radnik IN EXCLUSIVE MODE LOCK TABLE radnik IN EXCLUSIVE
MODE NOWAIT
31
LOCK TABLE radnik, radproj IN EXCLUSIVE MODE NOWAIT Izriito
zakljuavanje e biti rañeno sa PL/SQL-om SELECT... FOR UPDATE
Osnovni SQL tipovi podataka Tip podataka Opis NUMBER(p,s) Broj sa
maksimalno p cifara od kojih je s
maksimalni broj decimala (1 < p < 38) (- 84 < s <
127)
VARCHAR2(s) Promenjivi niz karaktera maksimalne duine s (1 < s
< 4000)
DATA Datum i vreme za period od 1. januar 4712 p.n.e do 31.
decembra 9999. godine
CHAR(s) Fiksni niz karaktera duine s (1 < s < 2000)
LONG Promenjivi niz karaktera (do 2GB) CLOB Niz karaktera (do 4 GB)
RAW i LONG RAW Promenjivi binarni niz BLOB Binarni niz (do 4 GB)
BFILE Binarni podaci smešteni u spoljnom fajlu ROWID Brojni sistem
sa osnovom 64 koji
predstavlja jedinstvenu adresu vrste u svojoj tabeli
FUNKCIJE
Dve vrste funkcija: • jednoredne funkcije i • grupne funkcije
Jednoredne funkcije se dele u pet podgrupa: • funkcije nad
karakternim tipovima • funkcije nad brojevnim tipovima • funkcije
nad datumskim tipovima • funkcije za konverziju • opšte
funkcije
Funkcije nad karakternim tipovima: • Funkcije za manipulaciju
veliine slova (LOWER, UPPER, INITCAP) • Funkcije za manipulaciju
karaktera (CONCAT, SUBSTR, LENGTH, INSTR,
LPAD|RPAD, TRIM, REPLACE)
Funkcija Upotreba LOWER (kolona/izraz) Prebacuje sve karaktere u
mala slova UPPER (kolona/izraz) Prebacuje sve karaktere u velika
slova INITCAP (kolona/izraz) Sva poetna slova rei prebacuje u
velika,
ostala u mala slova CONCAT (kolona1/izraz1, kolona2/izraz2) Spaja
dva niza karaktera (kao operator || ) SUBSTR (kolona/izraz, m [,n])
Vraa podstring poev od pozicije m
duine n (ako je m negativno, broji od kraja stringa, ako je n
izostavljeno, vraa podstring on m-te pozicije do kraja)
LENGHT (kolona/izraz) Vraa broj karaktera izraza INSTR
(kolona/izraz, ’string’ [,m] [,n]) Vraa poziciju n-te pojave
podstringa
poev od m-tog karaktera, default vrednost za m i n je 1
LPAD (kolona/izraz, n, ’string’) RPAD (kolona/izraz, n,
’string’)
Dopunjava niz karaktera sa pojavama niza karaktera ‘string’ do
duine n sa leve-desne strane
TRIM (leading|trailing|both, karakter_trimovanja FROM
string_za_trimovanje)
Izbacuje karakter sa poetka/kraja/oba niza karaktera
string_za_trimovanje
REPLACE (tekst, string_za_pretragu, novi_string)
Pronalazi string_za_pretragu u tekstu i zamenjuje svaku njegovu
pojavu sa novi_string
Primer SELECT CONCAT(CONCAT (ime, ' '), prez) radnik FROM radnik;
SELECT CONCAT (ime || ' ', prez) radnik FROM radnik; SELECT
LPAD(ime, 12, ' ab') radnik, prez FROM radnik; SELECT ime, prez,
LPAD(plata, 10, '*') FROM radnik; SELECT TRIM(leading 'M' FROM ime)
FROM radnik WHERE ime LIKE 'M%'; SELECT REPLACE(ime, 'a','A') FROM
radnik funkcije nad brojevnim tipovima (ROUND, TRUNC, MOD) Funkcija
Upotreba ROUND (kolona/izraz, n) Zaokruuje broj na n decimala, ili
ako je n
izostavljeno, izostavlja decimalna mesta ako je n negativno
zaokruuje brojeve sa leve strane decimalnog znaka
TRUNC (kolona/izraz, n) Odbacuje decimale u zavisnosti od broja
n
33
(slino funkciji ROUND) MOD (m , n) Vraa ostatak pri deljenju
brojeva m i n Primer: SELECT ROUND(avg (plata), 3) "Prosek plata"
FROM radnik SELECT distinct TRUNC(46.927), TRUNC(46.927,2),
TRUNC(46.927,-1) FROM radnik SELECT distinct ROUND(46.927),
ROUND(46.927,2), ROUND(46.927,-1) FROM radnik CREATE TABLE
prosta
(x CHAR(1));
INSERT INTO prosta VALUES (‘x’); funkcije nad datumskim tipovima
Funkcija Upotreba MONTHS_BETWEEN (date1, date2) Broj meseci izmeñu
dva datuma, rezultat
moe biti i negativan ADD_MONTHS (date, n) Dodaje broj meseci na
datum NEXT_DAY (date, danUnedelji) Vraa datum narednog dana u
nedelji,
argument moe biti i broj LAST_DAY (date) Vraa poslednji dan u
mesecu ROUND (date [, 'fmt']) Zaokruuje datum TRUNC (date [,
'fmt']) Skrauje datum SELECT SYSDATE vreme FROM prosta; Primer 1.
selektovati razliku izmeñu najstarijeg i najmlañeg radnika SELECT
MAX(MONTHS_BETWEEN (r1.datr, r2.datr)) "Maximalna razlika" FROM
radnik r1, radnik r2; Primer 2. Izraunati starost u mesecima SELECT
MONTHS_BETWEEN ( '31-05-1978' , SYSDATE) starost FROM prosta;
Primer 3. selektovati imena, prezimena radnika, njihove datume
roñenja i datume kad su postali punoletni
34
SELECT ime || ' ' || prez radnik, datr "Datum rodjenja",
ADD_MONTHS(datr, 18*12) Punoletstvo FROM radnik; Primer 4.
Izlistati datum narednog petka. SELECT NEXT_DAY(SYSDATE, 6)
"Naredni petak" FROM prosta; Primer 5. Prikazati poslednji datum u
ovom mesecu SELECT LAST_DAY(SYSDATE) Poslednji FROM prosta; Primer
6. Zaokruiti i skratiti današnji datum SELECT ROUND
(TO_DATE('25.08.1980'), 'MONTH'), ROUND (TO_DATE('25.08.1980'),
'YEAR'), TRUNC (TO_DATE('25.08.1980'), 'MONTH'), TRUNC
(TO_DATE('25.08.1980'), 'YEAR') FROM prosta; Operacije sa datumima
Operacija Rezultat Opis DATE + broj DATE Dodaje broj dana na datum
DATE – broj DATE Oduzima broj dana od datuma DATE – DATE Broj dana
Nalazi razliku u datumima DATE + broj/24 DATE Dodaje broj sati na
datum Primer 1. Izraunati starost u mesecima SELECT SYSDATE -
TO_DATE('31.05.1978') starost FROM prosta; Funkcije za
konverziju
• TO_CHAR • TO_NUMBER • TO_DATE
• NVL (izraz1, izraz2) • NVL2 (izraz1, izraz2, izraz3) • NULLIF
(izraz1, izraz2) • COALESCE (izraz1, izraz2, ... ,izrazN)
35
Funkcija Upotreba NVL (izraz1, izraz2) Konvertuje NULL vrednost u
neku konkretnu NVL2 (izraz1, izraz2, izraz3) Ako vrednost izraza1
nije NULL vraa izraz2
inae vraa izraz3 NULLIF (izraz1, izraz2) Uporeñuje dva izraza. Ako
su jednaki vraa
NULL, ako nisu isti vraa prvi izraz COALESCE (izraz1, izraz2, ...
,izrazN) Vraa prvi izraz koji nije NULL Primer 1. Prikazati imena i
prezimena svih radnika. Posebno naznaiti da li je zaposleni
direktor ili obiian radnik SELECT ime "ime radnika", prez
"prezime", NVL2(sef, 'radnik', 'direktor') funkcija FROM radnik;
Primer 2. Prikazati imena, prezimena i plate svih zaposlenih. U
sluaju da radnik ima platu istu kao svoj šef, javiti poruku o
greški. SELECT r1.ime|| ' '|| r1.prez radnik,
NVL(TO_CHAR(NULLIF(r1.plata, r2.plata)), 'GRESKA!!!' ) plata FROM
radnik r1, radnik r2 WHERE r1.sef = r2.mbr (+); UPDATE radnik SET
plata = 75000 WHERE mbr=101;
36
Peti as
DDL (DATA DEFINITION LANGUAGE) IZRAZI DML (Data Manipulation
Language) sve do sad DCL (Data Control Language) kasnije Objekti
baze podataka:
Objekat Opis Table Osnovna jedinica skladištenja, sastoji se od
redova View Logiko predstavljenje podskupa podataka iz jedne ili
više tabeli Sequence Generisanje numerikih rednosti Index
Poboljšavanje performansi nekih upita Synonym Davanje alternativnih
imena objektima
KREIRANJE, IZMENA I BRISANJE DEFINICIJA TABELA Kreiranje tabela,
naredba CREATE TABLE CREATE TABLE tabela
(kolona, tip_podataka [DEFAULT vrednost] [ogranicenje_kolone], ...
[ogranicenje_tabele] [,...])
Primer1. Tabela bez ogranienja CREATE TABLE radnik (mbr NUMBER(6)
NOT NULL, prez VARCHAR2(12) NOT NULL, ime VARCHAR2(12) NOT NULL,
sef NUMBER(6) DEFAULT 101, plata NUMBER(15) DEFAULT 35000, datr
DATE SYSDATE, odsek NUMBER(2), funk NUMBER(2) ); Ogranienja slue da
spree unos neodgovarjuih podataka u tabele: Ogranienje Opis NOT
NULL Ograniava da kolona ne sme sadrati NULL vrednost UNIQUE
Ograniava da kolona mora imati jedinstven sadraj na
nivou svih vrsta tabele
PRIMARY KEY Jedinstveno identifikuje svaku vrstu tabele FOREIGN KEY
Ostvaruje vezu stranog kljua izmeñu kolone i kolone druge
tabele CHECK Postavlja uslov koji mora niti zadovoljen Ogranienja
se mogu imenovati ili im Oracle generiše naziv u formatu SYS_Cn,
gde je n broj, pa je i sam naziv jedinstven Ogranienje na nivou
kolone: Kolona [CONSTRAINT naziv_ ogranicenja] tip ogranicenja,
Ogranienje na nivou tabele: Kolona, … [CONSTRAINT naziv_
ogranicenja] tip_ogranicenja (kolona, …), CREATE TABLE radnik (mbr
NUMBER(6) NOT NULL CONSTRAINT ogranicenje PRIMARY KEY, prez
VARCHAR2(12) NOT NULL, ime VARCHAR2(12) NOT NULL, sef NUMBER(6)
DEFAULT 101, plata NUMBER(15) DEFAULT 35000, datr DATE SYSDATE,
odsek NUMBER(2), funk NUMBER(2) ); CREATE TABLE radnik (mbr
NUMBER(6) NOT NULL, prez VARCHAR2(12) NOT NULL, ime VARCHAR2(12)
NOT NULL, sef NUMBER(6) DEFAULT 101, plata NUMBER(15) DEFAULT
35000, datr DATE SYSDATE, odsek NUMBER(2), funk NUMBER(2),
CONSTRAINT ogranicenje PRIMARY KEY (mbr) ); CREATE UNIQUE INDEX
idx_radnik ON radnik (mbr);
38
Klju ne rei ogranienja FOREIGN KEY: Klju na re Znaenje FOREIGN KEY
Za definisanje stranog kljua na nivou tabele REFERENCES Za
identifikovanje roditeljske tabele i kolone iz koje se
klju preuzima ON DELETE CASCADE Ukazuje da ako se vrsta u
roditeljskoj tabeli izbriše,
zavisni redovi u tabeli potomka se takoñe brišu ON DELETE SET NULL
Ukazuje da ako se vrsta u roditeljskoj tabeli obriše, u
zavisnim redovima tabele potomka se postavljaju null vrednosti tamo
gde su uklonjene vrednosti
Primer 1. Kreirati tabele STUDENT (brInd, ime, prez, sifo, status)
i ODSEK (sifo, nazo) gde je kolona sifo iz student strani klju iz
tabele odsek. CREATE TABLE odsek (
sifo NUMBER(2) PRIMARY KEY, nazo VARCHAR(40) NOT NULL);
CREATE TABLE student ( brInd NUMBER(5) PRIMARY KEY, ime
VARCHAR2(12) NOT NULL, prez VARCHAR2(12) NOT NULL, sifo NUMBER(2)
CONSTRAINT kljucodseka
REFERENCES odsek (sifo) ON DELETE SET NULL,
Status CHAR(1) DEFAULT 'r' NOT NULL ); ili (na nivou tabele) CREATE
TABLE student (
brInd NUMBER(5) PRIMARY KEY, ime VARCHAR2(12) NOT NULL, prez
VARCHAR2(12) NOT NULL, sifo NUMBER(2) Status CHAR(1) DEFAULT 'r'
NOT NULL CONSTRAINT kljucodseka FOREIGN KEY (sifo)
REFERENCES odsek (sifo) ON DELETE SET NULL,);
INSERT INTO odsek VALUES (11,'FINANSIJE') INSERT INTO odsek
39
VALUES (10,'INFORMATIKA') INSERT INTO student (brind, ime, prez,
sifo) VALUES (1234, `Marko`, `Milic`, 10) ... Primer 2. U tabelu
ODSEK dodati kolonu BMESTA koja predstavlja broj mesta sa studente
koji se finansiraju iz budeta za svaki odsek, i taj broj mora bitit
u rasponu od 50 do 200 ALTER TABLE odsek ADD (bmesta
NUMBER(4)
CHECK ((bmesta > 50) AND (bmesta < 200))); Ili ALTER TABLE
odsek
ADD (bmesta NUMBER(4) CONSTRAINT provera_broja CHECK ((bmesta >
50) AND (bmesta < 200)));
Primer 3. Brisanje kolone iz tabele ALTER TABLE odsek DROP COLUMN
bmesta (mogue su još i opcije MODIFY i ADD uz DROP) Indeksi Indeksi
se kreiraju:
• Automatski: sa ubacivanjem ogranienja: PRIMARY KEY i UNIQUE •
Manuelno: izrazima CREATE INDEX i CREATE TABLE
Indeksi mogu biti :
• jedinstveni (pri generisanju ogranienja PRIMARY KEY i UNIQUE) i •
nejedinstveni (pri generisanju ogranienja FOREIGN KEY, u cilju
ubrzanja
izvršavanja upita) Primer 1. listanje svih indeksa: SELECT
index_name, table_name FROM user_indexes; Primer 2. U cilju
ubrzanja procesa uitavanja velike koliine podataka i preglednosti
koda, mogue je koristi postojei index radi kreiranja primarnog
kljua.
40
Korak1 : kreiranje tabele CREATE TABLE student
(brInd NUMBER(4) ime VARCHAR2(20) prez VARCHAR2(20) );
Korak2: kreiranje indexa CREATE INDEX broj_indexa ON
student(brInd); Korak3: kreiranje primarnog kljua ALTER TABLE
student ADD PRIMARY KEY (brInd) USING INDEX broj_indexa; Generator
sekvenci Za automatsko generisanje jedinstvenih brojeva, moe se
koristiti za generisanje vrednosti primarnog kljua, poveava
efikasnost pristupa podacima. CREATE SEQUENCE sekvenca [INCREMENT
BY n] [START WITH n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n |
NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}] Znaenje:
Sekvenca Naziv sekvence INCREMENT BY n Veliina koraka izmeñu dve
vrednosti, default vrednost je 1 START WITH n Poetna vrednost u
nizu, default vrednost je 1 MAXVALUE n Maksimalna vrednost koju
sekvenca moe generisati NOMAXVALUE Definiše se 1027 (-1 za opadajue
nizove) kao maksimalna
vrednost (ovo je default vrednost) MINVALUE n Definiše se minimalna
vrednost u sekvenci NOMINVALUE Definiše se vrednost 1 (-1027 za
opadajue nizove) kao
minimalna vrednost (ovo je default vrednost) CYCLE | NOCYCLE
Odreñuje se da li sekvenca da nastavi generisanje brojeva
nakon što je stigla do maksimalne vrednosti CACHE n | NOCACHE
Odreñuje koliko lokacija za vrednosti Oracle rezerviše u
memoriji (default vrednost je 20)
41