Isbp Iii1234 87 19

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 24

INFORMACIONI SISTEMI I

BAZE PODATAKA
NASTAVNA TEMA: NASTAVNA JEDINICA:

Osnovni elementi
Sortiranje rezultata upita
upitnog jezika SQL
III/ III/ III/
1 2 3
REDNI BROJ ODELJENJE
ČASA: 87. :
III/
4

CILJ ČASA: TIP ČASA:


Upoznavanjem sa komandama za sortiranje
Obrada
rezultata
NASTAVNE METODE: NASTAVNA OBLIK RADA:
SREDSTVA:
Demonstrativni Računar, projektor Individualni

VREMENSKA ARTIKULACIJA
ČASA:
Uvodni deo: 10 min Glavni deo: 25 min Završni deo: 10 min
Nepregledni upiti

 Veoma često se događa da pri upitima koji prikazuju veliku količinu podataka ne
možemo naći ono što nam je potrebno.
 Pri prikazivanju rezultata, baze podataka koriste tehnologiju koja se naziva
indeksi.
 Indeksi su kolone (ili kolona) po kojoj se sortiraju podaci, kako u samoj bazi tako i
pri upitima.
 Po default-u, indeksi se dodeljuju kolonama primarnog ključa, i u nekim
slučajevima kolonama jedinstvenog ključa.
 Ukoliko ste primetili, rezultati svih dosadašnjih upita su prikazivani po unapred
definisanom redosledu, po koloni primarnog ključa, bez obzira da li smo mi tu
kolonu navodili u SELECT klauzuli ili ne.
Problem

 Želeli bi da prikažemo rezultate tako da su nam zaposleni prikazani od najstarije


ka najmlađoj osobi.
 Hoćemo da nam rezultati budu prikazani po gradovima, državama ili nekim
drugim kriterijumima.
 Potrebno je da zaposlene poređamo po imenu ili prezimenu, što je najčešći slučaj
sortiranja.
 Jednostavno, želimo da nam podaci budu prikazani onako kako nam odgovara, ili
kako zahtevaju sami poslovni zahtevi.
 Da bi videli indeksirane kolone unutar tabele, izvršite sledeću komandu:
SHOW INDEX FROM ime_tabele;
ORDER BY naredba

 ORDER BY klauzula nam omogućava da rezultate upita prilagođavamo sopstvenim


potrebama.
 ORDER BY klauzula se postavlja najčešće na kraju samog upita, posle WHERE
klauzule.
 Unutar klauzule za sortiranje se navode kolone po kojima se sortiranje rezultata
vrši, kao i način na koji želimo da one budu sortirane, u rastućem ili opadajućem
poretku.
 Sintaksa:
SELECT column_1,...., column_n
FROM table_name
WHERE condition
ORDER BY column_1 [ASC|DESC],….., column_n [ASC|DESC];
ORDER BY - analiza

 Unutar klauzule može se navesti jedna ili više kolona za sortiranje.


 Prioritet sortiranja ide sa leva na desno.
 Rezervisane reči ASC I DESC su skraćenice od ASCENDING (rastući poredak) i
DESCENDING (opadajući poredak).
 Po default-u, ukoliko ne navedemo ni jednu od ove dve rezervisane reči,
soritranje će se vršiti po rastućem nivou.
Primer 1

 Potrebno je prikazati zaposlene u Filadelfiji (Philadelphia) tako da su poređani od


najniže ka najvišoj plati. Potrebne kolone su id, fname, lname, salary.
 Rešenje:
SELECT id,fname,lname,salary
FROM employee
WHERE city='Philadelphia';

 Šta fali ovom upitu?


Primer 1 - rešenje

SELECT id,fname,lname,salary
FROM employee
WHERE city='Philadelphia'
ORDER BY salary ASC;

 Pokušajte sada da izvršite istu naredbu, ali bez navođenja ASC kriterijuma.
 Ukoliko bi želeli da dobijemo rešenje od najviše ka najnižoj vrednosti plate,
sintaksa bi bila identična, samo što bi u ORDER BY klauzulu morali da navedemo
DESC parametar (opadajući redosled):
SELECT id,fname,lname,salary
FROM employee
WHERE city='Philadelphia'
ORDER BY salary DESC;
Primer 2

 ORDEB BY klauzula može raditi sa svim tipovima podataka. Poređajmo sada sve
zaposlene iz Filadelfije po prezimenu (lname) po abecednom poretku.
 Rešenje:
SELECT id, fname, lname, salary
FROM employee
WHERE city='Philadelphia'
ORDER BY lname;
Korišćenje većeg broja kolona u ORDER BY
kaluzuli

 Ukoliko rezultate sortirate po kolonoma u kojoj postoji ponavljanje vrednosti, radi


bolje preglednosti rezultata, preporučljivo je koristiti barem još jednu kolonu za
soritranje.
 Pogledajmo podatke o zaposlenima čije je ime Bill, Art ili Justine.
SELECT * FROM employee
WHERE fname IN ('Bill’, 'Art',’Justine’);
Rešenje?

 Ukoliko bi ovaj upit sortirali samo po koloni fname, dobili bi sledeći rezultat:
SELECT * FROM employee
WHERE fname IN ('Bill’, 'Art',Justine’);
ORDER BY fname;

 Međutim, rezultati nam ne odgovaraju. Rezultati jesu sortirani po imenima, ali


problem nastaje kada imamo ponavljanje vrednosti.
Analiza i rešenje

 Ukoliko kolona pomoću koje sortiramo rezultate ima u više redova iste vrednosti,
DBMS sortiranje vrši pomoću indeksa (u ovom slučaju primarnog ključa).
 Podaci i dalje nisu u potpuno čitljivom obliku.
 Rešenje ove situacije jeste sortiranje po (barem) još jednoj koloni, kako bi prikaz
rezultata dobio određeni sklad.
 U ovom slučaju, najlogičnije je da se pored kolone fname u ORDER BY klauzulu
uvrsti i kolona lname. Pogledajmo rezultate:
SELECT * FROM employee
WHERE fname IN ('Bill’, 'Art',Justine’);
ORDER BY fname, lname;
Analiza

 Obratite pažnju na kolone fname i lname. DBMS prvo rezultate sortira po koloni
fname u rastućem poretku (A-Z), a ukoliko se dogodi da postoji više redova koji
imaju istu vrednost za kolonu fname, DBMS onda te redove sortira po koloni
lname, takođe u rastućem poretku (A-Z).
 Primer: Kada je DBMS došao do redova sa imenom Bill, umesto da ih sortira po
vrednosti primarnog ključa (kao u prošlom primeru), on ih sortira po vrednosti
kolone lname (prezimena), što ima više smisla.
 Kao rezultat dobijamo uređen skup podataka sortiranih tako da ih možemo
kasnije sa lakoćom koristiti.
Problem?

 Međutim, šta bi se desilo ukoliko bi više zaposlenih imalo isto i ime i prezime?
 Kako bi onda sortirali rezultate, i da li bi nam dve kolone bile dovoljne za korektno
sortiranje?
 Nepisano pravilo je da, u cilju bolje preglednosti podataka, ukoliko sortiranje
vršite po više kolona koje će u nekom slučaju sadržati identične rezultate, u
ORDER BY klauzuli navedete onoliko kolona sa koliko će obezbediti da po svim
kriterijumima sortiranja dobijete uređen skup rezultata.
 Primer: Ukoliko ste rezultate sortirali po imenu, prezimenu i gradu u kojem
zapsoleni rade, i imate situaciju u kojoj postoje dva radnika sa identičnim
vrednostima podataka iz tih kolona (npr. Michael Jordan – Chicago), onda je za
sortiranje potrebno dodati još jednu kolonu kojom će se obezbediti da se ta dva
reda ne sortiraju po indeksiranoj koloni (najčešće ključu). Na primer, u ORDER BY
klauzulu dodati i kolonu bdate(datum rođenja) ukoliko su im datumi rođenja
različiti.
Primer 2
 Sortirati sve zaposlene (id, ime, prezime, datum rodjenja, država) iz država
Minesota (MN) i Virdžinije (VA) od najmlađeg ka najstarijem, tako da se prvo
prikažu radnici iz Virdžinije a zatim iz Minesote.
 Rešenje:
Korišćenje rednog broja kolone umesto
imena kolone

 Postoji još brži i uprošćeniji način korišćenja ORDER BY klauzule.


 Umesto pisanja imena kolone, može se navesti njena redna pozicija na kojoj se nalazi
u okviru SELECT klauzule.
 Na primer, prethodna naredba mogla se napisati u obliku:
SELECT id, fname, lname, bdate, state
FROM employee
/*Kolona state ima redni broj 5
WHERE state in ('MN','VA')
u okviru SELECT klauzule, a
ORDER BY 5 DESC, 4 DESC;
kolona bdate redni broj 4*/
 Zadate kolone u ORDER BY klauzuli se moraju nalaziti i u okviru SELECT klauzule kako
bi se mogao iskoristiti njihov redni broj.
 Takođe, navođenjem svih kolona korišćenjem argumenta * možemo koristiti redne
brojeve kolona unutar tabele, ali moramo znati i njihovu rednu poziciju:
SELECT *
FROM employee
WHERE state in ('MN','VA')
ORDER BY 7 DESC, 4 DESC;
Pronalaženje najvećih i najmanjih rezultata
korišćenjem ORDER BY klauzule

 Problem: Potreno nam je da nađemo SAMO pet najstarijih osoba iz države


Kalifornija (CA). Ukupan broj radnika iz te države je 52.
 Rešenje:
SELECT id, fname, lname, bdate, state
FROM employee
WHERE state='CA’
ORDER BY 4
LIMIT 5;

 LIMIT klauzula može biti veoma korisna u kombinaciji sa ORDER BY klauzulom.


 Pomoću nje možemo nalaziti, između ostalog, najveće i najniže vrednosti svih
tipova podataka.
Sortiranje NULL vrednosti

 Ukoliko sortirate po koloni koja sadrži NULL vrednosti, kako je podrazumevan


način sortiranja u rastućem poretku, prve vrednosti na ispisu rezultata biće
upravo NULL vrednosti.
 Najčešće takve vrednosti nam ne trebaju, pa postoje dva načina za rešavanje
ovog problema.
 Prvi način jeste sortiranje po opadajućem redosledu, korišćenjem DESC
rezervisane reči, tako da nam NULL vrednosti budu na kraju ispisa upita;
 Međutim, šta ukoliko nam trebaju rezultati sortirani baš po koloni koja sadrži
NULL vrednosti, i to u rastućem poretku? U tom slučaju nam je neophodno da se
„otarasimo“ tih NULL vrednosti.
Sortiranje NULL vrednosti - primer

 Sortirajmo, na primer, rezultate po koloni bonus u opadajućem poretku, svih


zaposlenih u Nju Jorku.
 Rešenje:
SELECT id, fname, lname, city, bonus
FROM employee
WHERE city='New York’
ORDER BY bonus DESC;
Sortiranje NULL vrednosti - problem

 Problem nastaje ukoliko nam je sortiranje potrebno po rastućem poretku svih


zaposlenih koji imaju bonus na platu. U tom slučaju zaposleni koji nema bonus
nam nisu potrebni u rezultatu.
 Ukoliko sortiramo rezultate po rastućem poretku kolone bonus, dobijamo:
SELECT id,fname,lname,city,bonus
P
FROM employee R
WHERE city='New York’ O
ORDER BY bonus ASC; B
L
E
M
Rešenje

 Rešenje je krajnje jednostavno. Iskoristićemo WHERE klauzulu u kojoj ćemo


izostaviti rezultate koji sadrže NULL vrednosti.
 Rešenje:
SELECT id,fname,lname,city,bonus
FROM employee
WHERE city='New York’ AND bonus IS NOT NULL
ORDER BY bonus ASC;
ORDER BY FIELD

 Korišćenjem ključne reči FIELD unutar ORDER BY klauzule omogućeno je da se podaci


sortiraju na osnovu vrednosti u jednoj koloni.
 Primer:
SELECT orderNumber, status
FROM orders
ORDER BY FIELD(status,
'In Process',
'On Hold',
'Cancelled',
'Resolved',
'Disputed',
'Shipped');
 Sortiranje se vrši pomoću vrednosti u koloni status. Navode se vrednosti kolone po
kojima se vrši sortiranje, kao i njihov redosled sortiranja, počevši od prvog ka
poslednjem.
 U prethodnom slučaju, prvo će biti prikazane narudžbine sa statusom In Process, a
zatim On Hold, dok će poslednje prikazane narudžbine biti one sa statusom Shipped.
Domaći
 Potrebno je prikazati podatke od zaposlenima (id, fname, lname, city, salary) iz
Čikaga (Chicago), Majamija (Miami) i Baltimora (Baltimore) koji su među petnaest
zaposlenih koji imaju najveću platu, tako da plata bude od najviše na najnižoj.
 Rešenje:
Predmetni profesor Elizabeta Momčilović

You might also like