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> <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> 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]>} 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 uvećane 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 3. Prikazati prezimena i imena radnika i njihove plate uvećane za 20%, pri čemu naziv treće kolone treba da bude Povecanje plate. *1.20 as Povecanje plate 4. Prikazati prezimena i imena radnika, ali u jednoj koloni, sa jednim praznim mestom izmeñu imena i prezimena. SELECT ime prez 3
2. Prikazati matični broj i u jednoj koloni ime i prezime radnika SELECT mbr AS "maticni broj", ime ' ' prez AS radnik FROM radnik; SORTIRANJE SELECT <lista izraza> 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> WHERE <uslov selekcije> Operandi uslova: izrazi Operatori: <, >, <=, >=, =,!=, <> 1. Prikazati vrednosti svih obeležja radnika sa datim prezimenom (Mirkovic). SELECT * WHERE prez = Mirkovic ; 2. Prikazati prezimena, imena i plate radnika sa datim prezimenom (Mirkovic). WHERE prez= Mirkovic ; 4
WHERE LOWER (prez)= mirkovic ; WHERE UPPER(prez)= MIRKOVIC ; 3. Prikazati prezimena, imena i plate radnika sa platom većom od 50000. WHERE plata > 50000; 4. Prikazati prezimena, imena i plate radnika sa platom većom 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 logičkih operatora: 1. Operatori poreñenja, pripadnosti i egzistencije 2. NOT/ 3. AND/ 4. OR 4. Prikazati prezimena, imena i plate radnika sa platom većom od 50000 i manjom od 60000. 5
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. SELECT * WHERE plata > 15000 AND sef IS NULL 6
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 FUKCIJE ZA KONVERZIJU PODATAKA TO_CHAR(d[,fmt]) TO_CHAR(n[,fmt]) TO_DATE(char[,fmt]) TO_NUMBER(char[,fmt]) 7
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. SELECT mbr, UPPER(prez), SUBSTR(prez, 3,2) 8
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> 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 SELECT mbr, COUNT(sifp) FROM radproj GROUP BY mbr; 3. Za svakog radnika koji je šef prikazati matični broj i broj radnika kojima je šef i njihovu prosečnu platu SELECT sef, COUNT(mbr), AVG(plata) GROUP BY sef; Selektovanje grupa podataka SELECT <lista izraza> GROUP BY <obelezje> {, <obelezje>} HAVING <uslov selekcije grupe> 9
(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 2 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 2 radnika. SELECT sifp, AVG(brsati) FROM radproj WHERE SUBSTR(TO_CHAR(sifp),1,1)<> 1 GROUP BY sifp HAVING COUNT(mbr) > 2; 10
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); 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'); 11
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); 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); 12
VALUES (110, 203,7); VALUES (111, 204,35); VALUES (109, 205,44); VALUES (109, 204,47); VALUES (108, 205,44); 13