Školsku bazu za vežbanje možete preuzeti ovde (180KB)
Kao prvo moramo se upotznati sa nekoliko komandi koje ćemo koristiti za kreiranje sql upita.
SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY.
Za početak ovo je sasvim dovoljno.
SELECT
To je naredba "lista atributa 1" ili naredba u kojoj se upisuju atributi odvojeni zarezom.
Atributi služe za opisivanje entiteta ili lakše rečeno za opisivanje tabele.
Atributi su u našem slucaju za tabelu radnik: IDBR, IME, POSAO, KVALIF, RUKOVODILAC, DATZAP, PREMIJA, PLATA BROD.
Dakle, u SELECT se zarezima odvajaju recimo IME, POSAO i PLATA
FROM (lista tabela)
Služi da se definise iz koje tabele se traži neki atribut iz SELECT naredbe
Dakle ovde se unose tabele koje će se koristiti, kao i definisanje skraćenica o kojima ćemo nešto kasnije pričati.
Ukoliko se izostavi FROM i naziv tabele, sistem će odgovoriti "Enter parameter value" što će značiti da sistem ne nalazi taj atribut.
SAVET: Ukoliko napišete upit i sistem odgovara sa ovakvom porukom najverovatnije je greska u nazivu atributa ili tabele.
Ako smo i to shvatili možemo da pređemo na prvi i najlakši upit a to je
1. Izlistati sve atribute u tabeli radnik
SELECT *
FROM RADNIK
Ovim upitom dobijamo gotovo sve podatke i sve atribute iz pomenute tabele.
Zvezda (*) se koristi da olaksa rad. U ovom slucaju znači da se izlistaju svi atributi (naznačeno u SELECT) iz tabele radnik (naznačeno u FROM), ali se ovaj upit mogao uraditi i na teži način kao sto je ručno pisanje svih atributa odvojeni zarezom.
2. Izlistati sva zanimanja u preduzecu
SELECT POSAO
FROM RADNIK
Ovim upitom dobijamo samo atribut POSAO i sve podatke. Kao što se može primetiti postoje više osoba sa istim zanimanjem, te je u ovom slucaju odgovor sistema sa više identicnih zanimanja. Ako ne želimo ovu pojavu, i ako želimo da nam sistem izbaci samo zanimanja koja postoje bez obzira na brojnost tog zanimanja onda treba izmedju SELECT i ATRIBUTA ubaciti komandu DISTINCT i to BEZ ZAREZA! Komanda DISTINCT sluzi za eliminisanje svih višestrukih n-torki (identičnih redova)
WHERE
Služi za neki vide selekcije i sankcija (uslova), kao i za spajanje više tabela. Ovde treba odmah napomenuti da se spajanje više tabela i ubacivanje uslova razdvaja ne zarezom kao kod SELECT komande već se koristi AND, ili OR ako se trazi samo neki od ponudjenih uslova.
Izdvajanje redova koji zadovoljavaju uslov
Izdvajanje redova koji zadovoljavaju vise uslova (AND)
Izdvajanje redova koji zadovoljavaju neki od uslova (OR)
Izdvajanje redova koji zadovoljavaju složene uslove (AND I OR)
Izdvajanje redova koja ne zadovoljavaju neke uslove (NOT, IS NOT, <>(RAZLIČIT))
Izdvajanje redova čija vrednost pripada nekoj listi vrednosti (IN)
Izdvajanje redova čija vrednost unutar nekih granica (BETWEEN, >=, <=)
3. Izlistati imena i posao svih zaposlenih sa kvalifikacijom VSS
SELECT IME, POSAO
FROM RADNIK
WHERE KVALIF='VSS'
NAPOMENA: Ovo je za access, u drugim verzijama sql-a umesto * se koristi %, a umesto ? se koristi _.
Novina je WHERE KVALIF='VSS' i ona govori sistemu da u odgovoru izlisata samo one redove koji u sebi kao podatak za atribut ima VSS.
To je 9 redova, koji ce imati za atribute IME i POSAO i podatke samo od onih zapolenih koji imaju podatak VSS za atribut KVALIF.
3.1 Izlistati imena koja počinju na slovo S
SELECT IME
FROM RADNIK
WHERE IME LIKE "S*"
U WHERE se sada nalazi i uslov da ime počinje sa odredjenim slovom. Naredba za tako nesto se zove LIKE “ŠTA SADRŽI" , a ako nešto ne treba da sadrži koristi se NOT LIKE "ŠTA NE SADRŽI"
Nešto se završava na slovo A. NEŠTO LIKE "*a"
Nešto se ne završava na slovo A. NEŠTO NOT LIKE "*a"
Nešto ima četvrto slovo A NEŠTO LIKE "???a"
Nešto sadrži slovo A NEŠTO LIKE "*a*"
Nešto ne sadrži slovo A NEŠTO NOT LIKE"“*a*"
Nešto je dužine 4 slova NEŠTO LIKE "????"
Nešto nije dužine 4 slova NEŠTO NOT LIKE "????"
GROUP BY (lista atributa 2)
Služi za grupisanje. Zapisuje se u SELECT komandi
4. Mesečne plate za svako odeljenje (brod)
SELECT BROD, SUM(PLATA) as [ukupne plate]
FROM RADNIK
GROUP BY BROD
Rezultat su 4 reda, sa atributom brod i ukupne plate. AS [UKUPNE PLATE] govori sistemu da u odgovoru taj atribut nazove tim imenom. Dakle ovo nije neophodno. Ukoliko se piše samo jedna rec dovoljno je AS REC, a ako se naziv sastoji od više reci onda se stavlja u velike zagrade [] .
HAVING (lista uslova2)
Služi za dodatno uslovljavanje, skoro uvek se piše zajedno sa COUNT naredbom.
Count(atribut) znači da prebroji taj atribut, i odgovor je uvek neki broj.
NAPOMENA
Ako se koristi neki atribut i agregatna funkcija (avg(prosek), sum(suma), max(maksimum), min(minimum)....) onda se podaci moraju grupisati tako sto se u GROUP BY obavezno stavlja sve iz SELECT. Bar je tako u ACCESS-u.
5. Prikazati u kom broju odeljenja radi preko 4 radnika 5.a) I koliko radnika
SELECT BROD,
FROM RADNIK
GROUP BY BROD
HAVING COUNT(BROD)>4
Ovde smo rekli da u rezltatu želimo samo brod (SELECT BROD) i to onih koji zapošljavaju vise od 4 radnika. Grupisali smo rezltate po brodu, i rekli da prebroji rezultate sa komandom COUNT(BROD) a sa HAVING smo ubacili uslov da taj broj bude veci od 4. Da smo želeli da vidimo brojeve odeljenja koji zapošljavaju između 2 i 4 kradnika trebali bi umesto >4 staviti samo bukvalan prevod na engleski. Between 2 and 4. Between uključuje i pomenute granice, za razliku od >, ali taj znak se može kombinovati sa = pa se može izvesti i bez between. Zadatak po a) je sve isto samo u SELECT treba da dodamo ,COUNT(BROD) jer smo hteli da se izlista i taj broj koji zadovoljava uslov.
ORDER BY (lista atributa 3)
Služi za sortiranje rezultata. Pored same komande ubacuje se i atribut (atributi). Ako želimo da se izlista nešto u rastućem smeru, onda se samo doda atribut, a ako se želi opedajući smer onda se pored atributa ubacuje i skracenica DESC. Rastući smer za brojeve je od 0-9, a za slova od A-Z.
6.Prikazati imena zaposlenih, platu i rezultate urediti po plati u rastućem smeru, i imenu u opadajućem smeru
SELECT IME, PLATA
FROM RADNIK
ORDER BY PLATA, IME DESC
Prvi uslov je plata pa se i ona prvo piše i to bez DESC je se traži rastući smer, pa se posle unosi drugi zahtev i to odvojen zarezom i to sa DESC naredbom jer se traži da rezultati budu u opadajućem smeru.
Ugnježdeni upit i prirodno spajanje
U ugnježdenom upitu se neki podatak izvlači iz nekog drugog upita, a kod prirodnog spajanja se podatak izvlači direktno iz tabele, ali prethodno moraju biti pravilno povezane te tabele.
Spajanje se vrši na sledeci nacin.
IMETABELE1.ATRIBUT=IMETABELE2.ATRIBUT
Važno je reći da je atribut identičan, a da se samo tabele ralikuju.
U našem slučaj postoji samo 3 povezivanja i to RADNIK.BROD=ODELJENJE.BROD and UCESCE.IDBR=RADNIK.IDBR and UCESCE.BRPROJ=PROJEKAT.BRPROJ.
Vezivanje se vrši po primarnom klucu, a redosled nije bitan, kao što nije ni bitno da li se prvo stavi TABELA1 ili TABELA 2.
7.Izlistati imena radnika koji rade u odeljenju koje se zove komercijala
SELECT IME
FROM RADNIK, ODELJENJE
WHERE BROD IN (SELECT BROD
FROM ODELJENJE
WHERE IMEOD="KOMERCIJALA" )
Nekome je možda lakse da ugnježdene upite rešava unazad. Donji upit daje broj brod-a, koji gornji upit koristi za selekciju radnika koji rade pod tim brod-om.
Prirodnim spajanjem bi to izgledalo ovako
SELECT R.IME
FROM RADNIK AS R, ODELJENJE AS O
WHERE R.BROD=O.BROD AND O.IMEOD="KOMERCIJALA"
Uvedu se skraćenice po želji, povežu se tebele po šablonu i doda se uslov koji se traži.
NAPOMENA
Ako se traži atribut samo iz jedne tabele onda je moguće to uraditi preko ugnježdenog upita, ali ako se traže atributi iz različitih tabela onda se mora koristiti prirodno spajanje.
Tabela RADNIK i PROJEKAT nisu direkto vezani, ali su povezani preko tabele UCESCE, te ako se traži nesto iz ove 2 tabele mora se pomenuti i tabela UCESCE u FROM delu i prirodno spoiti u WHERE
8. Izlistati imena radnika, posao i broj projekta koji rade na izvozu
SELECT R.IME, R.POSAO, P.BRPROJ
FROM RADNIK AS R, UCESCE AS U, PROJEKAT AS P
WHERE R.IDBR=U.IDBR AND U.BRPROJ=P.BRPROJ AND P.IMEPROJ="IZVOZ"
Vazno !
Ovim putem se izvinjavam za greške koje su možda slučajno promakle kao i za stopostotnu ispravnost teksta.
Pedja
Nazad na početak