01.09.2013 Views

FROM emp

FROM emp

FROM emp

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

SELECT łdistinctł column <strong>FROM</strong> table;<br />

Column - koji stupci (obilježja) će biti prikazani, * - svi<br />

stupci, distinct – bez ponavljanja, alias – novo ime stupca<br />

Table- iz koje tabele prikazujemo podatke stupaca<br />

Pravila i preporuke pisanja SQL naredbe:<br />

- mogu se koristiti i mala i velika slova,<br />

- ključne riječi poželjno je pisati velikim slovima<br />

- naredba se može pisati u više redova,<br />

- klauzule je poželjno započeti pisati u novom retku<br />

- ključne riječi ne mogu se zamjenjivati kraticama, niti<br />

prelamati u retku,<br />

- naredba završava s znakom - ;<br />

Primjeri:<br />

SELECT * <strong>FROM</strong> dept;<br />

SELECT deptno, loc <strong>FROM</strong> dept;<br />

SELECT DISTINCT deptno <strong>FROM</strong> dept;<br />

SELECT ename «Imena» <strong>FROM</strong> <strong>emp</strong>;<br />

- dvostruki navodnici za pridruživanje novog imena (alias)<br />

koji sadrži specijalne znakove<br />

1


Prikaz podataka u ispisu (default):<br />

Poravnavanje lijevo - Datumi i tekstualni podaci poravnavaju<br />

se lijevo<br />

Poravnavanje desno – Brojevi<br />

Ispis – uvijek velika slova<br />

ARITMETIČKI OPERATORI<br />

+, -, * /, poznata pravila izvođenja operacija, mogućnost<br />

korištenja zagrada<br />

Primjer:<br />

SELECT ename, sal+300 <strong>FROM</strong> <strong>emp</strong>;<br />

SELECT ename, (sal+300)*6 <strong>FROM</strong> <strong>emp</strong>;<br />

2


NULL VRIJEDNOST<br />

- nula vrijednost (null value) – je vrijednost koja nije<br />

poznata, dostupna, pridružena ili sl.<br />

- nije isto što i nula (ZERO - broj) ili praznina (character)<br />

- bilo koji podatak u koloni može imati null value, osim<br />

ako se ne radi o primarnom ključu, ili obilježju koji ne<br />

može biti nula (not null)<br />

- bilo koja operacija s poljem koji ima nula vrijednost<br />

rezultirat će nulom<br />

SELECT ename, sal*6+comm <strong>FROM</strong> <strong>emp</strong>;<br />

- zarada će biti 0 za sve one koji nemaju proviziju<br />

POVEZIVANJE ISPISA KOLONA<br />

(CONCATENATION)<br />

- povezivanje kolona i drugih nizova znakova - ||<br />

- dodavanje drugih nizova znakova (character string)<br />

unutar jednostrukih navodnika ''<br />

Primjeri:<br />

SELECT deptno|| loc <strong>FROM</strong> dept;<br />

SELECT hiredate||' ----'||sal <strong>FROM</strong> <strong>emp</strong>;<br />

ZADATAK ZA VJEŽBU BROJ 1<br />

3


SELECT column <strong>FROM</strong> table WHERE uvijet(i);<br />

Uvijet – izbor (restrikcija) redaka za prikaz<br />

- klauzula WHERE sadrži 3 dijela:<br />

o ime stupca,<br />

o operator usporedbe,<br />

o ime stupca, konstantu ili listu vrijednosti<br />

primjer:<br />

SELECT ename, job, deptno<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE job='CLERK';<br />

- podaci tipa character string (tekst) i datumi upisuju se unutar<br />

jednostrukih navodnika (')<br />

- tekst je zavisan od velikih i malih slova, a datum od formata<br />

- uobičajeni datum je formata DD-MON-YY<br />

OPERATORI USPOREDBE<br />

- = JEDNAKOST<br />

- > VEĆE<br />

- < MANJE<br />

- RAZLIČITO<br />

- BETWEEN …AND… - IZMEĐU DVIJE VRIJEDNOSTI<br />

- IN (LISTA) – OBUHVAĆA BILO KOJU VRIJEDNOST U<br />

LISTI<br />

- LIKE – KAO - % I _ - ZAMJENSKI ZNAKOVI<br />

- IS NULL – JE NULA VRIJEDNOST<br />

4


Primjeri<br />

SELECT ename, job, deptno <strong>FROM</strong> <strong>emp</strong> WHERE<br />

hiredate ='01-svi-81';<br />

…WHERE SAL >= 1500;<br />

… WHERE SAL BETWEEN 1000 AND 1500;<br />

… WHERE MGR IN (7902, 7566, 7788);<br />

… WHERE ENAME LIKE 'S%';<br />

… WHERE ENAME LIKE '%A\_B%' ESCAPE '\'; A_B<br />

… WHERE MGR IS NULL;<br />

primjeri<br />

LOGIČKI OPERATORI AND, OR, NOT<br />

… WHERE SAL= 1100 AND JOB='CLERK';<br />

… WHERE SAL= 1100 OR JOB='CLERK';<br />

… WHERE JOB NOT IN ('CLERK', 'MANAGER)';<br />

… WHERE ENAME NOT LIKE 'S%';<br />

… WHERE SAL NOT BETWEEN 1000 AND 1500;<br />

Pravila prvenstva operatora<br />

1. svi operatori usporedbe<br />

2. not<br />

3. and<br />

4. or<br />

5


SELECT column<br />

<strong>FROM</strong> table<br />

WHERE uvijet(i)<br />

ORDER BY column, expre, alias – sortirano po<br />

koloni ili izrazu (asc - default, desc - treba navesti)<br />

- može se sortirati po koloni koja nije u prikazu<br />

Primjeri<br />

SELECT ename, job, deptno <strong>FROM</strong> <strong>emp</strong> WHERE sal ><br />

1500 ORDER BY ename;<br />

SELECT ename, job, deptno <strong>FROM</strong> <strong>emp</strong> WHERE sal ><br />

1500 ORDER BY ename desc;<br />

SELECT ename, job, deptno <strong>FROM</strong> <strong>emp</strong> ORDER BY<br />

ename, deptno;<br />

SELECT ename, job, deptno <strong>FROM</strong> <strong>emp</strong> ORDER BY<br />

ename, sal;<br />

SELECT <strong>emp</strong>no, ename, sal*12 «Godišnja zarada»<br />

<strong>FROM</strong> <strong>emp</strong> ORDER BY «Godišnja zarada»;<br />

ZADATAK ZA VJEŽBU BROJ 2<br />

6


SQL FUNKCIJE<br />

- kalkulacije na podacima<br />

- modificiraje podataka<br />

- upravljanje izlazom za grupe redaka<br />

- oblikovanje prikaza datuma i brojeva<br />

- mogu imati argumente i uvijek vraćaju vrijednost<br />

- single-row (izvršavaju se na jednom retku) i multiplerow<br />

funkcije (manipuliraju grupom redaka)<br />

Single-Row Funkcije<br />

Function_name (column|expression, {arg1, arg2,…})<br />

- argument: konstanta, varijabla, ime kolone, izraz<br />

- uvijek vraća jednu vrijednost za redak i može se<br />

koristiti u SELECT, WHERE, ORDER BY klauzuli<br />

- vrste: tekstne (character), brojevne (number),<br />

datumske (date), funkcije konverzije (conversion)<br />

7


CHARACTER FUNKCIJE (22kopije)<br />

- LOWER(column|expression) – u mala slova<br />

npr. LOWER ('SQL nastava') – sql nastava<br />

- UPPER (column|expression) – u velika slova<br />

npr. UPPER ('SQL nastava') – SQL NASTAVA<br />

- INITCAP (column|expression) – u velika slova samo<br />

početak riječi<br />

npr. INITCAP ('SQL nastava') – Sql Nastava<br />

- CONCAT(column1|expression1, column2|expression2) -<br />

isto kao i operator ||<br />

npr. CONCAT ('Radnik','Odjela') – RadnikOdjela<br />

- SUBSTR(column|expression, m {,n}) – vraća znakove<br />

počevši od pozicije m dužine n – ako je m negativan<br />

počinje od kraja<br />

npr. SUBSTR ('Danas',1,3) – Dan<br />

- LENGTH (column|expression) – vraća broj znamenki<br />

npr. LENGTH ('Danas')- 5<br />

- INSTR (column|expression, m) – vraća brojčanu poziciju<br />

specificiranog znaka<br />

npr. INSTR ('Danas', 's') - 5<br />

- LPAD (column|expression, n, 'string') –popunjava<br />

praznine uz desno poravnanje<br />

npr. LPAD (sal, 10,'*') - *****50000<br />

8


Primjeri<br />

SELECT 'Naziv zaposlenja za'||INITCAP (ename)||'<br />

je'||Lower (job)||'.' "Detalji o zaposlenima"<br />

from <strong>emp</strong>;<br />

SELECT <strong>emp</strong>no, ename from <strong>emp</strong> where ename='blake';<br />

SELECT <strong>emp</strong>no, ename<br />

from <strong>emp</strong><br />

where lower (ename)='blake';<br />

SELECT <strong>emp</strong>no, INITCAP(ename)<br />

from <strong>emp</strong><br />

where lower (ename)='blake';<br />

SELECT ename, length (ename), instr (ename, 'A') from<br />

<strong>emp</strong> where substr (job, 1,5)= 'SALES';<br />

NUMERIČKE FUNKCIJE<br />

ROUND (45.926, 2) – 45.93 zaokruži na dvije decim.<br />

TRUNC (45.926, 2) – 45.92 odcijepi na dvije decim.<br />

MOD (1600,300) - 100 vrati ostatak dijeljenja<br />

Primjer<br />

SELECT round (45.987, 2), round (45.987, -1), trunc<br />

(45.987, 2), trunc (45.987, -1), mod (1600,300) from dual;<br />

9


RAD S DATUMIMA<br />

- format: stoljeće, godina, mjesec, dan , sat, minute, sek<br />

- SYSDATE – sist. datum u formatu DD-MON-YY<br />

Npr. SELECT Sysdate from dual;<br />

OPERACIJE SA DATUMIMA<br />

DATE+/- broj – datum uvećan ili smanjen za broj dana<br />

DATE – DATE – broj dana između dva datuma<br />

MONTHS_BETWEEN (datum1, datum2)– mjeseci<br />

između dva datuma<br />

Npr.<br />

MONTHS_BETWEEN ('01-sep-95', '11-jan-94') 19.677<br />

ADD_MONTHS (datum, n) – dodaje n mjeseci na datum<br />

Npr. ADD_MONTHS ('11-jan-94',6) –'11-jul-94'<br />

NEXT_DAY(datum, 'char') – slijedeći dan u tjednu od<br />

odrđenog datuma koji se izražava brojem ili imenom<br />

Npr. NEXT_DAY ('01-sep-95', 'Petak' ili 5)<br />

LAST_DAY (datum) daje datum zadnjeg dana u mjesecu<br />

koji sadrži datum<br />

Npr. LAST_DAY ('01-sep-95') - '30-sep-95'<br />

ROUND(datum, 'FMT') - zaokruženje prema FMT<br />

FMT - 'Month' 'Year'<br />

Npr. ROUND ('25-jul-95', 'Month') – 01-aug-95<br />

ROUND ('25-jul-95', 'Year') 01-jan-96<br />

TRUNC (datum, 'FMT') – odcjepljenje prema FMT<br />

Npr. TRUNC ('25-jul-95', 'Month') – '1-jul-95'<br />

TRUNC ('25-jul-95', 'Year') - '1-jan-95'<br />

10


Primjeri<br />

SELECT ename, (sysdate-hiredate)/7 Tjedana<br />

from <strong>emp</strong>;<br />

SELECT <strong>emp</strong>no, hiredate,<br />

MONTHS_BETWEEN (sysdate, hiredate) mjeseci,<br />

add_months (hiredate, 6) pregled,<br />

next_day (hiredate, 'PETAK'),<br />

last_day (hiredate)<br />

from <strong>emp</strong>;<br />

SELECT<br />

MONTHS_BETWEEN ('11-RUJ-95', '11.09.93') mjeseci<br />

from dual;<br />

select <strong>emp</strong>no, hiredate,<br />

round (hiredate, 'Month'), round (hiredate, 'Year'),<br />

trunc (hiredate, 'Month'), trunc (hiredate, 'Year')<br />

from <strong>emp</strong><br />

where hiredate like '%82';<br />

11


FUNKCIJE KONVERZIJE<br />

TO_CHAR (number|date {,'fmt'}) – pretvara broj ili<br />

datum u tekst (character string) s formatom fmt<br />

TO_NUMBER (char{,'fmt'}) – tekst koji sadrži brojeve<br />

u broj uz opcionalni fmt<br />

TO_DATE (char{,'fmt'}) – pretvara tekst koji<br />

prezentira datum u tip podatka datum prema fmt, (bez<br />

fmt u default format datuma)<br />

Primjer<br />

TO_CHAR FUNKCIJA S DATUMOM<br />

SELECT <strong>emp</strong>no, TO_CHAR(hiredate, 'MM/YY')<br />

mjesec_zaposlenja from <strong>emp</strong> where ename= 'BLAKE';<br />

SELECT ename, TO_CHAR(hiredate, 'fmDD Month<br />

YYYY') datum_zaposlenja from <strong>emp</strong>;<br />

Primjeri<br />

TO_CHAR FUNKCIJA S BROJEVIMA<br />

SELECT ename, TO_CHAR(sal, '$99,999')zarada from<br />

<strong>emp</strong> where sal>2000;<br />

12


Primjer<br />

TO_DATE FUNKCIJA<br />

SELECT ename, hiredate<br />

from <strong>emp</strong><br />

where hiredate = to_date ('Veljača 22, 1981', 'Month dd,<br />

YYYY');<br />

ZADATAK ZA VJEŽBU BROJ 3<br />

13


PRIKAZ PODATAKA IZ VIŠE TABLICA<br />

- kada je potrebno dobiti prikaz podataka iz više<br />

tablica koristimo tzv. JOIN (pridruživanje)<br />

- korištenjem klauzule WHERE navodimo uvjet<br />

pridruživanja (join condition)<br />

SELECT table1.column, table2.column<br />

<strong>FROM</strong> table1, table2<br />

WHERE table1.column1=table2.column2<br />

- potrebno je korištenje prefiksa imena tablice kod<br />

imena stupaca ili aliasa (izbjegavanje «ambiguity»)<br />

- redci jedne tabele pridružuju se redcima druge tabele<br />

prema zajedničkoj vrijednosti koja postoji u stupcima<br />

(najčešće primarni i strani ključ)<br />

- pridruživanje n tablica zahtjeva minimalno n-1 uvjeta<br />

pridruživanja<br />

- Kartezijski produkt (sve kombinacije redaka će se<br />

prikazati) se javlja kada uvjet pridruživanja nije<br />

postavljen ili ga nema<br />

14


VRSTE PRIDRUŽIVANJA<br />

- Osnovni: equijoin, non-equijoin; dodatni: outer join,<br />

self join<br />

Equijoin (simple, inner)<br />

– vrijednost u stupcima obiju tablica mora biti jednaka<br />

(najčešće primarni i strani ključ)<br />

Primjer<br />

SELECT <strong>emp</strong>.<strong>emp</strong>no, <strong>emp</strong>.ename, <strong>emp</strong>.deptno,<br />

dept.deptno, dept.loc<br />

<strong>FROM</strong> <strong>emp</strong>, dept<br />

WHERE <strong>emp</strong>.deptno=dept.deptno;<br />

SELECT <strong>emp</strong>no, ename, <strong>emp</strong>.deptno, loc<br />

<strong>FROM</strong> <strong>emp</strong>, dept<br />

WHERE <strong>emp</strong>.deptno=dept.deptno<br />

AND INITCAP(ename)= 'King';<br />

SELECT e.<strong>emp</strong>no, e.ename, d.deptno, d.loc<br />

<strong>FROM</strong> <strong>emp</strong> e, dept d<br />

WHERE e.deptno=d.deptno;<br />

- pravila za alias (dužina do 30 ali što kraće, smislenost,<br />

vrijedi za samo tu naredbu select, ako se koristi u klauzuli<br />

from mora i u select)<br />

15


Non-Equijoins<br />

- postoji odnos između tabela ali nema jednakosti<br />

stupaca<br />

Primjer<br />

SELECT e.<strong>emp</strong>no, e.sal, s.grade<br />

<strong>FROM</strong> <strong>emp</strong> e, salgrade s<br />

WHERE e.sal between s.losal AND s.hisal;<br />

Outer Joins<br />

- za prikaz redaka koji ne zadovoljavaju uvjet<br />

pridruživanja (+)<br />

- operator (+) se stavlja u zagradu na onu stranu<br />

klauzule WHERE gdje nedostaju informacije<br />

- ne može se koristiti IN operator, niti se može povezati<br />

s drugim uvjetom putem OR<br />

Primjer<br />

SELECT e.<strong>emp</strong>no, e.ename, d.deptno, d.loc<br />

<strong>FROM</strong> <strong>emp</strong> e, dept d<br />

WHERE e.deptno(+)=d.deptno<br />

ORDER BY e.deptno;<br />

ZADATAK ZA VJEŽBU BROJ 4<br />

16


AGREGIRANJE PODATAKA –FUNKCIJE «GROUP»<br />

- grupiranje podataka korištenjem klauzule GROUP BY<br />

i uključivanje ili isključivanje grupiranih redaka<br />

korištenjem klauzule HAVING (ne WHERE)<br />

- funkcije «group» operiraju sa skupinom redaka i<br />

vračaju jednu vrijednost po grupi<br />

- skupina može biti cijela tablica, ili tablica podijeljena<br />

u grupe<br />

- tipovi funkcija «group»:<br />

o AVG – srednja vrijednost<br />

o COUNT – broj redaka<br />

o MAX – maksimalnu vrijednost<br />

o MIN – minimalnu vrijednost<br />

o STDDEV- standardna devijacija<br />

o SUM - zbroj<br />

o VARIANCE – varijancu<br />

SELECT [column, ] group_function (column)<br />

<strong>FROM</strong> table<br />

[ WHERE uvjet(i)]<br />

[GROUP BY column]<br />

[ORDER BY column];<br />

- klauzula DISTINTC označava da će korištena<br />

funkcija ignorirati ponavljajuće vrijednosti<br />

(ALL)<br />

17


- tipovi podataka za argumente: CHAR,<br />

VARCHAR2, NUMBER, DATE<br />

- AVG, SUM, STDDEV I VARIANCE samo s<br />

numeričkim vrijednostima<br />

- sve funkcije osim COUNT(*) ignoriraju null<br />

vrijednosti (uključivanje i null vrijednosti putem<br />

NVL funkcija)<br />

- GROUP BY sortira prikaz po rastućem (default)<br />

redoslijedu (ORDER BY za DESC)<br />

Primjeri<br />

SELECT avg(sal), max(sal), min(sal), sum(sal)<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE job like 'SALES%';<br />

SELECT min(hiredate), max(hiredate)<br />

<strong>FROM</strong> <strong>emp</strong>;<br />

SELECT min(ename), max(ename)<br />

<strong>FROM</strong> <strong>emp</strong>;<br />

SELECT count(*)<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE deptno=30;<br />

18


SELECT count(comm)<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE deptno=30;<br />

SELECT count(deptno)<br />

<strong>FROM</strong> <strong>emp</strong>;<br />

SELECT count(distinct (deptno))<br />

<strong>FROM</strong> <strong>emp</strong>;<br />

SELECT avg(comm)<br />

<strong>FROM</strong> <strong>emp</strong>;<br />

SELECT avg(nvl(comm,0))<br />

<strong>FROM</strong> <strong>emp</strong>;<br />

KREIRANJE GRUPA PODATAKA<br />

- podjela tabele u manje grupe – GROUP BY<br />

- ako se koriste group funkcije u SELECT<br />

klauzuli, ne mogu se selektirati individualni<br />

rezultati bez GROUP BY klauzule<br />

- GROUP BY klauzula mora imati stupce i ne<br />

može koristiti aliase<br />

- svi stupci u SELECT klauzuli koji nisu u gruop<br />

funkciji moraju biti u GROUP BY klauzuli<br />

19


Primjeri<br />

SELECT deptno, avg(sal)<br />

<strong>FROM</strong> <strong>emp</strong><br />

GROUP BY deptno;<br />

SELECT avg(sal)<br />

<strong>FROM</strong> <strong>emp</strong><br />

GROUP BY deptno;<br />

SELECT deptno, avg(sal)<br />

<strong>FROM</strong> <strong>emp</strong><br />

GROUP BY deptno<br />

ORDER BY avg(sal);<br />

SELECT deptno, job, sum(sal)<br />

<strong>FROM</strong> <strong>emp</strong><br />

GROUP by deptno, job; - određuje način sortiranja<br />

- postoji li GOUPE BY klauzula ne može se<br />

koristit WHERE za restrikciju grupe, već<br />

HAVING klauzula<br />

SELECT [column, ] group_function (column)<br />

<strong>FROM</strong> table<br />

WHERE uvjet<br />

GROUP BY column<br />

HAVING uvjet grupe<br />

ORDER BY column;<br />

20


Primjer<br />

SELECT deptno, avg(sal)<br />

<strong>FROM</strong> <strong>emp</strong><br />

GROUP BY deptno<br />

HAVING avg(sal)>2000;<br />

SELECT deptno, max(sal)<br />

<strong>FROM</strong> <strong>emp</strong><br />

GROUP BY deptno<br />

HAVING max(sal)>2900;<br />

SELECT deptno, avg(sal)<br />

<strong>FROM</strong> <strong>emp</strong><br />

GROUP BY deptno<br />

HAVING max(sal)>2900;<br />

SELECT job, sum(sal) Zarada<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE job not like 'SALES%'<br />

GROUP BY job<br />

HAVING sum(sal)>5000<br />

ORDER BY sum(sal);<br />

SELECT max(avg(sal)) - ugnježdavanje do dva<br />

<strong>FROM</strong> <strong>emp</strong><br />

GROUP BY deptno;<br />

ZADATAK ZA VJEŽBU BROJ 5.<br />

21


PODUPITI (SUBQUERIS)<br />

- podupit - SELECT naredba koja ugrađena u<br />

klauzulu druge SELECT naredbe<br />

- koji zaposlenici imaju veću zaradu od Jones ?<br />

– subqueris (inner guery i outer guery (main<br />

query))<br />

- unutarnji upit (inner query) izvršava se prvi<br />

- podupit se može vezati za klauzule: WHERE,<br />

HAVING, <strong>FROM</strong><br />

- operatori usporedbe:<br />

o sigle-row: , >, =, <br />

(SELECT sal<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE <strong>emp</strong>no=7566);<br />

22


PRAVILA<br />

- podupit je u zatvorenim zagradama<br />

- u podupitu se ne može koristit ORDER BY<br />

- pozicioniranje podupita desno od operatora<br />

usporedbe<br />

- ispravno korištenje single-row i multiple-row<br />

operatora i podupita<br />

Tipovi podupita (inner query)<br />

- single-row – vraća jedan redak<br />

CLERK<br />

- multiple-row – vraća više redaka<br />

CLERK<br />

SALESMAN<br />

- multiple-column – vraća više stupaca<br />

CLERK 7934<br />

SALESMAN 7844<br />

PRIMJERI - Single-row podupita<br />

- zaposlenici čije zanimanje je jednako kao i od<br />

zaposlenika s brojem 7369<br />

23


SELECT ename, job<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE job =<br />

(SELECT job<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE <strong>emp</strong>no = 7369);<br />

- zaposlenici čije zanimanje je jednako kao i od<br />

zaposlenika s brojem 7369 i čija je zarada veća<br />

od zaposlenika 7876<br />

SELECT ename, job<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE job =<br />

(SELECT job<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE <strong>emp</strong>no = 7369)<br />

AND sal><br />

(SELECT sal<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE <strong>emp</strong>no = 7876);<br />

24


Korištenje «group» funkcija u podupitima<br />

- ime, zaposlenje i zarada svih zaposlenika čija je<br />

zarada jednaka minimalnoj zaradi<br />

SELECT ename, job, sal<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE sal=<br />

(SELECT MIN(sal)<br />

<strong>FROM</strong> <strong>emp</strong>);<br />

- svi odjeli koji imaju minimalne zarade veće od<br />

odjela 20<br />

SELECT deptno, MIN(sal)<br />

<strong>FROM</strong> <strong>emp</strong><br />

GROUP BY deptno<br />

HAVING MIN(sal) ><br />

(SELECT MIN(sal)<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE deptno = 20);<br />

25


- zaposlenje s najvećom prosječnom zaradom<br />

SELECT job, AVG(sal)<br />

<strong>FROM</strong> <strong>emp</strong><br />

GROUP BY job<br />

HAVING AVG(sal) =<br />

(SELECT MIN(AVG(sal))<br />

<strong>FROM</strong> <strong>emp</strong><br />

GROUP BY job);<br />

Najčešće greške u podupitima:<br />

single-row podupit vraća više redaka pa operator ne<br />

može usporediti<br />

SELECT <strong>emp</strong>no, ename<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE sal =<br />

(SELECT MIN(sal)<br />

<strong>FROM</strong> <strong>emp</strong><br />

GROUP BY deptno);<br />

- zamijeni sa operatorom IN<br />

26


Najčešće greške: single-row podupit ne vraća niti<br />

jedan redak<br />

- svi zaposlenici čija su zaposlenja jednaka Smithovom<br />

zaposlenju<br />

SELECT ename, job<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE job =<br />

(SELECT job<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE ename = 'SMYTH');<br />

Operatori usporedbe:<br />

Multiple-row podupiti<br />

- IN (jednako s bilo kojom vrijednošću u listi),<br />

- ANY – SOME (uspoređuje vrijednost sa svakom<br />

vrijednošću iz podupita),<br />

- ALL (uspoređuje vrijednost sa svim<br />

vrijednostima iz podupita)<br />

27


Primjeri<br />

- zaposlenici (ime, zarada i broj odjela) čije zarade<br />

su jednake minimalnoj zaradi u odjelu<br />

SELECT <strong>emp</strong>no, sal, deptno<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE sal IN<br />

(SELECT MIN(sal)<br />

<strong>FROM</strong> <strong>emp</strong><br />

GROUP BY deptno);<br />

SELECT <strong>emp</strong>no, sal, deptno<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE sal IN (800, 950, 1300);<br />

- zaposlenici čija zarada je niža od bilo kojeg<br />

činovnika (clerk), a da nisu činovnici<br />

SELECT <strong>emp</strong>no, ename, job<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE sal < ANY<br />

(SELECT sal<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE job = 'CLERK')<br />

AND job 'CLERK';<br />

< ANY – manje od maksimuma<br />

> ANY – više od minimuma<br />

= ANY – isto kao IN<br />

28


- zaposlenici čija je zarada je veća od prosječne<br />

zarade svih odjela<br />

SELECT <strong>emp</strong>no, ename, job<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE sal > ALL<br />

(SELECT AVG(sal)<br />

<strong>FROM</strong> <strong>emp</strong><br />

GROUP BY deptno);<br />

< ALL – manje od minimuma<br />

> ALL – više od makximuma<br />

- NOT operator može se koristiti sa IN, ANY, ALL<br />

29


Multiple-column podupiti<br />

- uspoređuje dvije i više stupaca korištenjem<br />

višestrukih WHERE uvjeta<br />

SELECT column, column, …<br />

<strong>FROM</strong> table<br />

WHERE (column, column, …) IN<br />

(SELECT column, column, …<br />

<strong>FROM</strong> table<br />

WHERE condition);<br />

30


Primjer<br />

- prikaz imena zaposlenika, broj odjela i zarade svih<br />

zaposlenika čiji broj odjela i zarada je kao i broj<br />

odjela i zarada svih zaposlenika koji imaju proviziju<br />

SELECT ename, deptno, sal<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE (sal, deptno) IN<br />

(SELECT sal, deptno<br />

<strong>FROM</strong> <strong>emp</strong><br />

WHERE comm IS NOT NULL);<br />

NULL vrijednosti u podupitima<br />

- zaposlenici koji nemamju nadrđenog<br />

SELECT zaposlenici.ename<br />

<strong>FROM</strong> <strong>emp</strong> zaposlenici<br />

WHERE zaposlenici.<strong>emp</strong>no NOT IN<br />

(SELECT manager.mgr<br />

<strong>FROM</strong> <strong>emp</strong> manager);<br />

- jedna vrijednost koju vraća podupit je 0 – svi<br />

uvjeti koji se uspoređuju sa rezultatom null<br />

vrijednosti daju null (ako podupit ima jednu od<br />

vrijednosti null ne smije se koristiti NOT IN<br />

(!=ALL)<br />

31


Podupit u klauzuli FORM<br />

- podupit u FORM klauzuli određuje izvor<br />

podataka za tu SELECT naredbu<br />

- ime, zarada, broj odjela i prosječna zarada za sve<br />

zaposlenike koji zarađuju više od prosječne zarade<br />

njihovog odjela<br />

SELECT a.ename, a.sal, a.deptno, b.salavg<br />

<strong>FROM</strong> <strong>emp</strong> a, (SELECT deptno, avg(sal) salavg<br />

<strong>FROM</strong> <strong>emp</strong><br />

GROUP BY deptno) b<br />

WHERE a.deptno=b.deptno<br />

AND a.sal> salavg;<br />

32

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!