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...

sql-select-where-sr
Svi elementi sajta Web'n'Study, osim onih za koje je navedeno da su u javnom vlasništvu, vlasništvo su autora i ne smeju se koristiti, u celosti ili delimično bez pismenog odobrenja autora. To uključuje tekstove, slike, ilustracije, animacije, prateći grafički materijal i programski kod.
Ovaj sajt koristi tehnologiju kolačića (cookies). Detaljnije o tome možete pročitati u tekstu o našoj politici privatnosti.