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 ;

 

 

 

Dodaj komentar Sviđa mi se - (1) Ne sviđa mi se - (1)    

  • SQL – null vrenosti, ORDER BY klauzula, izrazi i agregatne funkcije 1
  • SQL – null vrenosti, ORDER BY klauzula, izrazi i agregatne funkcije 2