SELECT
Naredba SELECT je najčešće korišćena naredba u SQL-u. Ona omogućava
korisnicima baze podataka da pronađu određenu informaciju koju žele iz
operativne baze podataka. Pogledajte nekoliko primera.
Naredba koja je dole prikazana pronalazi sve informacije
koje su sadržane u tabeli ucenici. Obratite pažnju na to da se
zvezdica u SQL-u koristi kao džoker karta. Naredba doslovno znači
„Odaberi sve iz tabele ucenici.“
SELECT *
FROM ucenici;
S
druge strane, korisnici bi možda želeli da ograniče atribute koji se
pretražuju iz baze podataka. Na primer, za osiguranje se traži popis
prezimena svih učenika. Sledeća naredba u SQL-u prikazaće
samo tu informaciju:
SELECT prezime
FROM ucenici;
Klauzula
WHERE može se koristiti da bi se ograničili zapisi koji se traže samo
na one koji zadovoljavaju određene uslove. Direktor bi možda želeo da
pregleda dosijee svih učenika koji imaju visok prosek. Sledeća
naredba prikazuje sve podatke koji se nalaze u tabeli ucenici za
zapise koji imaju prosek veći od 4.7:
SELECT *
FROM ucenici
WHERE prosek > 4.7;
Znači:
Pretraživanje i pribavljanje podataka su najĉešće operacije koje korisnici izvršavaju u relacionoj bazi podataka. Za pretraživanje i pribavljanje podataka u SQL-u koristi se naredba SELECT.
Naredba SELECT pribavlja podatke iz jedne tabele ili više povezanih tabela koje se nalaze u relacionoj bazi podataka. U svom osnovnom obliku naredba SELECT ne može ni na koji naĉin da izmeni podatke koji se nalaze u relacionoj bazi podataka.
Naredba SELECT je jedna od najkompleksnijih naredbi SQL programskog jezika. Ukljuĉuje veći broj kljuĉnih reĉi klauzula:
SELECT - definiše listu kolona koje će biti ukljuĉene u rezultujuću tabelu
FROM - definiše tabele iz kojih se pribavljaju podaci za potrebe generisanja rezultujuće tabele. Klauzula FROM može da ukljuĉi jednu ili više opcionih JOIN klauzula za povezivanje tabela na osnovu kriterijuma zadatih od strane korisnika.
WHERE - definiše predikat na osnovu koga se ograniĉava broj vrsta u rezultujućoj tabeli. Ova klauzula iz rezultata eliminiše sve vrste za koje specificirani predikat ne vraća vrednost TRUE.
GROUP BY - grupiše vrste koje u određenim kolonama imaju identiĉne vrednosti.
HAVING - definiše predikat na osnovu koga se elimišu vrste nakon što je klauzula GROUP BY primenjena na rezultujuću tabelu.
ORDER BY - koristi se za sortiranje rezultujuće tabele. Korisnici specificiraju kolone po kojima se vrši sortiranje kao i smer sortiranja.
Klauzule SELECT i FROM
Klauzule SELECT i FROM su jedine obavezne u okviru SELECT naredbe. Klauzula FROM specificira tabele iz kojih se pribavljaju podaci. Ukoliko se navede više tabela potrebno je specificirati naĉin spajanja tabela. Spajanje tabela će biti detaljno objašnjeno u nekoj od narednih lekcija.
Za sada ćemo se ograniĉiti samo na pribavljanje podataka iz jedne tabele.
Klauzula SELECT specificira kolone koje treba ukljuĉiti u rezultujuću tabelu. Mogu se koristiti sledeće opcije:
ALL - u rezultujućoj tabeli prikazuju se sve vrste koje zadovoljavaju navedeni predikat
DISTINCT - iz rezultujuće tabele izbacuju se duplikati vrsta
* - rezultujuća tabela ukljuĉuje sve kolone tabele ili tabela iz kojih se pribavljaju podaci
tabela.* - rezultujuća tabela uključuje sve kolone specificirane tabele
izraz - ime kolone ili funkcije nad kolonama koja će biti ukljuĉena u rezultujuću tabelu
AS pseudonim - novo ime kolone ili funkcije nad kolonama koje im se dodeljuje u rezultujućoj tabeli
U nastavku je dat SQL upit koji prikazuje kompletan sadržaj tabele ucenici
SELECT * FROM ucenici;
Rezultat bi bio isti ako bismo napisali upit kod koga su umesto * navedemo imena svih kolona u tabeli.
Ukoliko želimo da prikažemo samo određene kolone iz tabele ucenici posle SELECT klauzule navešćemo imena kolona koje su od interesa. U nastavku je dat SQL upit koji prikazuje samo imena i prezimena učenika.
SELECT ime, prezime FROM ucenici;
Redosled kojim su kolone navedene u klauzuli SELECT definiše redosled kolona u rezultujućoj tabeli. U nastavku je dat SQL upit koji prikazuje imena i prezimena svih učenika, ali u drugaĉijem redosledu.
SELECT prezime, ime FROM ucenici;
Klauzula WHERE
Klauzula WHERE specificira uslov na osnovu koga se kreira rezultujuća tabela. U rezultujuću tabelu će biti ukljuĉene samo one vrste koje zadovoljavaju specificirani uslov. U uslovu se mogu javiti:
1.Relacioni operatori
2.Logiĉki operatori
3.Operator BETWEEN
4.Operator IN
5.Operator LIKE
6.Operator IS NULL
SQL podržava šest relacionih operatora koji imaju sledeće znaĉenje:
1.= Jednako
2.<> Nije jednako (razliĉito)
3.< Manje od
4.> Veće od
5.<= Manje ili jednako od
6.>= Veće ili jednako od
Primer: U ovom primeru dat je SQL upit koji prikazuje podatke o učenicima koji se prezivaju Petrović.
SELECT * FROM ucenici WHERE prezime = "Petrović";
Primer: Sledeći upit treba da prikaže imena i prezimena učenika koji imaju prosek veći od 4.5:
SELECT ime, prezime
FROM ucenici
WHERE prosek > 4.5;
Logički operatori:
SQL omogućava korišćenje standardnih logičkih operatora AND, OR, NOT, a sem toga i IN, BETWEEN koji omogućavaju jednostavnije korišćenje prethodno navedenih operatora u nekim slučajevima.
Prioritet logičkih operatora je sledeći:
- NOT
- AND
- OR
Logički poeratori AND i OR se koriste na standardan način. međutim, kod SQL-a, logički operator negacije NOT se navodi na početku logičkog izraza, a ne ispred operatora poređenja. Na primer, NOT A=B može da stoji nakon reči WHERE kao uslov, alI A NOT = B NE MOŽE!
Primer: Ako želimo da prikažemo podatke o učenicima koji se prezivaju Petrović i čiji je prosek veći od 4, možemo koristiti SQL upit koji je dat u nastavku:
SELECT *
FROM ucenici
WHERE prezime="Petrović" AND prosek > 4 ;
Primer: Sledeći primer je SQL upit koji daje sve učenika koji se prezivaju Petrović i čiji prosek nije veći od 4:
SELECT *
FROM ucenici
WHERE prezime="Petrović" AND NOT prosek > 4 ;
Primer: SQL upit koji prikazuje podatke o učenicima koji se prezivaju Petrović ili Jovanović:
SELECT *
FROM ucenici
WHERE prezime="Petrović" OR prezime = "Jovanović" ;
Operator IN
Operator IN zamenjuje višestruku upotrebu operatora OR i =. Operator NOT IN prikazuje sve vrste osim onih određenih datom listom.
Primer: U sledećem SQL upitu se korišćenjem operatora IN izdvajaju samo učenici koji se prezivaju Petrović ili Jovanović:
SELECT *Primer: Naredni upit pribavlja podatke o svim učenicima osim onih koji se prezivaju Petrović ili Jovanović:
FROM ucenici
WHERE prezime IN ("Petrović", "Jovanović" );
SELECT *
FROM ucenici
WHERE prezime NOT IN ("Petrović", "Jovanović" );
Operator BETWEEN
Operator BETWEEN zamenjuje višestruku upotrebu operatora AND i =. Ovaj operator omogućava ispitivanje da li je vrednost nekog atributa/kolone u zadatom opsegu.
Primer: Za prikazivanje podataka o učenicima čiji je prosek u opsegu od 1.5 do 5.0 (uključujući i granice opsega) možemo da koristimo operator BETWEEN:
SELECT *
FROM ucenici
WHERE prosek BETWEEN 1.5 AND 5.0 ;
Operator LIKE
Operator LIKE omogućava poređenje vrednosti kolone sa zadatim šablonom. Kod definisanja šablona koristi se procenat (%) i znak pitanja. Procenat (%) predstavlja bilo koji mogući znak (broj, slovo, interpunkcijski znak) ili skup znakova. Znak pitanja (?) zamenjuje samo jedan znak.
Primer: U sledećem upitu traži se spisak svih učenika čije prezime počinje na slovo P:
SELECT *Za nalaženje svih učenika koji sadrže slovo "P" negde u prezimenu,
FROM ucenici
WHERE prezime LIKE 'P%' ;
Operator NOT LIKE prikazuje suprotno - sve vrste koje ne odgovaraju datom opisu koji sledi nakon toga.
PAŽNJA: U zavisnosti od servera koji se koristi, koriste se različiti znakovi za zamenu : SQL Server koristi % za zamenu više znakova i _ za zamenu jednog znaka, dok MS Access umesto % koristi *, a umesto _ koristi ?
Operator IS NULL
Operator IS NULL se koristi za poređanja sa NULL vrednostima. Treba voditi računa da se na NULL vrednosti ne može primeniti ni jedan relacioni operator. Može se samo proveravati da li kolona ima NULL vrednost ili nema.
Primer: U nastavku je dat SQL upit koji izdvaja podatke o svim učenicima kojima nije unet datum rođenja, odnosno datum rođenja ima NULL vrednost:
SELECT *
FROM ucenici
WHERE datumRodj IS NULL ;
Klauzula ORDER BY
Klauzula ORDER BY specificira redosled prikazivanja vrste rezultujuće tabele, sortiranjem po vrednostima nekih kolona u rastući (ASC) (predefinisana vrednost) ili opadajući redosled (DESC). Ukoliko klauzula ORDER BY nije navedena, vrste u rezultujućoj tabeli su poređane po slučajnom principu i ne postoji nikakva garancija da će isti upit uvek generisati rezultujuću tabelu čije su vrste poređane na isti način.
U nastavku je dat SQL upit koji prikazuje podatke o učenicima i sortira ih prema prezimenu
Primer: - u rastućem redosledu:
SELECT *Obratite pažnju da ukoliko vrste sortirate u rastućem redosledu, nije potrebno eksplicitno navesti smer sortiranja. Rastući redosled je podrazumevan u ORDER BY klauzuli.
FROM ucenici
ORDER BY prezime ;
Primer: -u opadajućem redosledu:
SELECT *
FROM ucenici
ORDER BY prezime DESC;
Sortiranje je moguće vršiti na osnovu vrednosti više kolona.
Primer: SQL upit u nastavku sortira podatke o učenicima prema prezimenu u opadajučem redosledu, a prema imenu u rastućem redosledu:
SELECT *
FROM ucenici
ORDER BY prezime DESC, ime ASC ;
Aritmetičke funkcije
SQL dozvoljava korišćenje matematičkih funkcija u SELECT i WHERE klauzulama. Na taj način se kao rezultat pretraživanja mogu prikazati rezultati izračunavanja nekog matematičkog izraza.
Primer: U nastavku je dat SQL upit koji prikazuje imena i prezimena učenika kao i njihov prosek uvećan za 0.5 kao bonus
SELECT ime, prezime, prosek + 0.5 AS prosek_sa_bonusomObratite pažnju da je rezultatu matematičke funkcije (prosek+0.5) dodeljeno ime korišćenjem sintakse za pseudonim: AS prosek_sa_bonusom. Taj pseudonim će stajati na vrhu kolone u kojoj se nalazi, u našem slučaju, taj prosek sa bonusom.
FROM ucenici ;
Aritmetičke funkcije se mogu primenjivati i u WHERE klauzuli:
Primer:
SELECT ime, prezime, prosek + 0.5 AS prosek_sa_bonusom
FROM ucenici
WHERE prosek + 0.5 < 5.0 ;
Funkcije agregacije
Funkcije agregacije su dobile naziv po tome što vrše agregaciju rezultata upita. Korišćenje ovih funkcija je jednostavno, pošto se navode u listi kolona SELECT klauzule koje se prikazuju. Značenje funkcija je sledeće:
- AVG(kolona) - izračunava srednju vrednost datog atributa
- SUM(kolona) - izračunava sumu svih vrednosti atributa
- MIN(kolona) - nalazi minimalnu vrednost atributa
- MAX(kolona) - nalazi najveću vrednost atributa
- COUNT(*) - nalazi broj vrsta u tabeli (grupi)
- COUNT(kolona) - nalazi broj vrsta sa NE NULL vrednostima kolone
- COUNT(DISTINCT kolona) - nalazi broj vrsta sa različitim vrednostima zadate kolone
Primer: Funkcija COUNT određuje broj vrsta u rezultujućoj tabeli:
SELECT COUNT(*) AS imePrimer: Sledeći SQL upit određuje maksimalni, minimalni i prosečni prosek svih učenika:
FROM ucenici ;
SELECT MAX(prosek) AS max_prosek, MIN(prosek) AS min_prosek,
AVG(prosek) AS prosecan_prosek
FROM ucenici ;
PAŽNJA:
Posebno je bitno zapamtiti da funkcije agregacije NIJE MOGUĆE koristiti u WHERE klauzuli. To je posledica činjenice da se rezultat funkcija agregacija izračunava nakon šo se odrede vrste koje uaze u sastav rezultujuće tabele, odnosno nakon obrade uslova koji je zadat u WHERE klauzuli.
U nastavku je dat SQL upit koji se NE MOŽE IZVRŠITI i koji će GENERISATI GREŠKU:
SELECT ime, prezime, prosekPravilna SQL naredba bi bila:
FROM ucenici
WHERE prosek > AVG(prosek);
SELECT ime, prezime, prosek
FROM ucenici
WHERE prosek > (SELECT AVG(prosek) FROM ucenici);
Pitanja za samostalan rad
SQL upiti:
Pokušajte da rešite niz zadataka koji je dat u nastavku. Za rešavanje koristite bazu podataka koju ćete napraviti sami, kao što smo pravili na časovima vežbi :
Vaša baza ima zadato ime, u bazi napravite samo jednu tabelu: ucenici, u kojoj su kolone rbr, ime, prezime, prosek, datumRodj, ulica, grad, email, ... pomoću INSERT klauzule popunite tabelu sa 10-tak redova u kojima se imaju različite vrednosti.
- Napisati SQL upit koji prikazuje kompletan sadržaj tabele ucenici
- Napisati SQL upit koji prikazuje imena svih učenika koji su sa prosekom manjim od 1.5
- Modifikovati prethodni upit tako da se podaci sortiraju u opadajućem redosledu po gradovima iz kojih su
- Napisati SQL upit koji prikazuje imena svih učenika iz Kule
- Napisati SQL upit koji prikazuje imena svih učenika iz Kule i čije prezime počinja na P
- Napisati SQL upit koji prikazuje imena svih učenika iz Kule sa prosekom većim od 4.5
- Napisati SQL upit koji prikazuje prosečnu ocenu svih učenika koji nisu iz Kule
- Napisati SQL upit koji prikazuje imena svih učenika koji bilo gde u imenu imaju slovo K.