ER model šeme baze podataka: (Sef) (0, N) (0, N) RADNIK (0, 1) SEF (0, N) (Podredjeni) RUKOVODI RADI _NA (1, 1) (0, N) PROJEKAT Š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) = 1
Komande okruženja CONNECT kor.ime/pass[@adresa_servera] DISCONNECT ED otvaranje editora R pokretanje sadržaja editora CLEAR SCREEN DESC ime tabele EXIT 1. UPITI NAD JEDNOM TABELOM SELECT * FROM <naziv relacije Prikaz svih torki date relacije vrednosti svih obeležja 1. Prikazati sadržaj svake od relacija (tabela). SELECT * SELECT <lista obelezja> FROM <naziv relacije> <lista obelezja> - niz naziva obeležja, razdvojenih zarezom, iza poslednjeg elementa u nizu NE stavlja se zarez, redosled navoñenja obeležja je proizvoljan 1. Prikazati prezimena i imena svih radnika. SELECT prez, ime Opcija DISTINCT SELECT DISTINCT <lista obelezja> FROM <naziv relacije> 1. Prikazati sva različita prezimena i imena svih radnika. SELECT DISTINCT prez, ime 2
2. Prikazati sve različite plate radnika. SELECT DISTINCT plata 3. Prikazati različite šifre projekata na kojima je angažovan 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 značenja zagrada: < > - označavaju da je potrebno upisati neki konkretan naziv ili izraz, naravno, bez navodjenja ovih zagrada [ ] označavaju opcione delove naredbe { } označavaju deo naredbe koji se moze ponavljati 0, 1, 2 ili n puta 1. Prikazati prezimena i imena radnika i njihove plate uvecane za 20%. *1.20 2. Prikazati prezimena i imena radnika i njihove plate uvećane za 20%, pri čemu naziv treće kolone treba da bude Povisica. *1.20 as Povisica, 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. *1.20 as Povecanje plate 3
4. Prikazati prezimena i imena radnika, ali u jednoj koloni, sa jednim praznim mestom izmedju imena i prezimena. SELECT ime prez 2. Prikazati maticni broj i u jednoj koloni ime i prezime radnika 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 rastućem redosledu plata. ORDER BY plata; 2. Prikazati prezimena i imena radnika i njihove plate, sortirano po rastućem redosledu plata i unutar iste plate po opadajućem redosledu prezimena. ORDER BY plata, prezime DESC; SELEKCIJA torki SELECT <lista izraza> FROM <naziv relacije> WHERE <uslov selekcije> Operandi uslova: izrazi Operatori: <, >, <=, >=, =,!=, <> 1. Prikazati vrednosti svih obeležja radnika sa datim prezimenom (Mirkovic). SELECT * WHERE prez = Mirkovic ; 4
2. Prikazati prezimena, imena i plate radnika sa datim prezimenom (Mirkovic). WHERE prez= Mirkovic ; WHERE LOWER (prez)= mirkovic ; WHERE UPPER(prez)= MIRKOVIC ; 3. Prikazati prezimena, imena i plate radnika sa platom vecom od 50000. WHERE plata > 50000; 4. Prikazati prezimena, imena i plate radnika sa platom vecom od 50000 i manjom od 60000. 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/ 2. NOT/ 3. AND/ 4. OR 5
4. Prikazati prezimena, imena i plate radnika sa platom vecom od 50000 i manjom od 60000. WHERE plata BETWEEN 50000 AND 60000; 5. Prikazati prezimena, imena i plate radnika koji se zovu Petar ili Dragana. WHERE ime = Petar or ime = Dragana ; ILI WHERE ime IN ( Petar, Dragana ); ILI WHERE ime = ANY ( Petar, Dragana ); 5. Prikazati prezimena, imena i plate radnika čije je drugo i poslednje slovo imena a. WHERE ime LIKE _a%a ; 6. Prikazati prezimena, imena i plate radnika koji se ne zovu ni Petar ni Dragana. WHERE ime <> Petar and ime <> Dragana ; ILI WHERE ime NOT IN ( Petar, Dragana ); ILI WHERE ime <> ALL ( Petar, Dragana ); 7. Prikazati radnike u formatu: Radnik: Jovic Jovan ima platu: 15670 dinara. SELECT Radnik: prez ime ima platu: plata dinara. AS Plate radnika 8. Prikazati sve radnike koji zaradjuju vise od 15000 i koji nemaju svog rukovodioca. 6
SELECT * WHERE plata > 15000 AND sef IS NULL 9. Prikazati sve radnike koji imaju rukovodioca. SELECT * WHERE sef IS NOT NULL 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 7
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) ( - označava da se moze koristiti samo jedna od navedenih opcija) 1. Prikazati prosečnu platu radnika. SELECT AVG(plata) 2. Prikazati najveće angažovanje (broj sati) radnika na projektu. SELECT MAX(brsati) FROM radproj; 3. Prikazati broj različitih rukovodilaca projekata (koliko je radnika angažovanih kao rukovodioci projekata). SELECT COUNT(DISTINCT ruk) FROM projekat; 4. Prikazati ukupan broj radnika. SELECT COUNT(*) AS "Broj radnika" 5. Prikazati ukupan broj radnika koji imaju šefa. SELECT COUNT(sef) 6. 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 7. Prikazati matični broj, prezime velikim slovima i treće i četvrto slovo prezimena za svakog radnika. 8
SELECT mbr, UPPER(prez), SUBSTR(prez, 3,2) 8. 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 9. 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 ) 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 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 SELECT sef, COUNT(mbr) GROUP BY sef; 9
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 različ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; 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, 10
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); VALUES (100, 'Mitrovic','Milan',null,75000, '31-05-1975'); VALUES (101, 'Mirkovic','Dragana',100,65000, '12-06-1978'); VALUES (102, 'Filipovic','Petar',100,65000, '17-11-1979'); VALUES (103, 'Kljajic','Marija',100,65000, '18-06-1979'); VALUES (104, 'Psodorov','Laza',101,45000, '19-10-1984'); VALUES (105, 'Kapidzic','Pera',101,45000, '21-01-1983'); VALUES (106, 'Peric','Sandra',102,45000, '27-12-1980'); VALUES (107, 'Lazic','Dragana',103,55000, '12-05-1980'); VALUES (108, 'Nadj','Ana',103,55000, '14-11-1986'); VALUES (109, 'Kopanja','Maja',103,25000, '28-10-1988'); VALUES (110, 'Mirkovic','Aleksandar',102,25000, '12-01-1980'); 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); 11
INSERT INTO Projekat VALUES (204, 'IS Kafane',102); INSERT INTO Projekat VALUES (205, 'IS fakulteta',103); VALUES (100, 200,4); VALUES (101, 201,6); VALUES (101, 202,7); VALUES (101, 203,16); VALUES (102, 204,12); VALUES (103, 205,5); VALUES (107, 201,13); VALUES (108, 201,3); VALUES (109, 202,21); VALUES (110, 202,14); VALUES (111, 203,8); VALUES (110, 203,7); VALUES (111, 204,35); VALUES (109, 205,44); VALUES (109, 204,47); VALUES (108, 205,44); 12
Drugi deo SPAJANJE TABELA SELECT <lista izraza> FROM <lista tabela> <lista tabela>: <naziv tabele> [<sinonim>] {, <naziv tabele> [<sinonim>]} 1. Prikazati sve moguće kombinacije radnika i projekata. SELECT *, projekat; ILI SELECT * 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, projekat WHERE ruk = mbr; 2. Prikazati prezimena i imena onih radnika koji su rukovodioci nekog projekta. SELECT DISTINCT prez, ime, 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, projekat WHERE ruk = mbr ORDER BY prez; 13
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 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 opadajućem redosledu imena. SELECT prez, ime 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 (Dragana Mirkovic). SELECT nazp r, radproj rp, projekat p WHERE prez = Mirkovic AND ime = Dragana 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) 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> 14
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" 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(*) r, radnik s WHERE r.sef = s.mbr GROUP BY s.prez, s.ime; 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. WHERE plata > ANY (SELECT AVG(plata) ); 2. Prikazati prezimena, imena i plate radnika koji ne zaradjuju minimalnu (maksimalnu) platu. WHERE plata <> ALL (SELECT MIN(plata) ); WHERE plata <> (SELECT MIN(plata) ); 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. 15
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. 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 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 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 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 r WHERE NOT EXISTS (SELECT DISTINCT p.ruk FROM projekat p WHERE p.ruk = r.mbr); 16
5. Prikazati prezime i ime najstarijeg rukovodioca projekta. SELECT prez, ime r, projekat p WHERE r.mbr=p.ruk and NOT EXISTS(SELECT * r1, projekat p1 WHERE r1.mbr=p1.ruk and r1.datr>r.datr) 6. Prikazati prva četiri radnika po visini zarade u preduzeću SELECT * r1 WHERE 4> (SELECT COUNT(*) r2 WHERE r2.plata>r1.plata); 7. Prikazati matične brojeve, prezimena, imena i plate radnika koji su angažovani na svakom projektu. SELECT mbr, ime, prez, plata 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)); Rešenje je u formi: SELECT1(SELECT2(SELECT3)) Gde je: SELECT1 - njime se selektuju se radnici koji su angažovani na svakom projektu (tj. ne postoji projekat na kojem nisu angažovani) SELECT2 - njime se selektuju se svi projekti na kojima ne radi radnik za kojeg se trenutno ispituje situacija (projekti nisu u skupu projekata na kojima radnik radi ) SELECT3 - njime se selektuju se svi projekti na kojima radi radnik za kojeg se trenutno ispituje situacija 17
Treći deo Osnovni SQL tipovi podataka Tip podataka NUMBER(p,s) Opis 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) LONG CLOB RAW i LONG RAW BLOB BFILE ROWID Fiksni niz karaktera dužine s (1 < s < 2000) Promenjivi niz karaktera (do 2GB) Niz karaktera (do 4 GB) Promenjivi binarni niz Binarni niz (do 4 GB) Binarni podaci smešteni u spoljnom fajlu 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) 18
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 ) Dopunjava niz karaktera sa pojavama niza RPAD (kolona/izraz, n, string ) karaktera string do dužine n sa leve-desne TRIM (leading trailing both, karakter_trimovanja FROM string_za_trimovanje) REPLACE (tekst, string_za_pretragu, novi_string) Primer strane Izbacuje karakter sa početka/kraja/oba niza karaktera string_za_trimovanje Pronalazi string_za_pretragu u tekstu i zamenjuje svaku njegovu pojavu sa novi_string SELECT CONCAT(CONCAT (ime, ' '), prez) radnik SELECT CONCAT (ime ' ', prez) radnik SELECT LPAD(ime, 12, ' ab') radnik, prez SELECT ime, prez, LPAD(plata, 10, '*') SELECT TRIM(leading 'M' FROM ime) WHERE ime LIKE 'M%'; SELECT REPLACE(ime, 'a','a') 19
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 (slično funkciji ROUND) MOD (m, n) Vraća ostatak pri deljenju brojeva m i n Primer: SELECT ROUND(avg (plata), 3) "Prosek plata" SELECT distinct TRUNC(46.927), TRUNC(46.927,2), TRUNC(46.927,-1) SELECT distinct ROUND(46.927), ROUND(46.927,2), ROUND(46.927,-1) CREATE TABLE prosta (x CHAR(1)); INSERT INTO prosta VALUES ( x ); funkcije nad datumskim tipovima Funkcija MONTHS_BETWEEN (date1, date2) ADD_MONTHS (date, n) NEXT_DAY (date, danunedelji) LAST_DAY (date) ROUND (date [, 'fmt']) TRUNC (date [, 'fmt']) Upotreba Broj meseci izmeñu dva datuma, rezultat može biti i negativan Dodaje broj meseci na datum Vraća datum narednog dana u nedelji, argument može biti i broj Vraća poslednji dan u mesecu Zaokružuje datum Skraćuje datum SELECT SYSDATE vreme FROM prosta; 20
Primer 1. selektovati razliku izmeñu najstarijeg i najmlañeg radnika SELECT MAX(MONTHS_BETWEEN (r1.datr, r2.datr)) "Maximalna razlika" 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 SELECT ime ' ' prez radnik, datr "Datum rodjenja", ADD_MONTHS(datr, 18*12) Punoletstvo 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 21
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) Funkcija NVL (izraz1, izraz2) NVL2 (izraz1, izraz2, izraz3) NULLIF (izraz1, izraz2) COALESCE (izraz1, izraz2,...,izrazn) Upotreba Konvertuje NULL vrednost u neku konkretnu Ako vrednost izraza1 nije NULL vraća izraz2 inače vraća izraz3 Uporeñuje dva izraza. Ako su jednaki vraća NULL, ako nisu isti vraća prvi izraz 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 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 r1, radnik r2 22
WHERE r1.sef = r2.mbr (+); UPDATE radnik SET plata = 75000 WHERE mbr=101; 23