SQL – null vrenosti, ORDER BY klauzula,
izrazi i agregatne funkcije
Korišćenje NULL vrednosti
U relacionom modelu mogu se definisati dve vrste “nula vrednosti”:
-Nula vrednost sa smislom “još nepoznata vrednost”, marker sa specifičnim binarnim kodom koji označava nedostatak informacija o vrednosti nekog atributa.
-Nula vrednost sa smislom “neprimenljiivo svojstvo” koja označava da neki atribut nije primenljivo svojstvo za sve n-torke date relacije.
SQL:1999 podržava samo jednu nula vrednost. Projektant i korisnik treba da pretpostave da je u pitanju nula vrednost sa smislom “još nepoznata vrednost”. Dali neki atribut relacije ima nula vrednost testira se preko klauzule IS NULL ili IS NOT NULL.
1. Prikazati ime, posao i premiju radnika koji ne primaju premiju.
SELECT IME, POSAO, PREMIJA
FROM RADNIK
WHERE PREMIJA IS NULL;
2. Prikazati ime, posao i premiju radnika koji primaju premiju
SELECT IME, POSAO, PREMIJA
FROM RADNIK
WHERE PREMIJA IS NOT NULL;
Sortiranje rezultata (ORDER BY klauzula)
Korišćenjem ORDER BY klauzule moguće je sortirati rezultujuću tabelu po jednom ili više atributa u rastućem ili opadajućem redosledu.
Za specifikaciju rastućeg redosleda koristi se klauzula ASC, a za specifikaciju opadajućeg redosleda klauzula DESC. Rastući redosled se podrazumeva, pa klauzulu ASC nije neophodno navoditi, za razliku od klauzule DESC koju uvek treba navesti kada se sortira u opadajućem redosledu. ORDER BY je uvek poslednja klauzula u SELECT bloku.
3. Prikaži ime, posao i platu radnika u odeljenju 30 uredjene u rastućem redosledu poslova i opadajućem redosledu plata.
SELECT IME, POSAO, PLATA
FROM RADNIK
WHERE ODELJENJE# = 30
ORDER BY POSAO ASC, PLATA DESC;
Kada se sortiranje vrši po koloni koja sadrži NULL vrednosti, redosled prikaza n-torki sa NULL vrednostima u koloni sortiranja uslovljen je realizacijom SQL-a u konkretnom SUBP-u.
Izrazi i agregatne funkcije
SQL ima više funkcija koje se koriste za dobijanje izvedenih, sumarnih informacija. Te funkcije se obično nazivaju agregatnim funkcijama. Primena agregatne funkcije zahteva da redovi tabele na koju seagregatna funkcija primenjuje budu grupisani na neki način. Svaka agregatna funkcija generiše jedan rezultujući red za svaku grupu redova tabele. Ukoliko grupisanje redova tabele nije eksplicitno specificirano, čitava tabela tretira se kao jedna grupa.
Najznačajnije agregatne funkcije su:
AVG (naziv_kolone) - izračunava srednju vrednost
SUM (naziv_kolone) - izračunava ukupnu vrednost
MIN (naziv_kolone) - nalazi minimalnu vrednost
MAX (naziv_kolone) - nalazi maksimalnu vrednost
COUNT (*) - nalazi broj redova u grupi
COUNT ([ALL] naziv_kolone) - nalazi broj definisanih (not null) vrednosti kolone
COUNT (DISTINCT naziv_kolone) -nalazi broj različitih definisanih (not null) vrednosti kolone
Argument za funkcije SUM i AVG mora biti kolona brojevnih vrednosti. Argumentu može da prethodi rezervisana reč DISTINCT, koja ukazuje na eliminaciju duplikata u koloni–argumentu pre primene funkcije, ili rezervisana reč ALL što se i podrazumeva) kada se funkcija primenjuje na sve vrednosti u koloni, uključujući i duplikate.
Specijalni oblik funkcije COUNT, COUNT(*) prebrojava vrste (a ne vrednosti kolone) koje zadovoljavaju zadati logički uslov. Ovaj oblik agregatne funkcije COUNT ne dozvoljava navođenje DISTINCT opcije i podrazumeva opciju ALL.
Za sve agregatne funkcije (osim COUNT(*)) važi da se primenjuju samo na ne-NULL vrednosti kolone–argumenta iz onih vrsta odgovarajuće tabele koje zadovoljavaju logički uslov WHERElinije upita. Agregatna funkcija COUNT(*) primenjuje se na sve vrste koje zadovoljavaju zadati uslov.
4. Naći minimalnu, srednju i maksimalnu platu, kao i broj radnika u odeljenju 10
SELECT MIN (PLATA), AVG (PLATA), MAX (PLATA), COUNT (*)
FROM RADNIK
WHERE ODELJENJE# = 10;
5. Naći ukupnu platu i ukupnu premiju za trgovačke putnike
SELECT SUM (PLATA), SUM (PREMIJA)
FROM RADNIK
WHERE POSAO = 'TRG_PUTNIK';
Pored toga što argumenti agregatnih funkcija mogu biti izrazi, i same agregatne funkcije mogu biti operandi izraza. To je ilustrovano sledećim upitom:
6. Koliko je srednje godišnje primanje trgovačkih putnika?
SELECT AVG (PLATA + PREMIJA) * 12
FROM RADNIK
WHERE POSAO = 'TRG_PUTNIK';
Operator grupisanja - GROUP BY klauzula
Na jednostavni SELECT upitni blok moguće je primeniti i operator grupisanja
GROUP BY ime-kolone
koji preuređuje (logički) tabelu iz FROM linije u particije ili grupe tako da unutar jedne grupe sve vrste imaju istu vrednost u koloni iz GROUP BY operatora. Takođe važi i da su sve vrste tabele sa istom vrednošću kolone iz GROUP BY operatora – u jednoj grupi. Za potrebe grupisanja, sve NULL vrednosti u koloni iz GROUP BY operatora tretiraju se kao jednake.
SELECT linija se sada primenjuje na svaku grupu, a ne na svaku vrstu tabele, tj. prouzrokuje dobijanje jednog rezultujućeg reda za svaku različitu vrednost kolone po kojoj se vrši grupisanje.
7. Naći minimalnu, srednju i maksimalnu platu kao i ukupan broj radnika u svakom odeljenju
SELECT MIN (PLATA), AVG (PLATA), MAX (PLATA), COUNT (*), ODELJENJE#
FROM RADNIK
GROUP BY ODELJENJE#;
Kvalifikovano grupisanje - HAVING klauzula
Kao što pretraživanje vrsta tabele SELECT upitnim blokom može biti kvalifikovano WHERE logičkim izrazom kojim se biraju, odnosno eliminišu vrste tabele iz FROM linije, tako i pretraživanje grupa dobijenih GROUP BY operatorom može biti kvalifikovano primenom logičkog izraza kojim se biraju one grupe na koje će se SELECT linija primenjivati, odnosno eliminišu ostale grupe. Taj novi logički izraz zadaje se operatorom:
HAVING logički-izraz
Dakle, ovaj operator određuje kriterijume za selekciju grupa koje su prethodno specificirane GROUP BY klauzulom.
8. Prikazati koje poslove obavlja više od dva radnika u svakom odeljenju.
SELECT ODELJENJE#, POSAO, COUNT(*)
FROM RADNIK
GROUP BY ODELJENJE#, POSAO
HAVING COUNT (*) > 2;
Aritmetičke operacije
SQL naredbe mogu sadržati aritmetičke izraze sastavljene od imena kolona i konstantnih vrednosti povezanih aritmetičkim operatorima (“+”, “*”, “-”, “/”)
9. Koliko je srednje godišnje primanje svih trgovačkih putnika.
SELECT AVG (PLATA + PREMIJA) * 12
FROM RADNIK
WHERE POSAO = 'TRG_PUTNIK';
Redosled klauzula
WHERE, GROUP BY, HAVING i ORDER BY klauzule mogu se koristiti zajedno, pri čemu se moraju navoditi u datom redosledu.
10. Odrediti srednju godišnju platu za svako odeljenje. Pri računanju ne uzimati u obzir predsednika i rukovodioce odeljenja. Prikazati samo ona odelenja gde je srednju godišnju platu veća od 1570000. Sortirati rezultat po srednjoj godišnjoj plati.
SELECT ODELJENJE#, AVG(PLATA) * 12 as Srednju_godišnja_plata
FROM RADNIK
WHERE POSAO NOT IN ('RUKOVODILAC', 'PREDSEDNIK')
GROUP BY ODELJENJE#
HAVING AVG(PLATA) * 12 > 1570000
ORDER BY AVG(PLATA) * 12 ;