You are on page 1of 18

Kolegij

Baze podataka
Grupne funkcije
SQL funkcije

• izvođenje računskih operacija nad podacima


• modifikacije prikaza pojedinih kolona
• konverzije tipova podataka odgovarajućih kolona

• sintaksa  naziv_funkcije(argument1, argument2, …)

1. Jednostavne funkcije radnik


- odnose se na jedan redak tablice
- izvršavaju se ponovo za svaki selektirani redak
- brojčane, znakovne, datumske, funkcije za konverziju
ostale funkcije

2. Grupne funkcije
- odnose se na više redaka tablice

VRATI DULJINU ZNAKOVNOG NIZA


-jednostavna funkcija, odnosi se na jedan redak

IZRAČUNAJ PROSJEČNU PLAĆU


-grupna funkcija, odnosi se na više redaka

2
ID Ime Prezime Placa Staz Spol ID_odjel
1 Ivan Ivić 3500 4 M 1
2 Jurica Jurić 4200 7 M 1
3 Ana Anić 5500 10 Ž 1
4 Ante Antić 3900 5 M 2
5 Jozo Jozić 4400 10 M 2
6 Maja Majić 6000 15 Ž 2

• prosjek plaće po odjelu?


• prosjek plaće po spolu?
• prosjek plaće zaposlenih duže od 5 godina?
• najveća plaća u firmi?
• najmanja plaća po odjelu?
• najveća plaća po spolu?
ID Ime Prezime Placa Staz Spol ID_odjel
1 Ivan Ivić 3500 4 M 1
2 Jurica Jurić 4200 7 M 1
3 Ana Anić 5500 10 Ž 1
4 Ante Antić 3900 5 M 2
5 Jozo Jozić 4400 10 M 2
6 Maja Majić 6000 15 Ž 2

• prosjek plaće po odjelu?

CILJ  grupirati ljude po odjelima i onda za svaku


grupu naći prosječnu plaću!
ID Ime Prezime Placa Staz Spol ID_odjel
1 Ivan Ivić 3500 4 M 1
2 Jurica Jurić 4200 7 M 1
3 Ana Anić 5500 10 Ž 1
4 Ante Antić 3900 5 M 2
5 Jozo Jozić 4400 10 M 2
6 Maja Majić 6000 15 Ž 2

• prosjek plaće po spolu?

CILJ  grupirati ljude po spolu i onda za svaku grupu


naći prosječnu plaću!
Podjela grupnih SQL funkcija:

1. AVG funkcija – računa srednju vrijednost

2. COUNT funkcija – računa broj redaka

3. MAX funkcija – prikazuje najveću vrijednost

4. MIN funkcija – prikazuje najmanju vrijednost


5. STDDEV funkcija – računa standardnu devijaciju (odstupanje od
prosječne vrijednosti

6. SUM funkcija – računa sumu pojedinih vrijednosti


7. VARIANCE funkcija – računa kvadratnu vrijednost od standardne
devijacije
Korištenje grupnih funkcija (1/2)
- sve grupne funkcije osim COUNT funkcije ignoriraju NULL
vrijednosti

- kako bi grupne funkcije koristile NULL vrijednosti prethodno nad


kolonama sa NULL vrijednostima treba primijeniti NVL funkciju

Primjer:
SELECT AVG(commission_pct) FROM employees;
- rezultat je pogrešan jer funkcija ukupnu sumu dijeli samo sa brojem radnika koji imaju
dodijeljenu vrijednost commission_pct kolone

SELECT AVG(NVL(commission_pct,0)) FROM employees;


- rezultat je ispravan jer ukupnu sumu dijeli sa brojem svih radnika
Korištenje grupnih funkcija (2/2)

SELECT AVG(salary) FROM employees;


- računa prosječnu plaću svih radnika

SELECT MAX(salary), MIN(salary), AVG(salary)


FROM employees;
- računa najveću, najmanju i prosječnu plaću svih
radnika

SELECT COUNT(*) FROM employees


WHERE department_id=50;
- računa broj radnika koji rade u odjelu sa šifrom 50
GROUP BY klauzula (1/3)

- korištenjem GROUP BY klauzule redovi tablice


mogu se podijeliti u manje grupe

SELECT department_id, AVG(salary)


FROM employees
GROUP BY department_id;
- računa se prosječna plaća u svakom od pojedinih odjela
GROUP BY klauzula (2/3)

- pojedine redove možemo isključiti iz


grupiranja korištenjem WHERE klauzule

SELECT department_id, AVG(salary)


FROM employees
WHERE department_id != 40
GROUP BY department_id;
- računa se prosječna plaća u svim odjelima osim odjela sa šifrom 40
zaposlenik
ID Ime Prezime Placa Staz Spol ID_odjel
1 Ivan Ivić 3500 4 M 1
2 Jurica Jurić 4200 7 M 1
3 Ana Anić 5500 10 Ž 1
4 Ante Antić 3900 5 M 2
5 Jozo Jozić 4400 10 M 2
6 Maja Majić 6000 15 Ž 2

SELECT ID_odjel, AVG(placa) FROM zaposlenik


GROUP BY ID_odjel

Što smo time dobili?

ID_odjel AVG(placa)
1 4400
2 4766
zaposlenik
ID Ime Prezime Placa Staz Spol ID_odjel
1 Ivan Ivić 3500 4 M 1
2 Jurica Jurić 4200 7 M 1
3 Ana Anić 5500 10 Ž 1
4 Ante Antić 3900 5 M 2
5 Jozo Jozić 4400 10 M 2
6 Maja Majić 6000 15 Ž 2

SELECT ID_odjel, AVG(salary) FROM zaposlenik


WHERE staz>5
GROUP BY ID_odjel

Što smo time dobili?


ID_odjel AVG(placa)
1 4850
2 5200
GROUP BY klauzula (3/3)

- pojedine grupe možemo dodatno podijeliti


na još manje grupe

SELECT department_id, job_id, AVG(salary)


FROM employees
GROUP BY department_id, job_id;
- računa se prosječna plaća za svaki posao unutar pojedinog odjela
Nedozvoljeni upiti

- za sve operacije nad skupom redaka obavezna je


GROUP BY klauzula

SELECT department_id, MIN(salary)


FROM employees; Pogrešna sintaksa!

ORA-00937: not a single-group group function

SELECT department_id, MIN(salary)


FROM employees Ispravna sintaksa!
GROUP BY department_id;
HAVING klauzula (1/2)
- koristi se za uključivanje ili isključivanje pojedinih grupa
redaka

SELECT department_id, COUNT(*)


FROM employees
GROUP BY department_id;
- ispisuje se broj radnika za pojedine odjele

SELECT department_id, COUNT(*)


FROM employees
GROUP BY department_id
HAVING COUNT(*) > 3;
- ispisuje se broj radnika za one odjele u kojima radi više od 3 radnika
HAVING klauzula (2/2)

Primjer 1: Koji poslovi su plaćeni više od 10.000$ ?

SELECT job_id, MAX(salary)


FROM employees
GROUP BY job_id
HAVING MAX(salary) > 10000;

Primjer 2: Koji odjeli moraju za plaće izdvojiti više od 50.000$ ?

SELECT department_id, SUM(salary)


FROM employees
GROUP BY department_id
HAVING SUM(salary) > 50000;
Nedozvoljeni upiti
- WHERE klauzula se ne može koristiti za operacije nad grupom
podataka, već se mora koristiti HAVING klauzula

SELECT department_id, AVG(salary)


FROM employees Pogrešna sintaksa! Grupna funkcija
WHERE AVG(salary) > 6000 se ne koristi u WHERE klauzuli!
GROUP BY department_id;
ORA-00934: group function is not allowed here

SELECT department_id, AVG(salary)


FROM employees
Ispravna sintaksa!
GROUP BY department_id
HAVING AVG(salary) > 6000;
SAŽETAK

- 7 grupnih SQL funkcija (sumiranja, statistika)

- redovi se grupiraju pomoću GROUP BY klauzule

- pojedini redovi se mogu eliminirati pomoću WHERE klauzule

- grupe redova se mogu uključivati ili isključivati pomoću HAVING klauzule

- preporučeni redoslijed:
SELECT <kolone>
FROM <tablica>
WHERE <uvjeti na nivou reda>
GROUP BY <kolone>
HAVING <uvjeti na nivou grupe>
ORDER BY <kolone>

You might also like