42
1 ubER 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)

RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

1

ubER 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)

Page 2: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

2

Komande okruženja

• CONNECT kor.ime/pass • DISCONNECT • EDIT ‘c:sc1.doc’ • SAVE ‘c:sc1.doc’ • START ‘c:sc1.doc’ • CLEAR SCREEN • DESC ime tabele • EXIT

1. UPITI NAD JEDNOM TABELOM SELECT * FROM <naziv relacije> Koristi se pojam relacija ili tabela (Prikaz svih torki date relacije – vrednosti svih obeležja) 1. Prikazati sadržaj svake od relacija (tabela). SELECT * FROM radnik; (u dnu rezultujuce tabele naveden je broj selektovanih torki) SELECT <lista obelezja> FROM <naziv relacije> <lista obelezja> - niz naziva obelezja, razdvojenih zarezom, iza poslednjeg elementa u nizu NE stavlja se zarez, redosled navodjenja obelezja je proizvoljan 1. Prikazati prezimena i imena svih radnika. SELECT prez, ime FROM radnik; (uociti broj torki) 2. Uraditi nekoliko slicnih primera sa ostalim relacijama. SELECT DISTINCT < lista obelezja> FROM <naziv relacije>

Page 3: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

3

1. Prikazati sva razlicita prezimena i imena svih radnika. SELECT DISTINCT prez, ime FROM radnik; (diskutovati zasto ima manje torki, nego u gornjem upitu) Ovo je pravi primer PROJEKCIJE (operacija relacione algebre) 2. Prikazati sve razlicite plate radnika. 3. Prikazati razlicite sifre projekata na kojima je angazovan 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 znacenje zagrada: < > - oznacavaju da je potrebno upisati neki konkretan naziv ili izraz, naravno, bez navodjenja ovih zagrada [ ] – oznacavaju opcione delove naredbe { } – oznacavaju 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; (obratiti paznju na naziv trece kolone) 2. Prikazati prezimena i imena radnika i njihove plate uvecane za 20%, pri cemu naziv trece 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 povisicom" 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”

Page 4: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

4

FROM radnik; (koriste se navodnici, a ne apostrofi) 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 + radnika komplet SELECT mbr AS "maticni broj", ime||' '||prez AS radnik 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 rastucem redosledu plata. SELECT prez, ime, plata FROM radnik ORDER BY plata; 2. Prikazati prezimena i imena radnika i njihove plate, sortirano po rastucem redosledu plata i unutar iste plate po opadajucem redosledu prezimena. SELECT prez, ime, plata FROM radnik ORDER BY plata, prezime DESC; (ORDER BY uvek ide na kraj, sortira rezultat celokupnog upita) SELEKCIJA torki (operacija relacione algebre selekcija izdvaja redove, a projekcija kolone) SELECT <lista izraza> FROM <naziv relacije> WHERE <uslov selekcije> Operandi uslova: izrazi Operatori: <, >, <=, >=, =, !=, <>

Page 5: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

5

1. Prikazati vrednosti svih obelezja radnika sa datim prezimenom (Mirkovic). SELECT * FROM radnik WHERE prez=’Mirkovic’; (primer selekcije) 2. Prikazati prezimena, imena i plate radnika sa datim prezimenom (Mirkovic). SELECT prez, ime, plata FROM radnik WHERE prez=’Mirkovic’; (primer projekcije selekcije) (Komentar: apostrofi – tip podatka karakter, case sensitive upit, primena funkcija LOWER i UPPER) 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; (numericki podatak – nema apostrofa) 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; (Komentar razni logicki i relacioni operatori, uraditi dodatne primere) Dodatni operatori poredjenja: x BETWEEN y AND z x [NOT] LIKE <uzorak> x IS [NOT] NULL _ zamena za jedan, % za vise znakova

Page 6: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

6

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/ 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 cije je drugo i poslednje slovo imena ‘a’. SELECT prez, ime, plata FROM radnik WHERE ime LIKE ‘_a%a’; (uraditi pre ovoga razne primere: pocinje na neko slovo, zavrsava se na neka slova, ima tacno toliko slova…) 6. Prikazati prezimena, imena i plate radnika koji se ne zovu ni Aca ni Ivan.

Page 7: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

7

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 platu: ‘ || plata || ‘ dinara.’ AS “Plate radnika” FROM radnik (komentarisati gde ce pisati koji tekst, gde se koriste apostrofi, gde navodnici, koliko kolona ima rezultujuca relacija) 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 (uraditi i razne druge primere, kombinujuci zadate vrednosti razlicitih obelezja i razlicite logicke i relacione operatore) FORMATIRANJE KOLONA (ovo samo informativno, zavisno od vremena) COLUMN Prez FORMAT A10 COLUMN Plata FORMAT 99,999.00 SELECT * FROM radnik

Page 8: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

8

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 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])

Page 9: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

9

GRUPNE FUNKCIJE AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz}) MAX( izraz) MIN( izraz) SUM([DISTINCT|ALL] izraz) (| - oznacava da se moze koristiti samo jedna od navedenih opcija) 1. Prikazati prezimena i imena radnika i matični broj šefa, prikazujući 0 u slučaju kada je matični broj šefa NULL. SELECT prez, ime, NVL(sef,0) AS Rukovodilac FROM radnik; 2. Prikazati matični broj, prezime velikim slovima i treće 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 uvećane za 6.33% zaokružene na jednu decimalu. SELECT prez, ime, ROUND(plata*1.633, 1) AS Povisica FROM radnik; 4. Prikazati prezimena i imena radnika i matični 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 najveće angažovanje (broj sati) radnika na projektu. SELECT MAX(brsati) FROM radproj; 7. Prikazati broj različitih rukovodilaca projekata (koliko je radnika angažovanih kao rukovodioci projekata).

Page 10: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

10

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 sefa. SELECT COUNT(sef) FROM radnik; (broje se samo torke sa NOT NULL vrednostima navedenog obeležja) (uraditi i razne druge primere) 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 angažovani (pa može maksimalni ili minimalni broj sati angažovanja ili prosečno angažovanje) SELECT sifp, COUNT(mbr) FROM radproj GROUP BY sifp; 2. Za svakog radnika prikazati matični broj i broj projekata na koji je angažovan (pa može maksimalni ili minimalni broj sati angažovanja ili prosečno angažovanje datog radnika) SELECT mbr, COUNT(sifp) FROM radproj GROUP BY mbr; 3. Za svakog radnika koji je sef prikazati matični broj i broj radnika kojima je šef i njihovu prosečnu platu (može i minimalna, maksimalna, godišnja …)

Page 11: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

11

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 prosečan broj sati angažovanja radnika, za projekte na kojima je angažovano više od 3 radnika. SELECT sifp, AVG(brsati) FROM radproj GROUP BY sifp HAVING COUNT(mbr) > 2; 2. Prikazati šifru projekta i prosečan broj sati angažovanja radnika, za projekte čija je prva cifra rayličita od 1 i na kojima je angažovano 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; Komentarisati razliku izmedju WHERE i HAVING, primenu TO_CHAR funkcije i apostrofe kod ‘1’ i nepostojanje apostrofa kod 3.

2. SPAJANJE TABELA SELECT <lista izraza> FROM <lista tabela> <lista tabela>: <naziv tabele> [<sinonim>] {, <naziv tabele> [<sinonim>]} (Dekartov proizvod) 1. Prikazati sve moguće kombinacije radnika i projekata. SELECT * FROM radnik, projekat; ILI

Page 12: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

12

SELECT * FROM radnik r, projekat p; SELECT <lista izraza> FROM <lista tabela> WHERE <uslov> Operandi uslova: izrazi Operatori: <, >, <=, >=, =, !=, <> (teta, ekvi i prirodni spoj) 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 rastućem prezimenu. SELECT DISTINCT prez, ime FROM radnik, projekat WHERE ruk = mbr ORDER BY prez; 4. Prikazati matične brojeve, prezimena i imena radnika, šifre i nazive projekata na kojima su angažovani i broj sati angažovanja. 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; (ovde posebno analizirati sinonime, zašto mora r.mbr, a može samo prez, na tabli ispisati sve primere i objasniti kako se vrši spajanje) 5. Prikazati imena i prezimena radnika koji rade na projektu sa šifrom 201 i urediti ih saglasno opadajućem redosledu imena. SELECT prez, ime FROM radnik r, radproj rp WHERE r.mbr = rp.mbr and rp.sifp = 201

Page 13: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

13

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 angažovanja na projektima na kojima je ukupno angažovanje veće 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 angažovani, za one radnike čiji je prosečan broj sati angažovanja na projektima veći 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 obeležja 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 različitimm sinonima (ulogama) 1. Za svakog radnika prikazati njegov matični broj, prezime, ime i prezime njegovog šefa. SELECT r.mbr, r.prez, r.ime, s.prez as "prezime sefa" FROM radnik r, radnik s WHERE r.sef = s.mbr; (ovo se mora detaljno objasniti)

Page 14: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

14

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; (za spajanje tabela treba raditi jos dodatnih primera)

3. UGNJEŽDENI 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 prosečne 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 mesečno angažovanje na nekom od projekata manje ili jednako angažovanju bilo kog radnika na projektu sa šifrom 202. SELECT prez, ime, plata FROM radnik r, radproj rp WHERE r.mbr = rp.mbr AND rp.brsati <= ALL (SELECT DISTINCT brsati FROM radproj WHERE sifp=202); 4. Prikazati prezimena, imena i platu svih radnika koji nisu angažovani ni na jednom projektu.

Page 15: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

15

SELECT prez, ime, plata FROM radnik WHERE mbr NOT IN (SELECT DISTINCT mbr FROM radproj); ZAVISNI UGNJEŽDENI UPITI 1. Prikazati matične brojeve, prezimena, imena i plate radnika, čiji je broj sati angažovanja na nekom projektu veći od prosečnog broja sati angažovanja 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.sifp); 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); 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 *

Page 16: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

16

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, matični broj, prezime, ime i matični broj šefa, saglasno hijerarhijskoj strukturi rukovodjenja, počev 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;

Page 17: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

17

2. Prikazati, rekurzivno, matični broj, prezime, ime i matični broj šefa, svih šefova radnika sa datim matičnim brojem. SELECT LEVEL, mbr, prez, ime, sef FROM radnik CONNECT BY mbr = PRIOR sef START WITH mbr = 101; (ovi zadaci se mogu proširiti načinima za formatiranje izlaznih rezultata tako da se torke na različitim nivoima hijerarhije ispiuju u uvucenim redovima, primenom raznih string funkcija)

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’;

Page 18: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

18

Drugi Čas

Zavisni ugnježdeni upiti, nastavak 1. Prikazati prva četiri radnika po visini zarade u preduzeću SELECT * FROM radnik r1 WHERE 4> (SELECT COUNT(*)

FROM radnik r2 WHERE r2.plata>r1.plata);

2. Prikazati matične brojeve, prezimena, imena i plate radnika koji su angažovani 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.sifp 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 osnovu 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;

Page 19: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

19

JOIN USING. Ukoliko nekoliko kolona imaju jednake nazive a podaci nisu svi jednaki, može se dodati klauzula USING u cilju odreñivanja koje kolone želimo koristiti. SELECT ime, prez, sifp FROM radnik JOIN radproj USING (mbr); /* u ovom slučaju 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 različitog 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: Može 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: Moguće 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 radnika", 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 odgovarajućeg para u drugoj tabeli Primer 1: Prikazati ime i prezime radnika i šifre projekata na kojima su zaposleni: SELECT ime, prez, sifp

Page 20: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

20

FROM radnik r LEFT OUTER JOIN radproj rp ON (r.mbr = rp.mbr) /* rezultat prikazuje i radnike koje ne rade ni na jednom projektu /* desni u ovom slučaju ne bi se razlikovao od običnog povezivanja jer nema projekata na kojima ne radi ni jedan radnik /* potpuni (FULL) bi dao isti rezultat kao i levi u ovom slučaju /*skraćena 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) /*skraćeno: 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(+)

Page 21: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

21

CROSS JOIN. Kada je uslov JOIN netačan 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 može postići 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 služi za kojekakva testiranja kada želimo da generišemo veliki broj vrsti u cilju simulacije dobijanja velike količine podataka. 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 ažuriraju 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 = 100) WHERE mbr = 112;

Page 22: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

22

Sintaksa DELETE naredbe DELETE [FROM] table [WHERE condition]; Primer 1: Brisanje tabele radnik DELETE radnik; 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);

Page 23: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

23

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'); 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);

Page 24: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

24

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); 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);

Page 25: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

25

TREĆI ČAS funkcije ROLLUP, CUBE i GROUPING koriste se sa GROUP BY, služe 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

izračunavanja uz pomoć pojedinačne SELECT naredbe • GROUPING se koristi sa CUBE ili ROLLUP operatorima, služi za pronalaženje

grupa koje formiraju zbirne rezultate i za razlikovanje NULL vrednosti iz baze i NULL vrednosti koje su generisale funkcije CUBE i ROLLUP, tj služi kao pomoć pri razumevanju na koji način su dobijene zbirne vrednosti

podsećanje 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;

Page 26: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

26

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);

Page 27: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

27

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 Vraća nulu ili jedinicu, koristi kao argument neki od naziva kolona iz klauzule GROUP BY Ako vraća nulu znači da je jedno od sledeća dva:

• Izraz je korišćen za dobijanje konačne vrednosti • NULL vrednost u izveštaju je NULL iz tabele

Ako je vraćena jedinica to znači jedno od naredna dva: • Izraz nije korišćen za dobijanje konačne 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 hoćemo da sve izmene koje je napravila tekuća transakcijapostanu trajne i nepovratne i oslobode se svi podaci koje je ta transakcija zaključala, izdaje sledeću komandu:

Page 28: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

28

COMMIT

Time se tekuća transakcija implicitno završava i započinje nova Komanda ROLLBACK Da bi smo poništili sve izmene koje je napravila tekuća transakcija (kao da se nisu ni dogodile) i oslobodili sve podatke koje je ta transakcija zaključala, izdajemo naredbu:

ROLLBACK

Kada se jedna transakcija poništi, implicitno, započinje nova. Komanda SAVEPOINT Unutar opsežne tranakcije mogu se postaviti kontrolne tačke (savepoints) koje raščlanuju radnje u transakciji: INSERT... UPDATE... DELETE... SAVEPOINT jedan INSERT... UPDATE... DELETE... SAVEPOINT dva INSERT... UPDATE... DELETE... ... Kontrolne tačke omogućuju poništavanje pojedinih delova transakcije, bez uticaja na ostale: ROLLBACK TO SAVEPOINT dva Ova komanda poništava učinak svih komandi posle kontrolne tačke DVA. Transakcija oslobaña i sve podatke koje su poništene komande zaključale čime omogućuje drugim transakcijama pristup tim podacima. Posle poništavanja do kontrolne tačke 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');

Page 29: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

29

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 angažovanju radnika u tabelu RADPROJ koji nisu angažovani 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 Služi 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 računaru. Neka se jedan kontakt u imeniku čuva u formatu: (naziv, tel1, tel2, tel3, tel4)

Page 30: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

30

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)

Page 31: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

31

Č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 zaključavanja podataka na nivou SUBP Zaključavanje cele tabele je u nekim slučajevima efikasnije od zaključavanja pojedinačnih redova LOCK TABLE LOCK TABLE <naziv tabele> IN [ROW] SHARE |

[[SHARE] ROW] EXCLUSIVE | SHARE UPDATE

MODE Primer: Zaključavanje podataka tabele RADNIK na isključiv način: LOCK TABLE radnik IN EXCLUSIVE MODE LOCK TABLE radnik IN EXCLUSIVE MODE NOWAIT

Page 32: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

32

LOCK TABLE radnik, radproj IN EXCLUSIVE MODE NOWAIT Izričito zaključavanje ć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 dužine 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 dužine 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 veličine slova (LOWER, UPPER, INITCAP) • Funkcije za manipulaciju karaktera (CONCAT, SUBSTR, LENGTH, INSTR,

LPAD|RPAD, TRIM, REPLACE)

Page 33: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

33

Funkcija Upotreba LOWER (kolona/izraz) Prebacuje sve karaktere u mala slova UPPER (kolona/izraz) Prebacuje sve karaktere u velika slova INITCAP (kolona/izraz) Sva početna slova reči prebacuje u velika,

ostala u mala slova CONCAT (kolona1/izraz1, kolona2/izraz2) Spaja dva niza karaktera (kao operator || ) SUBSTR (kolona/izraz, m [,n]) Vraća podstring počev od pozicije m

dužine n (ako je m negativno, broji od kraja stringa, ako je n izostavljeno, vraća podstring on m-te pozicije do kraja)

LENGHT (kolona/izraz) Vraća broj karaktera izraza INSTR (kolona/izraz, ’string’ [,m] [,n]) Vraća poziciju n-te pojave podstringa

počev 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 dužine n sa leve-desne strane

TRIM (leading|trailing|both, karakter_trimovanja FROM string_za_trimovanje)

Izbacuje karakter sa početka/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) Zaokružuje broj na n decimala, ili ako je n

izostavljeno, izostavlja decimalna mesta ako je n negativno zaokružuje brojeve sa leve strane decimalnog znaka

TRUNC (kolona/izraz, n) Odbacuje decimale u zavisnosti od broja n

Page 34: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

34

(slično funkciji ROUND) MOD (m , n) Vraća 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

može biti i negativan ADD_MONTHS (date, n) Dodaje broj meseci na datum NEXT_DAY (date, danUnedelji) Vraća datum narednog dana u nedelji,

argument može biti i broj LAST_DAY (date) Vraća poslednji dan u mesecu ROUND (date [, 'fmt']) Zaokružuje datum TRUNC (date [, 'fmt']) Skraćuje 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. Izračunati 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

Page 35: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

35

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. Zaokružiti 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. Izračunati starost u mesecima SELECT SYSDATE - TO_DATE('31.05.1978') starost FROM prosta; Funkcije za konverziju

• TO_CHAR • TO_NUMBER • TO_DATE

Opšte funkcije

• NVL (izraz1, izraz2) • NVL2 (izraz1, izraz2, izraz3) • NULLIF (izraz1, izraz2) • COALESCE (izraz1, izraz2, ... ,izrazN)

Page 36: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

36

Funkcija Upotreba NVL (izraz1, izraz2) Konvertuje NULL vrednost u neku konkretnu NVL2 (izraz1, izraz2, izraz3) Ako vrednost izraza1 nije NULL vraća izraz2

inače vraća izraz3 NULLIF (izraz1, izraz2) Uporeñuje dva izraza. Ako su jednaki vraća

NULL, ako nisu isti vraća prvi izraz COALESCE (izraz1, izraz2, ... ,izrazN) Vraća prvi izraz koji nije NULL Primer 1. Prikazati imena i prezimena svih radnika. Posebno naznačiti da li je zaposleni direktor ili obiičan radnik SELECT ime "ime radnika", prez "prezime", NVL2(sef, 'radnik', 'direktor') funkcija FROM radnik; Primer 2. Prikazati imena, prezimena i plate svih zaposlenih. U slučaju 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;

Page 37: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

37

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 Logičko predstavljenje podskupa podataka iz jedne ili više tabeli Sequence Generisanje numeričkih 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 ograničenja 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) ); Ograničenja služe da spreče unos neodgovarjućih podataka u tabele: Ograničenje Opis NOT NULL Ograničava da kolona ne sme sadržati NULL vrednost UNIQUE Ograničava da kolona mora imati jedinstven sadržaj na

nivou svih vrsta tabele

Page 38: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

38

PRIMARY KEY Jedinstveno identifikuje svaku vrstu tabele FOREIGN KEY Ostvaruje vezu stranog ključa izmeñu kolone i kolone druge

tabele CHECK Postavlja uslov koji mora niti zadovoljen Ograničenja se mogu imenovati ili im Oracle generiše naziv u formatu SYS_Cn, gde je n broj, pa je i sam naziv jedinstven Ograničenje na nivou kolone: Kolona [CONSTRAINT naziv_ ogranicenja] tip ogranicenja, Ograničenje 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);

Page 39: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

39

Klju čne reči ograničenja FOREIGN KEY: Klju čna reč Značenje FOREIGN KEY Za definisanje stranog ključa 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

Page 40: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

40

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 budžeta 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 (moguće su još i opcije MODIFY i ADD uz DROP) Indeksi Indeksi se kreiraju:

• Automatski: sa ubacivanjem ograničenja: PRIMARY KEY i UNIQUE • Manuelno: izrazima CREATE INDEX i CREATE TABLE

Indeksi mogu biti :

• jedinstveni (pri generisanju ograničenja PRIMARY KEY i UNIQUE) i • nejedinstveni (pri generisanju ograničenja 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 učitavanja velike količine podataka i preglednosti koda, moguće je koristi postojeći index radi kreiranja primarnog ključa.

Page 41: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

41

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 ključa ALTER TABLE student ADD PRIMARY KEY (brInd) USING INDEX broj_indexa; Generator sekvenci Za automatsko generisanje jedinstvenih brojeva, može se koristiti za generisanje vrednosti primarnog ključa, povećava efikasnost pristupa podacima. CREATE SEQUENCE sekvenca [INCREMENT BY n] [START WITH n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}] Značenje: Sekvenca Naziv sekvence INCREMENT BY n Veličina koraka izmeñu dve vrednosti, default vrednost je 1 START WITH n Početna vrednost u nizu, default vrednost je 1 MAXVALUE n Maksimalna vrednost koju sekvenca može generisati NOMAXVALUE Definiše se 1027 (-1 za opadajuće 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 opadajuće 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)

Page 42: RUKOVODI RADI NA - vps.ns.ac.rs · AVG([DISTINCT|ALL]n) COUNT({*|[DISTINCT|ALL] izraz }) MAX( izraz ) MIN(izraz ) SUM([DISTINCT|ALL] izraz ) (| - oznacava da se moze koristiti samo

42

Primer 1. Generisanje sekvence za broj indeksa studenta: CREATE SEQUENCE br_indeksa INCREMENT BY 10 START WITH 1000 MAXVALUE 9999 NOCACHE NOCYCLE; Upotreba sekvence Uz naziv sekvence koriste se funkcije NEXTVAL i CURRVAL, koje vraćaju narednu tj, trenutnu vrednost Primer 2. Uneti podatke o novim studentima uz pomoć generisanja sekvenci broja indeksa INSERT INTO student (brInd, ime, prez, odsek) VALUES (br_indeksa.NEXTVAL, ‘Marko’, ‘Peric’, 11) SELECT br_indeksa.CURRVAL FROM prosta; Sinonimi Upotrebljavaju se kad želimo da pojednostavimo pristup nekim objektima tako što ćemo im dati skraćeno ime. CREATE SYNONYM s FOR student; SELECT * FROM s; DROP SYNONYM s;