SQL filtriranje podataka (WHERE)
Ako želimo da prikažemo samo podatke koji zadovoljavaju određene kriterijume, odnosno da ih filtriramo, koristićemo proveru vrednosti podataka - tj. ispitivaćemo da li podaci zadovoljavaju određene uslove. Evo "brzog" pregleda, kakve uslove ćemo ispitivati u ovoj lekciji:
Relacioni operatori | |
---|---|
x = y | da li je x jednako y |
x <> y | da li je x različito od y |
x < y | da li je x manje od y |
x > y | da li je x veće od y |
x <= y | da li je x manje ili jednako y |
x >= y | da li je x veće ili jednako y |
Tekstualni šablon | |
x LIKE šablon | ako se vrednost x uklapa u zadati šablon |
x NOT LIKE šablon | ako se vrednost x ne uklapa u zadati šablon |
Interval i lista | |
x BETWEEN y1 AND y2 | ako je vrednost x između y1 i y2 |
x NOT BETWEEN y1 AND y2 | ako vrednost x nije između y1 i y2 |
x IN lista | ako je vrednost x jednaka jednoj od vrednosti iz liste |
x NOT IN lista | ako vrednost x nije jednaka ni jednoj vrednosti iz liste |
Provera NULL vrednosti | |
x IS NULL | ako je vrednost x NULL |
x IS NOT NULL | ako vrednost x nije NULL |
Kompleksni uslovi | |
u1 AND u2 | ako su oba uslova zadovoljena |
u1 OR u2 | ako je makar jedan uslov zadovoljen |
NOT u | ako uslov nije zadovoljen |
Da bismo primenili uslov, koristićemo klauzulu WHERE. Posle ove odrednice zadajemo uslov koji se odnosi na svaki red podataka. Biće prikazani samo oni redovi koji zadovoljavaju taj uslov. Evo gde se u SELECT upitu "po redosledu" nalazi klauzula WHERE:
SELECT lista izraza
FROM...
WHERE uslov
GROUP BY... HAVING...
ORDER BY...
LIMIT...
Najjednostavniji uslovi su prosta upoređivanja koja dobijamo korišćenjem relacionih operatora.
Možemo upoređivati brojeve, ali i tekst ("manji" tekst je onaj koji je ispred po abecednom redosledu), kao i datume.
Prikaz naslova knjiga i broja stranica, ali samo za one knjige za koje važi da je broj strana manji od 300.
SELECT naslov, stranice
FROM knjige
WHERE stranice<300
Prikaz studenata koji se zovu 'Dejan'.
SELECT ime, prezime
FROM studenti
WHERE ime = 'Dejan';
Tekstualni šabloni - operator LIKE
SQL jezik omogućava i upoređivanje teksta sa nekim šablonom. Neki sistemi omogućavaju samo najosnovnije šablone koji uključuju svega par mogućih džoker znakova, dok neki imaju podršku za prave regularne izraze. Ono što sigurno funkcioniše u svakom SQL sistemu je operator LIKE, kojim proveravamo da li se neka tekstualna vrednost uklapa u određeni šablon.
Postoji i njemu suprotan, NOT LIKE operator, kojim biramo one tekstualne vrednosti koje se ne uklapaju u zadati šablon.
vrednost LIKE šablon
vrednost NOT LIKE šablon
Šablon koji možemo zadati je veoma jednostavan - formira se uz pomoć svega par mogućih džoker znakova. Ovi znakovi zamenjuju znakove teksta.
_ | tačno jedan bilo koji znak |
% | bilo koji broj bilo kojih znakova (čak i nula znakova) |
Po defaultu, provera nije zavisna od velikih i malih slova, što znači da se podrazumeva da su "A" i "a" isti znak.
Prikaz imena i prezimena studenata, ali samo za one čije ime ima tri znaka i počinje i završava se slovom "a". Dakle, kao rezultat će biti prikazani studenti koji se zovu "Ana" ili "Aca".
SELECT ime, prezime
FROM studenti
WHERE ime LIKE 'a_a'
Prikaz imena i prezimena studenata, ali samo za one čije ime počinje i završava se slovom "a", sa bilo kojim brojem znakova između. Rezultat će biti studenti koji se zovu "Ana", "Aca", ali i "Alisa" ili "Anastasija".
SELECT ime, prezime
FROM studenti
WHERE ime LIKE 'a%a'
Vrednosti u intervalu - operator BETWEEN...AND
SQL omogućava i proveru da li je neka vrednost između druge dve, pomoću operatora BETWEEN...AND. Ovim operatorom zadajemo dve granične vrednosti i proveravamo da li se željena vrednost nalazi između njih. Postoji i NOT BETWEEN operator kojim se proverava da li je vrednost van zadatog intervala.
vrednost BETWEEN donja_granica AND gornja_granica
vrednost NOT BETWEEN donja_granica AND gornja_granica
Uslov će zadovoljiti sve vrednosti koje spadaju između donje i gornje granice, uključujući i granične vrednosti. Inače, donja granica mora biti manja ili jednaka gornjoj. Korišćenje operatora BETWEEN je ekvivalentno sledećem poređenju:
(vrednost >= donja_granica) AND (vrednost <= gornja_granica)
Operator NOT BETWEEN se može zameniti sledećim uslovom:
(vrednost < donja_granica) OR (vrednost > gornja_granica)
ili
NOT ((vrednost >= donja_granica) AND (vrednost <= gornja_granica))
Prikaz naslova knjiga koje imaju od 360 do 390 strana.
SELECT naslov, stranice FROM knjige
WHERE stranice BETWEEN 360 AND 390
Vrednost iz liste - operator IN (...)
Postoje situacije kada želimo da proverimo da li se tražena vrednost nalazi među više mogućih vrednosti. Operator IN (...) omogućava da zadamo listu vrednosti odvojenih zarezima i proverimo da li je određena vrednost jednaka nekoj od njih. Kao i do sada, moguće je proveriti da li tražena vrednost nije među vrednostima iz liste, korišćenjem operatora NOT IN (...)
vrednost IN ( vrednost_1, vrednost_2, ...)
vrednost NOT IN ( vrednost_1, vrednost_2, ...)
Vrednosti iz liste ne moraju biti zadate po bilo kakvom redosledu. I ovaj operator je moguće zameniti kompleksnim logičkim izrazom:
(vrednost = vrednost_1) OR (vrednost = vrednost_2) OR ...
Zagrade nisu obavezne, pošto relacioni operatori imaju prednost nad logičkim, ali smo ih ubacili da bi izraz bio pregledniji.
Prikaz knjiga čija je godina prvog izdanja 1975, 1977 ili 1982.
SELECT naslov, god_prvo
FROM knjige
WHERE god_prvo IN (1975, 1977, 1982);
Provera nedefinisanosti - IS NULL
Mnogo češće nego što to želimo, dešavaće se da neka polja u tabeli ostanu nepopunjena. To je moguće sa poljima koja nisu, odnosno ne učestvuju u primarnom ključu ili sa poljima za koja nije naglašeno da ne smeju imati NULL vrednost. NULL je poseban tip vrednosti, kojim se opisuje da je vrednost nekog polja nedefinisana. Dakle, NULL je ono polje koje nema nikakvu vrednost. Čak i numerička vrednost 0, kao i prazan tekst '' su "nešto", dok NULL označava kada u polje baš ništa nije uneto.
Ova situacija je takođe moguća i kada povezujemo dve tabele, kada se desi da podatku iz jedne tabele ne odgovara ni jedan podatak iz druge tabele.
Da li je neka vrednost jednaka NULL, na žalost nije moguće testirati običnim relacionim operatorima. Dakle ova upoređivanja nam neće dati rezultat koji očekujemo:
vrednost = NULL // nije TRUE čak i kada vrednost jeste NULL
NULL <> NULL // uvek je TRUE - čak ni NULL nije jednako NULL
Zbog toga u SQL-u postoji i posebna mogućnost provere da li je neka vrednost nedefinisana - IS NULL za proveravanje da li je neka vrednost NULL, tj. "da li ne postoji". Takođe, postoji i IS NOT NULL - za proveru da li neko polje ima vrednost.
vrednost IS NULL
vrednost IS NOT NULL
Prikaz studenata koji nemaju unetu e-mail adresu.
SELECT ime, prezime, email
FROM studenti
WHERE email IS NULL;
Prikaz studenata koji se zovu 'Dejan'.
SELECT ime, prezime
FROM studenti
WHERE ime IS 'Dejan';
Kompleksni uslovi - logički operatori
Gotovo nikad nećemo biti u situaciji da uslov kojim želimo da odredimo koji podaci će biti prikazani, bude samo jedan prost uslov. U stvari, vrlo verovatno ćemo unutar WHERE klauzule morati da kreiramo kompleksan uslov koji dobijamo povezivanjem više prostih uslova. Ovo povezivanje se vrši korišćenjem logičkih operatora. AND i OR. Na uslove je moguće primeniti i negaciju NOT.
Operator AND, kao i u programiranju, služi da kreiramo kompleksan uslov povezivanjem dva "poduslova", tako da će taj složeni uslov biti zadovoljen samo ako su oba poduslova zadovoljena.
uslov1 AND uslov2
Ovo se bukvalno prevodi kao "ako je istovremeno istinit i USLOV 1 i USLOV 2..."
Dva uslova možemo povezati i operatorom OR, pri čemu dobijamo kompleksan uslov koji je zadovoljen ako je makar jedan od ta dva uslova zadovoljen.
uslov1 OR uslov2
Znači ovo bismo preveli kao "bilo da je istinit USLOV 1 ili da je istinit USLOV 2"
Ponekad je potrebno sastaviti uslov koji je negacija već postojećeg uslova. Pokušaj da "obrnemo" uslov, posebno ako je on složen, često vodi u grešku. Razmislite o sledećem - šta je obrnuto od uslova da vrednost X treba da bude istovremeno veća od 50 i manja od 90?
x > 50 AND x < 90 // Kako "obrnuti" ovaj uslov?
Ako mislite da je odgovor prosto...
x < 50 AND x > 90 // POGREŠNO!
...prevarili ste se - X nikada ne može biti istovremeno i manje od 50 i veće od 90. Ispravan "obrnuti" uslov bi bio:
x <= 50 OR x >= 90 // Ovo je tačan odgovor
Verovatno se niste setili ni da obrnuto od < (manje) nije zaista > (veće), već >= (veće ili jednako) - ako jeste, svaka čast. A ovaj uslov još i nije bio komplikovan! Zbog toga, da ne bismo mnogo mozgali, možemo primeniti operator NOT i na taj način efikasno dobiti obrnuti uslov:
NOT (x > 50 AND x < 90) // Obrnut uslov na lak način.
Prikaz knjiga koje je izdala Laguna posle 2006. godine.
SELECT naslov, pisac, god_sr, izdavac
FROM knjige
WHERE god_sr>2006 AND izdavac='Laguna';
Prikaz horor (HOR) i naučno-fantastičnih (SF) knjiga koje nije izdao Alnari.
SELECT naslov, pisac, zanr, izdavac
FROM knjige
WHERE (zanr='HOR' OR zanr='SF') AND izdavac<>'Alnari';
Ostaje samo još da vidite kako funkcionišu svi ovde navedeni primeri. Slobodno eksperimentišite...