of 41 /41
1 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, 1) (0, N) RADNIK PROJEKAT SEF RUKOVODI RADI _NA (0, N) (0, N) (Sef) (Podredjeni)

ER model š ER model šeme baze podataka

  • Author
    others

  • View
    5

  • Download
    0

Embed Size (px)

Text of ER model š ER model šeme baze podataka

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