sql

Upload: biljana-vujovic

Post on 20-Jul-2015

177 views

Category:

Documents


0 download

TRANSCRIPT

SQL - prirunik

Uvod Upitni jezik SQL slui ka kreiranje, organizaciju i manipulaciju podacima u bazama podataka. Sam nastanak jezika se vezuje za IBM-ovu istraivaku laboratoriju u San Hozeu (Kalifornija), gde je SQL razvijen kasnih sedamdesetih godina. Sama skraenica "SQL" znai struktuirani upitni jezik (Structured Query Language). Jezik je originalno razvijen za IBM-om proizvod "DB2" (relational database management system, ili RDBMS, sistem za upravljanje relacionim bazama podataka). U stvari SQL je uinio moguim sisteme za upravljanje relacionima bazama podataka. SQL je neproceduralni jezik, za razliku od proceduralnih jezika ili jezika tree generacije (kada je nastao), kao to su COBOL i C. Karakterstika koja odvaja DBMS od RDBMS, je ta da je RDBMS skup ili set-orijentisan jezik za upravljanje bazama, ovo znai da se svi procesi odvijaju nad odreenim skupom podataka. Trenutno u svetu postoji vie standarda SQL jezika, najpoznatije su: ANSI-92, ISO, Microsoft SQL itd. U principu osnovni standard je ANSI, tako da se svi drugi standardi za neki stepen razlikuju od ovog, u najveem broju sluajevima radi se o proirenjima osnovnog SQL standarda kojima se ovaj jezik pretvara u pravi proceduralni jezik. Za primere u sledeim lancima koristiemo Microsoft SQL i njihov sistem za upravljanje bazama podataka "MS SQL Server". Microsoft je uao u svet SQL-a kupovinom licence od "Sybase"-a, za osnovne blokove koji grade SQL Server. Tako da se zajednikim naporom Sybase-a, Ashton-Tate-a i Microsoft-a dolo do prve mogunosti korienja relacionih baza podataka na PC platformi, 1988. godine. Od 1993. godine Microsoft samostalno razvija ovaj sistem. Osnovna prednost ovog sistema je jednostavnost u korienju i administriranju, to je inae glavni problem kod sistema drugih proizvoaa (velika sloenost i vee cene). Jo jedna od mnogih prednosti ovog sistema je skalabilnost. ta ovo znai u praksi? Vaa firma moe, na primer, da poseduje nekakvu bazu podataka koja radi u MS Access-u, te kako vaa firma napredije i proiruje se, pred nju se postavljaju i vei zahtevi. Kada doete do odreene kritine take moiete vrlo jednostavno da sve vae podatke iz Access-a, prebacite na SQL Server platformu, i na taj nain obezbedite redovno funkcionisanje firme, bez mnogo napora i ulaganja.

3

SQL - prirunik

Osnove sintakse Da bi osetili punu snagu jedne relacione baze podataka, potrebno je da "komuniciramo" sa njom. Glavna komunikacija sa bazom se odvija putem takozvanih "upita" (engl. Query). Recimo, elimo da od baze dobijemo informaciju iz nae baze o "svim radnicima (baza "radnici") koji su roeni 1960. godine i koji imaju mainsku struku". Ovo tekstualno pitanje predstavlja jedan upit, koji emo mi konvertovati u SQL jezik da bi softver za upravljanje bazama podataka vratio odgovarajui rezultat. Jedan upit ne mora obavezno biti samo "pitanje" upueno bazi, ve i instrukcija, namenjena sledeim aktivnostima:

Kreiranje ili brisanje tabele. Dodavanje, brisanje i modifikovanje podataka (slogova). Pretraga vie tabela odjednom, i vraanje podataka u odreenom redosledu.

Naravno, upit moe biti i neko jednostavno "pitanje" upueno bazi podataka. Kao to ete videti, sintaksa SQL-a je vrlo fleksibilna, ali poseduje i odgovarajua pravila pisanja , kao i bilo koji drugi programski jezik. Jednostavnim upitom ilustrovaemo sintaksu jednostavne SQL instrukcije. Zapazite u sledeim redovima, pisanje karaktera, prostor izmeu izraza i logika razdvajanja komponenti upita: SELECT IME, PREZIME, LIB FROM RADNIK WHERE PREZIME = 'JOVANOVIC'; U prethodnom primeru sva slova izraza napisana su velikim slovima, ali to ne mora da bude tako: select ime, prezime, lib from radnik where prezime = 'JOVANOVIC'; Zapazite da je 'JOVANOVIC' napisano velikim slovima. U sluaju da u bazi imamo "Jovanovic", upit nee vratiti pravi rezultat. Zapravo, instrukcije SQL-a nisu "case"senzitivne (osetljive na razliku mala-velika slova), ali zato jesu reference u samoj bazi podataka (polja). U veini sluajeva nazivi polja se piu velikim slovima.

4

SQL - prirunik

Select... From

Najbitniji elementi jednog upita su kljune rei. U zavisnosti od vrste upita, odreene kljune rei mogu biti obavezne, ali to nije uvek sluaj. Kako budete due koristili SQL, videete da se kljune rei "SELECT" i "FROM" najee pojavljuju. Zato emo i poeti sa kljunom reju "SELECT", jer najvei broj SQL iskaza poinje sa ovom reju. Sintaksa glasi: SELECT Kada bi naveli iskaz samo navoenjem kljune rei i naziva polja (npr. "SELECT;"), dobili bi poruku o greci, jer ova kljuna re nikada se ne koristi sama za sebe. SELECT * ERROR at line 1: ORA-00936: missing expression Ovako bi izgledala poruka o greci, gde znak "*" oznaava da neto nedostaje. A nedostaje upravo kljuna re "FROM". Sintaksa glasi: FROM Iza kombinacije kljunih rei "SELECT" i "FROM" lei itava snaga sistema za upravljanje bazama podataka. U sledeem primeru imamo tabelu "cekovi" u kojoj se prati realizaciju ekova (kao na slici). Postaviemo na prvi konkretan upit: SELECT * FROM cekovi; Kao rezultat vratie se svi slogovi iz tabele "cekovi", i to iz svih polja. Znak "*" zamenjuje sve nazive polja u jednoj tabeli i na taj nain nam skrauje vreme pisanja upita. Zapazite na kraju upita i znak ";" taka-zarez, koji govori interpreteru da je tu kraj jednom upitu, ali ovaj znak nije obavezan u svim implementacijama SQL-a (npr. Microsoft SQL, Borland ISQL). U sluaju da upit napiemo ovako: SELECT Iznos, Datum, Cek FROM cekovi; Upit e vratiti podatke izlistane tako da je raspored kolona obrnut. Da vam odmah prikaemo i drugi nain pisanja upita: SELECT Iznos, Datum, Cek FROM cekovi; Ako ovako napiemo upit, dobiemo isti rezultat, ali je ovako mnogo preglednije, posebno kada budete pisali vrlo sloene upite. U sluaju da vam ne trebaju sva polja iz tabele, nego da elite da se koncentriete samo na broj eka i iznos, napisaete sledei upit:

5

SQL - prirunik

SELECT Cek, Iznos FROM cekovi; Dobiete rezultat kao na slici. Sada emo na osnovni upit proiriti kljunom reju "Distinction", zapazite da se u polju "Iznos" pojavljuju dva sloga iste vrednosti - 250,00. Kljunu re "Distinction" koristimo kada elimo da nam se iz odreenog polja vrate samo razliite vrednosti. Ako postavimo sledei upit: SELECT DISTINCT Iznos FROM cekovi; Iz rezultujueg skupa podataka bie izbaeni svi slogovi koji se ponavljaju . Kljuna re "WHERE"

Ukoliko vam iz baze podataka budu potrebni specifini podaci ili grupa podataka, moraete da upotrebite jedan ili vie uslova u samoj SELECT naredbi. Uslov(i) se navode iza kljune rei "WHERE". Evo i primera jednog uslova: PREZIME='Peric' Upit bi pod ovim uslovom trebao da vrati sve slogove entiteta "Radnik" iji je atribut "PREZIME" jednak "Peric". U sledeem primeru postaviemo uslov da nam sistem za upravljanje bazama podataka "vrati" podatak o tome koji sve radnici imaju prebaaj radnog vremena (preko 100 radnih asova): RadniSati > 100 Uslovi nam omoguavaju da pravimo selektivne upite. U najveem broju sluajeva uslovi sadre: varijable, konstante i komparacione operatore. U prvom primeru varijabla je "PREZIME", a konstanta "Peric" i operator je "=". U drugom, "RadniSati" je varijabla, 100 je konstanta i komparativni operator je ">". Kljuna re "WHERE" prouzrokuje da vai upiti budu jo selektivniji. Bez ove kljune rei, jedina korisna stvar koju moe da odradi upit je jednostavno vraanje svih slogova izabrane tabele. Kada imamo sluaj kao na slici moemo postaviti sledei selektivni upit: SELECT * FROM Radnik WHERE RadniSati>90; to se tie operatora, oni su elementi koji se koriste unutar upitnih izraza i artikuliu kako vi elite da postavite uslove. Operatori su podeljeni u est grupa: aritmetiki, komparacioni, karakter, logiki, skupovni i ostali.

6

SQL - prirunik

L - Aritmetiki operatori plus i minus Operatori su elementi SQL upita, pomou kojih se formiraju uslovi za dobijanje odgovarajuih podataka. U ovom prilogu emo obraditi aritmetike operatore. Aritmetiki su operatori: plus (+), minus (-), deljenje (/), mnoenje (*), i moduo (%). Prva etiri nije potrebno objanjavati, a peti - moduo predstavlja ostatak rezultata celobrojnog deljenja (nee raditi sa realnim tipom podataka): 5%2=1 6%2=0 Hijerarhija operatora je sledea: mnoenje, deljenje, moduo, sabiranje i oduzimanje. Na primer izraz: 3*9+6/3 jednak je: 27+2=19. Operaciju sabiranja moete izvesti na nekoliko naina. Ako recimo imamo tabelu "Cene" i u njoj polja "Artikl" i "Cena" (kao na slici). Kada zadamo upit "SELECT * FROM Cene", kao rezultat dobiemo sve slogove u dva polja. Sada probajte sledei upit: SELECT Artikl, Cena, Cena+20 FROM Cene; Dobiete rezultat kao na slici (srednja tabela), tj. pojavie se i novo polje "Cena+20" u kome e se cena artikla u svakom slogu poveati za 20. Ovo novo polje se ne nalazi u tabeli. SQL dozvoljava kreiranje virtuelnih polja, kombinacijom ili modifikacijom postojeih polja. Probajte i sledei upit: SELECT Artikl, Cena, (Cena+20) MPC FROM Cene; Kao rezultat dobiete situaciju kao na slici (donja tabela), zapazite da smo treem, virtuelnom polju dali naziv "MPC" (maloprodajna cena). Na isti nain moete preimenovati bilo koje polje u tabeli, i to preko sintakse . Pa tako u naem primeru moemo zadati: "Artikl = Proizvod", ovo se esto koristi kod kreiranja izvetaja, zbog razliitih mogunosti generatora izvetaja. Sledea operacija je oduzimanje (-), kod ove operacije imamo dve mogunosti upotrebe:

7

SQL - prirunik

prva je promena znaka u slogovima jednog brojanog polja, pa tako ako imamo podatak "+50" sa znakom minus emo promeniti predznak: SELECT Artikl, -Cena FROM Cene; Rezultat e biti da e sve cene promeniti predznak.

druga je obino oduzimanje, u tabeli je mogue oduzeti vrednosti jednog polja od vrednosti drugog polja:

SELECT Artikl, Cena, MPC, (MPC-Cena) Razlika FROM Cene; Ovo moete iskoristiti da ispravite eventualne greke u podacima jednog ili vie polja. U naem sluaju samo kreirali polje kao razliku dva postojea polja. U sluaju da upotrebite operator minus nad poljem koje sadri stringove, dobiete poruku o greci.

Komparacioni operatori i vrednost NULL Kao to im i samo ime kae, komparacioni operatori uporeuju izraze i kao rezultat vraaju jednu od tri vrednosti: TRUE, FALSE i Unknown. Za TRUE i FALSE nisu potrebna objanjenja, ali ta predstavlja "Unknown"? Ova vrednost je vezana za "NULL" vrednost u slogu baze podataka. NULL vrednost govori da u datom polju odreenog sloga nema nikakvog podatka (ni nule (0) i praznog prostora-blank). Na primer, ako imamo komparaciju "Polje_u_bazi = 9", a dato polje sadri vrednost NULL (tj. ne poseduje nikakvu vrednost), kao rezultat vratie se "Unknown". Poto je ovakva deklaracija esto zbunjujua, mnogi sistemi za upravljanje bazama podataka pretvaraju "Unknown" u FALSE, i na taj nain omoguavaju korienje specijalog operatora "IS NULL" kao test za prazna polja u bazi. Kao primer, uzeemo tabelu "Artikli", u kojoj su izlistani odreeni proizvodi i njihove cene. Da bi dobili potpunu informaciju o celoj tabeli sa svim poljima, upotrebiemo upit: SELECT * FROM Artikli; I kao rezultat, dobiemo tabelu kao na slici. Zapazite da nema nikakvog podatka u polju "Cena" za artikl "Luk". U stvari vrednost ovog polja za artikl "Luk" je "NULL". U ovom sluaju vrednost NULL je bolje uoljiva (poto se radi o numerikom polju), nego da je

8

SQL - prirunik

vrednost NULL upotrebljena u polju "Artikl". U polju "Artikl", praznina bi mogla da predstavlja vrednost NULL ili prazan znak (blank). Sada emo pokuati da pronaemo vrednosti NULL: SELECT * FROM Artikli WHERE Cena IS NULL; Kao rezultat dobiemo tabelu kao na slici (srednji deo). Videete da se kao izlaz pojavio samo jedan slog (Luk). ta e se desiti kao umesto "IS NULL" upotrebimo operator jednako (=)? SELECT * FROM Artikli WHERE Cena = NULL; Kao rezultat neemo dobiti nijedan slog, jer je komparacija "Cena=NULL" vratila vrednost "FALSE" - rezultat je nepoznat. Znai, kad god vam je potrebno da pronaete prazne slogove, koristite operator "IS NULL". Karakter operator LIKE Nastavljamo priu o upitima, i prelazimo na karakter operatore. Karakter operatore moemo koristiti za manipulaciju naina na koji su predstavljeni stringovi (string polja u bazi). Manipulacija se odnosi na aktivnost postavljanja uslova za podatke koji e biti vraeni iz baze podataka. U ovom tekstu emo obraditi operator "LIKE". ta ako imate podatke u odreenim string poljima, koji predstavljaju isti pojam, ali su napisani na razliite naine? U tim i slinim situacijama koristiemo operator LIKE za vraanje svih potrebnih podataka. U sluaju kada bi koristili operator "=", dobili bi identian rezultat, ali bi morali da za taj identian rezultat da postavimo mnogostruke uslove. Na primer ako imamo situaciju kao na slici (podaci o artiklima i mestu skladitenja) i postavimo sledei upit:

SELECT * FROM Artikli

9

SQL - prirunik

WHERE Mesto LIKE '%MAGACIN%' Kao rezultat dobiemo podatke kao na slici ispod, tj. dobiemo sve podatke gde se u polju "Mesto" javlja re "MAGACIN". Moete zapaziti da smo u upitu koristili znak procenta (%). Kada koristimo ovaj znak unutar "LIKE" izraza, znak procenta predstavlja "doker" znak, tj. znak koji zamenjuje bilo koju kombinaciju karaktera. U naem sluaju, kao rezultat dobili smo tri sloga koja u polju "Mesto" imaju re "MAGACIN". Ako sada malo drugaije postavimo upit: SELECT * FROM Artikli WHERE Mesto LIKE 'MAGACIN%' Kao rezultat dobiemo dva podatka, prvi i poslednji, tj. one podatke koji poinju sa reju "MAGACIN". Upotreba "doker" znaka je vrlo fleksibilna, pa tako moemo postaviti i ovakav upit: SELECT * FROM Artikli WHERE Artikl LIKE 'S%' Upit e vratiti dva podatka: "Sapun" i "Sir", tj. podatke koji poinju slovom "S". Morate jo znati da je izraz "LIKE" case-sensitive (osetljiv na mala/velika slova). Pa tako, ako postavimo prethodni uslov na sledei nain: SELECT * FROM Artikli WHERE Artikl LIKE 's%' Kao rezultat neemo dobiti nijedan podatak.

Jo jedan "doker" znak

10

SQL - prirunik

Nastavljamo se na priu o karakter operatoru "LIKE", ali ovoga puta govorimo o drugom "doker" znaku, a to je podvuena linija (_) - underscore. Za razliku od doker znaka (%), doker (_) zamenjuje samo jedan, bilo koji karakter. U sledeim primerima videemo kako se koristi, koristei tabelu "Imenik" (kao na slici). I sada, ako elimo da dobijemo sve telefonske brojeve iz imenika koji pripadaju recimo Vojvodini (druga oznaka dvojka), postaviemo sledei upit: SELECT * FROM Imenik WHERE Pozivni LIKE '_2_' Kao rezultat vratie se dva podatka (Pozivni - 021, 022). Takoe treba znati da moemo viestruko koristiti doker znake u jednom upitu: SELECT * FROM Imenik WHERE Telefon LIKE '56_-3__' Za rezultat e se vratiti dva podatka (1.569-365, 3.562-387 - vidite sliku). Prethodan upit smo mogli postaviti i na ovaj nain: SELECT * FROM Imenik WHERE Telefon LIKE '56_-3%' Dobili smo isti rezultat, tako da iz ovog upita moem videti da u jednom upitu moemo koristiti i vie razliitih doker znaka.

Skupovni operatori u selekcijama

11

SQL - prirunik

Nastavljamo sa SQL upitima i to sa operatorima za spajanje slogova iz dve tabele. Spajanje vrimo pomou operatora "UNION" i "UNION ALL" (unija skupova podataka). Korienjem ovih operatora, spajamo slogove iz dve tabale, ali istovremeno izbacujemo duplirane slogove. U sledeem primeru imamo dve tabele sa slinim podacima, radi se o artiklima u dva magacina. Na cilj je da kao rezultat upita dobijemo sve razliite vrste artikala iz oba magacina. Probajte sledei upit: SELECT Artikl FROM Magacin1 UNION SELECT Artikl FROM Magacin2; Rezultat e biti kao na slici, tj. dobiemo nazad osam slogova od ukupno deset iz obe tabele. Zbog operatora "UNION" bie izbaeni slogovi "Jaja" i "Hleb", poto se oni ponavljaju. U sluaju da elimo da izlistamo sve slogove iz obe tabele, bez obzira na ponavljanja, upotrebiemo operator "UNION ALL": SELECT Artikl FROM Magacin1 UNION ALL SELECT Artikl FROM Magacin2; Kao rezultat dobiemo sve slogove iz obe tabele, tj. ukupno deset slogova. Operator slian prethodnim je i "INTERSECT" tj. presek, i kao to mu ime govori, on slui za dobijanje preseka dva skupa. U ovom sluaju radi se o preseku, tj. istim vrednostima iz obe tabele. Postaviemo sledei upit: SELECT Artikl FROM Magacin1 INTERSECT SELECT Artikl FROM Magacin2; Kao rezultat dobiemo samo podatke "Jaja" i "Hleb", poto su oni sadrani i u jednoj i u drugoj tabeli. I poslednji operator koji se bavi slogovima u tabeli, kao skupovima, je operator "MINUS" (razlika). Kada upotrebimo ovaj operator, kao rezultat vratie se slogovi koji su sadrani samo u prvoj tabeli, a istovremeno nisu u drugoj. Sintaksa glasi: SELECT Artikl FROM Magacin1 MINUS SELECT Artikl FROM Magacin2; Kreiranje baze i tabela

12

SQL - prirunik

U ovom prilogu emo objasniti postupak kreiranja jedne baze podataka i pripadajuih tabela. Ovo je mogue uraditi pomou SQL jezika, jer on pored svojih primarnih funkcija za manipulaciju podacima (SELECT, INSERT, UPDATE...), poseduje i funkcije za definisanje podataka. Jezici koji imaju i ovu mogunost pripadaju DDL (Data Definition Language) grupi jezika - jezika za definisanje podataka. Prvo to treba da uradimo je da kreiramo bazu podataka. Ova operacija ide od jednostavne do vrlo sloene, sve zavisi od vaih potreba. Gotovo svi savremeni sistemi za upravljanje bazama podataka sadre i komponentu za grafiko kreiranje i manipulaciju podacima. Kod njih, skoro sve operacije moete da uradite pomou mia, naravno iza ovakvih alata stoje SQL instrukcije. Ali, mi neemo koristiti te alate, ve emo sve operacije vriti zadavanjem tekstualnih SQL instrukcija. Sintaksa SQL instrukcije za kreiranje baze podataka je sledea: CREATE DATABASE naziv_baze_podataka; Ova instrukcija, ali i ostale SQL instrukcije, se razlikuju od sistema do sistema (za upravljanje bazama podataka). Veina sistema ima sopstvene ekstenzije SQL-92 standarda. Mi emo za primer kreirati jednu bazu podataka i to u Microsoft SQL Server okruenju. Uzmimo npr. da treba da statistiki da pratimo uinak jedne odbojkake ekipe pomou baze podataka. Za poetak kreiraemo prvo samu bazu podataka: CREATE DATABASE statistika; A zatim emo kreirati i jednu tabelu u kojoj emo pratiti uinak igraa pojedinano. Tabelu emo nazvati "Igra" (igrac) i sastojae se od sledeih polja (tipova entiteta):

ime igraa (ime) broj uspenih servisa (servis) broj uspenih blokova (blok) broj uspenih smeeva (smec).

A evo i same SQL instrukcije: CREATE TABLE igrac ( ime char(20), servis numeric, blok numeric, smec numeric); Zapazite da prilikom definisanja polja moramo definisati i tip podatka za dati tip entiteta. Tipovi podataka i njihove osobine variraju od sistema do sistema. Mi smo u primeru naveli tipove podataka vezane za MS SQL Server, a to su dva tipa:

13

SQL - prirunik

karakter tip podataka - char (npr. kod Oracle sistema isto - char) numeriki tip podataka - numeric (npr. kod Oracle sistema - number).

Pogled (View) "View" ili pogled - predstavlja nain za prikazivanje podataka iz baze, tj. to je u stvari set uputstava koja upuujete SQL Server-u, i kojima nalaete serveru kako elite da vidite podatke. Pogledi se jo zovu i "virtuelne tabele". Da bi vam pribliili pojam pogleda, zamislite ih kao upite u MS Access-u. Podatke iz upita - pogleda moemo menjati, aurirati ili ak brisati, kao i u radu sa obinim upitima. Pogledi se mogu aurirati jer se zasnivaju na SQL Select naredbi. Mada vam na prvi pogled moe izgledati da radite sa pravim tabelama podataka, to nije tano, jer se jednim pogledom ne kreira trajna kopija skupa podataka iz baze. Ovde treba biti oprezan, iz razloga to iza podataka u pogledima uvek stoji prava tabela.

Generalna sintaksa za kreiranje pogleda je sledea: CREATE VIEW /naziv_pogleda/ AS SELECT /naziv_kolone/ FROM /naziv_tabele/; Uzeemo za primer tabelu "Artikli" sa podacima o entitetu artikl, sa nekoliko obeleja (kao na slici). U sledeem pogledu moemo videti da se pogled ne mora sastojati od svih kolona-obeleja iz jedne tabele: CREATE VIEW Cene AS SELECT Artikl, Cena FROM ARTIKLI; Znai, pogledi doputaju sve ono to doputa i klasina SELECT naredba. U sledeem primeru emo izvojiti samo artikle koji zadovoljavaju odreeni kriterijum: CREATE VIEW Jeftino AS SELECT Artikl, Cena, Kolicina FROM ARTIKLI WHERE Cena < 35 ; Kao rezultat emo dobiti dva podatka koji zadovoljavaju uslov da je obeleje "Cena" manja od 35. Osnovu sintaksu pogleda smo proirili sa jednim uslovom. Da ne bi bilo da pogledi mogu da budu samo jednostavni, oni mogu biti vrlo sloeni i mogu se definisati nad vie tabela. Sintaksa sloenih pogleda nad vie tabela je vrlo slina sintaksi sloenije SELECT

14

SQL - prirunik

naredbe: CREATE VIEW /naziv_pogleda/ AS SELECT /naziv_kolone_1 ... naziv_kolone_n/ FROM /naziv_tabele_1 ... naziv_tabele_n/ WHERE kljuc_tabele1=kljuc_tabele_2 ...;

Okida (Trigger) Trigger, rule ili okida predstavlja jedan od mehanizama za proveru uslova integriteta baze podataka. Okida je jedna programska procedura sistema za upravljanje bazama podataka (SUBP), koja se aktivira odreenim dogaajem, a ti dogaaji mogu biti:

upis nove zapisa u tabelu brisanje odreenog zapisa modifikacija postojeeg zapisa

Okida u stvari pokree odreenu aktivnost nad bazom, uvek kada se desi jedan od navedenih dogaaja. Tanije reeno, SUBP inicira izvrenje okidaa, odmah po nastajanju dogaaja. Rad okidaa je van kontrole aplikacionog programa koji je vezan na SUBP, a obavezno se izvrava. Kao primer naveemo situaciju kada je okida kreiran tako da kada se iz programa izbriu podaci o nekom kupcu, automatski se izbriu i sve njegove narudbine. Na ovaj nain odrali smo propisane odnose izmeu podataka razliitih entiteta (u ovom sluaju entiteta "Kupac" i entiteta "Narudzba"). Sintaksa okidaa je sledea: CREATE [OR REPLACE] TRIGGER /naziv_okidaca/ /tip okidaca/ ON /naziv tabele/ BEGIN /izvrsne_instrukcije_okidaca/ END Naravno, potpuna sintaksa je mnogo sloenija, ali i ovo je dovoljno da vidimo ta su okidai i kako deluju. Zapazite klauzulu " OR REPLACE", ona omoguava da postojei okida sa istim imenom zamenimo novim. Tipovi okidaa mogu biti: BEFORE, AFTER i INSTEAD OF.

15

SQL - prirunik

Evo i primera okidaa, uzmimo da imamo tabelu "Dobavljac-Artikal", okida e vriti proveru pre upisa u datu tabele, da li dati dobavlja uopte nabavlja dati proizvod: CREATE TRIGGER ubaci_Dobavljac_Artikl BEFORE INSERT ON Dobavljac_Artikl FOR EACH ROW BEGIN RULE_DOBAVLJA (:NEW.D, :NEW.A) END ubaci_Dobavljac_Artikl Primer je realizovan u okruenju SUBP "Oracle".

ta su indeksi? Jedna od veoma vanih aktivnosti prilikom dizajniranja baze podataka je pravilno definisanje tabela. Prilikom ovoga SQL server ne vodi rauna o fizikom smetaju podataka, osim ogranienja tipom podatka i definisanjem primarnog kljua. Ali ovim se ne vre nikakve optimizacije nad tabelama radi breg odziva, tj. vraanja rezultata upita. Za ovo je zaduen mehanizam indeksa tabela koje mi moramo da definiemo. Zamislite sluaj da nema indeksa, prilikom nekog upita server bi morao da proe kroz sve slogove u tabeli u cilju pronalaska odgovarajuih slogova. U sluaju ogromnih baza podataka, vreme potrebno za vraanje rezultata upita je mnogo due nego kada se definiu indeksi. Kao primer naveemo analogiju izmeu SQL baze podataka i medicinske kartoteke. Sluaj kada nemamo definisane indekse, analogan je neureenoj kartoteci, tj. kartoteci koja nije sloena ni po jednom osnovu. Kada bi recimo medicinska sestra trebalo da pronae neki karton osiguranika, verovatno bi krenula sa jednog kraja i redom pretraivala, sve dok ne bi naila na odgovarajui. Kada se cela kartoteka sloi recimo po poetnom slovu prezimena, pretraga za odreenim kartonom je neuporedivo bra. Sada zamislite da se kartoteka moe poreati i po: godini roenja, mestu roenja, polu i sl. Na ovaj nain smo kreirali kataloge, pa kada traimo odreeni karton, prvo pogledamo u katalog, vidimo gde se nalazi karton (na kojoj polici - adresa) i idemo odmah da ga naemo. Sve ovo je analogno indeksima baze podataka, to znai da su indeksi katalozi o podacima u odreenim tabelama. Indeksi su jo jedna vrsta informacije koja se mora uvati i za njih se mora odvojiti memorijski prostor unutar baze podataka.

16

SQL - prirunik

Odreivanje indeksa se vri u odnosu na sam kontekst baze podataka, zbog najbolje optimizacije definisanih upita. Osnovna SQL sintaksa za kreiranje indeksa je sledea: CREATE INDEX /naziv_indeksa/ ON /naziv_tabele/ (naziv_polja1, naziv_polja2...); Evo kako bi indeksirali tabelu o nekakvim proizvodima koji pored drugih obeleja imaju i obeleje "ifra artikla", te emo po ovom obeleju indeksirati tabelu: CREATE INDEX Index_SifraPro ON Artikli (Sifra); Osnovno spajanje tabela Jedna od najveih prednosti jezika SQL je njegova mogunost da spaja i manipulie podacima koji se nalaze u vie razliitih izvornih tabela. U velikoj veini sluajeva upiti se ne izvravaju samo nad jednom tabelom, ve nad vie njih koje je potrebno na neki od naina, spojiti. Da nema ove mogunosti, trebali bi smo da sve mogue podatke stavimo u jednu jedinu tabelu. Ali, gde je onda tu relacioni model? Kao uvod u ovu iroku temu, prvo emo objasniti najjednostavnije spajanje dve tabele uz pomo SELECT naredbe. Za ovu potrebu, kreiraemo dve tabele sa recimo dva polja (kao u gornjem delu slike). U prva polja obe tabele emo ubaciti identifikacione oznake za svaki slog u datoj tabeli, a u drugom polju e biti oznake samih tabela (radi kasnije identifikacije). A sada emo postaviti i osnovi upit za spajanje dve tabele: SELECT * FROM Tabela1,Tabela2; Ovim upitom vrimo izbor svih dostupnih polja iz obe tabele. Rezultat upita je prikazan u donjem delu slike. ta se dogodilo? Od po tri sloga u svakoj tabeli, nastalo je devet rezultujuih. Ali pogledajte malo bolje u rezultat, i videete da je svakom slogu prve tabele pridruen svaki od slogova druge tabele, to znai 3 puta 3. Na ovaj nain kreirali smo prvi upit za spajanje tabela, koji se jo naziva i "cross-join". Ova vrsta spajanja tabela nema neki znaaj u svakodnevnom radu, ali je dobra za ilustraciju osnovne osobine svih spajanja - spajanje dve tabele (ili vie njih) u jednu.

17

SQL - prirunik

Spajanje tabela po jednakosti polja U prethodnom SQL prilogu govorili smo o spajanju tabela, tj. najprostijoj vrsti spajanja. Sledi pria o spajanju tabela po uslovu jednakosti dva ili vie polja u tabelama. Za primer emo koristiti dve tabele: "Radnik" sa poljima (SIF_R, IME, PREZ, SIF_S) i "Sektor" sa poljima (SIF_S, NAZ_S). Ako sada postavimo prosti upit spajanja: SELECT SIF_R, PREZ, NAZ_S FROM Radnik, Sektor; Kao rezultat dobiemo Dekartov proizvod sa kombinacijama svih slogova iz obe tabele. Isti ovaj upit smo mogli i ovako da postavimo: SELECT R.SIF_R, R.PREZ, S.NAZ_S FROM Radnik R, Sektor S; Ovde zapazite da smo tabelama dodelili tzv. "promenljive domene", koji predstavljaju simbolike reference za tabele. Tako je za tabelu "Radnik" referenca "R", a za tabelu "Sektor" referenca je "S". Promenljivu referencu moemo dodeliti bilo kojoj tabele iz upita, a referenca moe da bude dugaka 128 karaktera (ovo zavisi od same implementacije SQL jezika). Reference koristimo i u "SELECT" klauzuli i u "FROM" klauzuli, i tada za navoenje odreenog polja odreene tabele koristimo, prvo referencu tabele pa naziv samog polja: referenca.polje Osnovna svrha korienja referenci je poveanje itljivosti upita, koja moda nije bitna u naem primeru, ali zamislite da vrite spajanje etiri tabele sa vie polja. Vratimo se spajanju tabela. Spajanje tabela po uslovu jednakosti se vri da bi se spojile iste vrednosti u istim (zajednikim) poljima dve tabele. Pri tome polja tabela moramo tako definisati da se polja jedne tabele pojavljuju u drugoj tabeli. Polje u prvoj tabali moe imati osobinu primarnog kljua, i tada je polje u povezanoj tabeli strani klju. U naem primeru, polje SIF_S (ifra sektora) u tabeli "Sektor" predstavlja primarni klju, a istovremeno u tabeli "Radnik" strani klju. Sada emo izvriti spajanje ove dve tabele po uslovu jednakosti ifre sektora. Upitom emo izlistati: ifru radnika, njegovo ime i prezime, i naziv sektora u kome radi. SQL upit e glasiti:

SELECT R.SIF_R, R.PREZ, S.NAZ_S FROM Radnik R, Sektor S; WHERE R.SIF_S=S.SIF_S Kao rezultat izlistae se podaci o radnicima i nazivi sektora u kome rade, dobijeni preko ifre sektora u tabeli "Radnik".

18

SQL - prirunik

Ugnjedeni upiti Prethodni put govorili smo o spajanju dve ili vie tabela. Ovaj put emo, takoe, govoriti o spajanju, ali na drugaiji nain. Re je zapravo o tome da jedan upit u sebi moe da sadri jedan ili vie upita. Na ovaj nain moemo da izvrimo spajanje vie upita. Pri tome rezultat ugnjedenog upita biva argument onog osnovnog, spoljanjeg upita. Da bi nam sva prethodna pria bila jasnija koristiemo primere koji e se zasnivati na dve tabele (iste kao u prethodnom SQL prilogu): "Radnik" sa poljima (SIF_R, IME, PREZ, SIF_S, PLATA) i "Sektor" sa poljima (SIF_S, NAZ_S). Tabele i pripadajue slogove moete videti na slici. U prvom primeru videemo kako jedna cela SELECT naredba moe biti ugnedena u drugu SELECT naredbu. Za primer, zadatak e biti da upitom dobijemo ifre i imena svih radnika koji rade u sektoru "Prodaja": SELECT SIF_R, IME FROM Radnik WHERE SIF_S = (SELECT SIF_S FROM Sektor WHERE NAZS='Prodaja'); Rezultat moete videti na slici. Kao to vidite podupit se obavezno stavlja u zagrade, ime nalaemo da se on izvrava pre spoljanjeg upita. Analizirajui ovaj upit, moemo videti da izdvajamo slogove (podatke o radnicima) koji rade u sektoru kome je ifra (SIF_S) jednaka rezultatu ugnedenog upita. Podupit je jednostavan i daje jedan slog - ifru sektora iji je naziv "Prodaja". Na ovaj nain smo do traene ifre sektora doli preko naziva sektora i izlistali sve radnike koji u njemu rade. Kada kreiramo ovakav podupit moramo voditi rauna o tome da on mora da vrati samo jednu vrednost. Inae, podupit moe da vrati i vie vrednosti kada se kao operator poreenja koriste kljune rei "IN", "ANY" i "ALL", umesto operatora jednako (=). Kao primer upotrebe podupita sa ovim drugim kljunim reima, postaviemo upit: Prikazati imena, prezimena i plate svih radnika, koji zarauju vie od bilo koga u sektoru "Prodaja". SQL upit e glasiti: SELECT IME, PREZ, PLATA FROM Radnik WHERE PLATA > ANY (SELECT PLATA FROM Radnik

19

SQL - prirunik

WHERE SIF_S= (SELECT SIF_S FROM Sektor WHERE NAZ_S='Prodaja'); Kao to vidite kljunu re "ANY" smo upotrebili da pronaemo radnike ija je plata vea od bilo koje ("any") plate radnika odeljenja "Prodaja". A da bi broj radnika suzili na samo one koji pripadaju datom sektoru iskoristili smo dvostruko ugnjedavanje. Grupisanje podataka klauzulom "Group By" Grupisanje podataka u SQL-u najee vrimo uz pomo SELECT naredbe i njene klauzule "GROUP BY". Grupisanje se vri po odreenoj vrednosti nekog polja u tabeli, a svi grupisani podaci imaju istu vrednost u datom polju. Svi duplikati (slogovi sa istom vrednou u odreenom polju) se smetaju u jednu grupu, i nad njima moe da se obavlja ista funkcija (npr. neka od agregatnih funkcija). Pri ovome, u jednom SELECT iskazu mogu da se izvre grupisanja po vie polja. Klauzulom "GROUP BY" dobijamo samo jedinstvene vrednosti iz odreenog polja tabele, koje e se sortirati prema rastuem redosledu. Ovo je slino klauzuli "ORDER BY", samo to se kod ove ne izbacuju slogovi sa dupliranim vrednostima. U sledeem primeru videemo jednostavan upit koji e prebrojati radnike po sektorima u kojima rade. Tabela koju emo koristiti je "Radnik", a definisali smo je i pre, u ranijim prilozima: "Radnik" sa poljima (SIF_R, IME, PREZ, SIF_S). Upit e glasiti: SELECT Radnik.SIF_S, Count(*) AS stanje FROM Radnik GROUP BY Radnik.SIF_S; Rezultat upita bie kao na slici. Za prebrojavanje broja radnika iskoristili smo agregatnu funkciju "COUNT", a dobijene razultate smo smestili u polje "stanje". Pri ovom upitu sektori e se prvo sortirati (kao "ORDER BY" klauzuli), a zatim e se izbaciti duplikati (tj. nee se prikazati). Jo jedna od bitnih stvari je upotreba klauzule "HAVING", koja slui za selekciju samo odreenih grupa podataka, prethodno grupisanih sa "GROUP BY". Klauzulom "HAVING" uporeujemo neko svojstvo izdvojene grupe sa konstantom, a zatim izdvajamo samo one slogove koji zadovoljavaju ovaj logiki izraz. Recimo da treba da izdvojimo sve sektore sa odreenim brojem radika, upit bi onda glasio: SELECT Radnik.SIF_S, Count(*) AS stanje

20

SQL - prirunik

FROM Radnik GROUP BY Radnik.SIF_S HAVING Count(*)=1; Rezultat upita bi bio (izveden iz tabela sa slike): SIF_S stanje -----------------24 1 Kao to vidite, grupisali smo slogove po sektorima i prebrojali broj radnika u svakom, a zatim smo izdvojili samo one sektore koji imaju samo jednog radnika. Kreiranje tabela Kao to znate, tabele u SQL orijentisanim sistemima za upravljanje bazama podataka (SUBP) predstavljaju dvodimenzionalne nizove podataka i osnovna su logika struktura za smetaj, manipulaciju i prikaz podataka. Za kreiranje tabela i kasnije eventualne promene u strukturi, u SQL se koriste dve instrukcije CREATE TABLE i ALTER TABLE, koje pripadaju DDL (Data Definition Language) segmentu samog jezika. Osnovna sintaksa naredbe CREATE TABLE je sledea (postoje izvesne razlike kod razliitih SUBP): CREATE TABLE naziv_tabele ( polje_1 tip_podatka [not null | null] polje_1 tip_podatka [not null | null] polje_1 tip_podatka [not null | null] ... ;) U ranijim SQL prilozima, za primere smo koristili tabelu "Radnik" koju nismo definisali putem SQL-a, a sada emo videti kako da je kreiramo: CREATE TABLE Radnik ( SIF_R Char(5) not null, IME Char (15), PREZ Char (20), SIF_S Number not null, ;) Kao to vidite, iza kljune rei "CREATE TABLE" navodi se naziv tabele, koji mora da zadovolji odreena pravila. Odmah da kaemo da se i pravila kod davanja naziva razlikuju, kao i sintaksa, od SUBP do SUBP. Recimo kod SUBP "Oracle", naziv tabele ne moe biti dui od 30 karaktera, a kod SUBP "MS SQL Server" duina naziv ide do 128 karaktera.

21

SQL - prirunik

Bitno je da, ni jedan SUBP ne dozvoljava upotrebu kljunih rei i specijalnih znakova, kod davanja naziva tabelama, kao i dupliranje naziva tabela (dve tabele sa istim nazivom). Ista pravila vae i za dodelu naziva poljima tabela, s tim to se ovde mogu pojaviti i dva polja istog naziva, ali u razliitim tabelama. Sledea vrlo bitna stvar je tip podatka nekog polja u tabelama. Tip podataka odreuje koja vrsta informacija moe da se uva u datom polju tj. definie vrstu znakova putem kojih se izraava vrednost elemenata domena. Na primer, polje SIF_R (ifra radnika) definisali smo kao karakter (Char) polje maksimalne duine 5 karaktera. Ovaj tip podataka vezan je za MS SQL Server, ija duina se kree od 1 do 8.000 karaktera. Isti tip podataka kod SUBP Oracle ima duinu do 255 karaktera, s tim to i kod jednog i kod drugog sistema, polje moe da najvie sadri onoliko znakova koliko je zadato. Jo jedna bitna stvar kod odreivanja domena polja (obeleja) tabele je i vrednost NULL. Naime, prilikom definisanja domena javlja se potreba za uvoenjem posebnog simbola "NULL" sa znaenjem "nepoznata vrednost". Ova vrednost se naziva i "nula vrednost", oznaka "NULL" se koristi da bi se ukazalo da nije re o broju 0. Nula vrednost se koristi u onim sluajevima kada nismo u stanju da za neki entitet (Radnik) odredimo vrednost nekog obeleja (polja). Polja u kojima se nalaze nepoznata obeleja popunjavaju se "NULL" vrednou, to nije isto to i prazno mesto (SPACE) ve "nepoznato". U naem primeru, smo delom instrukcije "Char (5) NOT NULL" zabranili da obeleje SIF_R dobije NULL vrednost (zato to je to kljuni polje). Izmena strukture tabela U prethodnom SQL prilogu videli smo na koji nain se kreiraju tabele uz pomo instrukcije CREATE TABLE. Pri tome smo spomenuli i drugu komandu ALTER TABLE, koja takoe pripada DDL (Data Definition Language) komponenti SQL jezika, a namenjena je za izmenu strukture postojeih tabela. Na primer, sa ovom instrukcijom moete da dodate novo ili obriete postojee polje (kolonu), promenite tip postojeeg polja, ili moete samo preimenovati neko od polja. Ovo je vrlo bitna komanda koja e vam u sluaju neuspenog dizajna baze podataka ili u sluaju potrebe za dodavanjem novih obeleja, olakati posao. Ova instrukcija radi na taj nain to kada je pozovemo kreira privremenu kopiju originalne tabele, izvri se izmena na kopiji tabele, pa se na kraju brie originalna tabela, a novoj se menja naziv u staru. Vano je rei i da e prilikom izvravanja naredbe ALTER TABLE originalna tabela ostati u upotrebi, tj. bie dostupna ostalim klijentima (ako se radi o mrei). Sama fizika izmena i upis nove tabele se ne vri sve dok nova tabela nije spremna. Osnovna sintaksa naredbe ALTER TABLE je razliita kod razliitih SUBP, i u osnovi ima vei broj argumenata, a mi emo navesti samo one najbitnije:

22

SQL - prirunik

ALTER TABLE naziv_tabele ADD novo_polje ili MODIFY postojece_polje [definicija] ili DROP postojece_polje ili RENAME postojece_polje TO novo_polje ... ; I ovaj put za primere emo koristiti tabelu "Radnik" koju smo definisali putem SQL-a u prethodnom prilogu. Prvo emo uz pomo ALTER TABLE videti kako da izmenimo definiciju polja "SIF_R" (ifra radnika - proirenje ovog polja, tako da u njega moe da stane 10 karaktera umesto 5) : ALTER TABLE Radnik MODIFY SIF_R Char(10) not null; Za dodavanje novog polja u tabelu koristiemo sledei izraz: ALTER TABLE Radnik ADD SS Char(4) not null; Ovim smo tabeli dodali polje "Struna sprema" (SS), a preimenovanje cele tabele bi bilo: ALTER TABLE Radnik RENAME Sef;

Brisanje tabela i celih baza podataka Prilikom korienja nekog od sistema za upravljanje bazama podataka (SUBP), vremenom e se javiti

23

SQL - prirunik

potreba i da menjate strukturu modela podataka, a ak i potreba za brisanjem nekih tabela ili celih baza podataka. Ovo moe biti zbog prevazienosti i zastarelosti pojedinih struktura podataka ili u sluaju da vebate i uite korienje SQL-a, ili radi uklanjanja privremenih tabela. SQL za ove potrebe obezbeuje komandu za kompletno uklanjanje odreene tabele iz baze podataka, a to je komanda DROP TABLE koja brie (uklanja) tabelu sa podacima, zajedno sa svim pripadajuim pogledima (Views) i indeksima. Nakon izvrenja ove komande nema vraanja nazad, podaci e biti izgubljeni. Sintaksa ove instrukcije je sledea: DROP TABLE naziv_tabele; Za primer, kreiraemo jednu tabelu (tabela Radnik), a zatim emo je obrisati: CREATE TABLE Radnik ( ime Char(15) not null, prezime Char(15) not null); DROP TABLE Radnik; Kada pozivate i izvravate instrukciju DROP TABLE, trebalo bi da uvek upotrebite naziv baze podataka kojoj pripada data tabela. Ovo je iz razloga to se na ovaj nain izbegava da izbriete pogrenu tabelu. U ovom sluaju bi prethodna instrukcija bila napisana na sledei nain: DROP TABLE Kadrovska.Radnik; Kao to moete videti, ovom instrukcijom briemo tabelu "Radnik" iz baze podataka "Kadrovska" (kadrovska evidencija). Pored navedene instrukcije pojedini SUBP obezbeuju jo jednu instrukciju, a to je ona koja slui brisanju cele baze podataka - DROP DATABASE. Za primer, ovom komandom izbrisaemo bazu podataka koju smo spomenuli u prethodnom pasusu: DROP DATABASE Kadrovska; Da kaemo i to da mogunost da koriste ovu komandu imaju samo administratori SUBP (kod sistema koji je dozvoljavaju) i niko vie. Kada se ova komanda izvri, vri se uklanjanje svih objekata, podataka i log fajlova koji su pripadali datoj bazi podataka.

Manipulacija podacima Do sada smo, u SQL prilozima, obradili kreiranje baza podataka i tabela, i naine selekcija podataka, a nismo se bavili unosom podataka u tabele i njihovom izmenom. Za manipulaciju podacima unutar tabela baze podatka, u SQL-u koriste se sledee tri instrukcije:

24

SQL - prirunik

naredba INSERT naredba UPDATE naredba DELETE

Ako ste do sada koristili neki od Windows sistema, kao npr. MS Access ili MS FoxPro, videli ste da su operacije unosa, izmena i brisanja potpuno automatizovane, i da vam za ove operacije nije bilo potrebno znanje SQL jezika. Iza ovakvih sistema stoje upravo ove tri SQL naredbe koje smo naveli. Sintaksa naredbe INSERT je sledea: INSERT INTO naziv_tabele (polje1, polje2, polje3...) VALUES (vrednost1, vrednost2, vrednost3...); Ovom naredbom dodajemo podatak - slog (record), i to u odgovarajua, prethodno navedena polja (polje1...). Pri korienju ove naredbe morate voditi rauna o tome da tip podataka koji se unosi u tabelu, mora da odgovara tipu podataka polja i da ne sme da pree njegovu deklarisanu duinu. Redosled vrednosti koje se upisuju u jedan slog, mora da odgovara redosledu navedenih polja. U sledeem primeru videemo kako se u, ve nama poznatu, tabelu "Radnik" unosi jedan slog: INSERT INTO Radnik (Ime, Prezime, MBR, Sektor) VALUES (Milan, Maric, 3260, Analiza); Sledea instrukcija je - UPDATE, a ona nam slui za promenu vrednosti postojeih podataka u tabeli. Sintaksa ove instrukcije je sledea: UPDATE naziv_tabele SET polje1 = vrednost1, polje2 = vrednost2, ... WHERE uslov; U naredbi se prvo navodi tabela u kojoj e se menjati podaci, a zatim i lista polja za izmenu (sa odgovarajuim novim vrednostima). Na kraju instrukcije moemo da definiemo uslov, tj. da uslovom odredimo kod kojih slogova e se izvriti izmena. Na primer, imamo tabelu "Radnik" i jedno od polja oznaava sektor u kome radnici rade. Sledeom instrukcijom izmeniemo svim radnicima koji su radili u sektoru "Analiza", vrednost ovog polja u "Plan i analiza". Naredba e biti: UPDATE Radnik SET Sektor = 'Plan i analiza' WHERE Sektor = 'Analiza';

25

SQL - prirunik

Ukoliko ne navedemo ni jedan uslov, promena e se primeniti na sve slogove tabele. I na kraju, imamo naredbu DELETE, kojom briemo podatke iz tabela. Sintaksa ove instrukcije je sledea: DELETE FROM naziv_tabele WHERE uslov; Sa ovom naredbom treba paziti, jer u trenutku moete izgubiti dosta podataka. Na svu sreu mnogi sistemi za upravljanje bazama podataka podravaju tzv. transakcije, kojima izmeu ostalog moemo i oporaviti obrisane podatke. U zavisnosti od deklarisanog uslova, naredbom DELETE moemo brisati: samo jedan slog, vie slogova odjednom i sve slogove odjednom. U sledeem primeru, obrisaemo slog koji smo dodali pri objanjavanju naredbe Insert (podaci o radniku Mariu): DELETE FROM Radnik WHERE MBR = 3260;

Uskladitene procedure Koncept uskladitenih procedura (stored procedures) predstavlja jedan od najznaajnijih alatki programera i administratora baza podataka. U sutini, uskladitene procedure predstavljaju skup prevedenih SQL funkcija (instrukcija), koje su smetene (uskladitene) u samu bazu podataka. Poto su smetene u samu bazu podataka, a ne u korisnike aplikacije (na front-end kraju), ovakav skup instrukcija se bre izvrava jer se proces prevoenja instrukcija vri na SQL serveru. Uskladitene procedure uglavnom sadre logike skupove instrukcija, koji se esto upotrebljavaju. Njihovom upotrebom, programeri se oslobaaju mnogostrukih pozivanja istih komandi. Jo jednu od prednosti predstavlja to to se sve procedure nalaze na jednom mestu, a ne na vie mesta u aplikacijama (na front-end kraju), pa je njihova izmena i auriranje mnogo lake. Da kaemo i to, da je Sybase prvi upotrebio koncept uskladitenih procedura u vlastitom SQL serveru, jo daleke 1980. godine. Nakon kreiranja, skladitenja procedura i njihovih kasnijih pozivanja, SQL komande se sekvencijalno izvravaju, a rezultati obrade alju se po zavretku procedure. Na ovaj nain izbegava se i velika "guva" na mrei. Prevoenje procedura vri se pri njihovom prvom pozivanju. U sledeim redovima videemo primer jedne jednostavne uskladitene procedure:

26

SQL - prirunik

CREATE PROCEDURE PrvaProc AS SELECT * FROM Radnik WHERE Plata > 2500 GO U ovom primeru smo u proceduru dodali samo jednu SELECT instrukciju (iako ona moe da sadri veliki broj naredbi). Na osnovu ovoga, SQL server e kreirati jedan objekat koji e smestiti u odgovarajuu bazu podataka. Pozivanje uskladitene procedure i njeno izvravanje vri se preko instrukcije EXECUTE: EXECUTE PrvaProc Pozivanjem ove procedure vratie nam se podaci koji su izdvojeni SELECT naredbom. Ovo je vrlo jednostavan primer procedure, koje inae mogu biti vrlo sloene. Procedurama se mogu prosleivati parametri i promenljive, a mogu se pozivati i iz drugih procedura. Predstaviemo vam jedan primer u kome emo prvo kreirati proceduru sa parametrima, a zatim emo je izvriti sa prosleenim parametrom: CREATE PROCEDURE PrvaProc @MBR_param int AS SELECT * FROM Radnik WHERE MBR = @MBR_param Ovom procedurom selektujemo podatke o radniku iji se matini broj prosleuje: EXECUTE PrvaProc 106 Znai, pozivamo proceduru iji je naziv "PrvaProc" i prosleujemo joj matini broj radnika (106) kao parametar.

Kreiranje privremenih tabela Veina proizvoaa sistema za upravljanje bazama podataka podrava koncepciju privremenih tabela, kao i privremenih baza podataka (tempdb). Najkorieniji sistemi, kao to su Oracle ili MS SQL, podravaju ovu koncepciju. Privremene tabele se najee upotrebljavaju za skladitenje rezultata komplikovanih upita, koji su potrebni za kasnije obrade. Kao to i sam naziv govori, radi se o tabelama koje postoje samo

27

SQL - prirunik

privremeno u bazi podataka. Ovde imamo dve vrste privremenih tabela, prve egzistiraju sve do momenta dok se korisnik koji ih je kreirao ne odjavi sa SQL servera (log-out), a druga vrsta privremenih tabela se ne uklanja po odjavljivanju korisnika. Naime, sve kreirane privremene tabele, i jedne i druge vrste, e se ukloniti po odjavljivanju samog SQL servera (shut-down). Kao to smo rekli, sve privremene tabele se kreiraju u bazi podataka "tempdb", a moete kreirati i cele privremene baze podataka. Na sledeem primeru, videemo kako se kreira prva vrsta privremenih tabela - odnosno sintaksu kreiranja: CREATE TABLE #Radnik ( Ime char(20), Prezime char(20), MBR int ); Kao to vidite povisilica (#) na poetku naziva tabele predstavlja oznaku SQL serveru da se radi o privremenoj tabeli. Ovako kreirana tabela dostupna je samo onom korisniku koji je i izvrio njeno kreiranje. Meutim, vie korisnika, bez problema, moe da kreira sopstvenu privremenu tabelu sa istim nazivom. U ovom sluaju, svaki od korisnika koristi svoju privremenu tabelu, gde moe da dodaje ili brie slogove. Drugi tip privremenih tabela je onaj kod kog ne dolazi do automatskog uklanjanja tabele nakon odjavljivanja korisnika. Sada emo kreirati jednu ovakvu tabelu: CREATE TABLE tempdb..Radnik ( Ime char(20), Prezime char(20), MBR int ); Probajte sada da u ovu tabelu ubacite neki slog. Recimo, neka to bude: INSERT #Radnik VALUES ( "Pera", "Peric", 8467 ); Odjavite se sa SQL servera (log-out), pa se ponovo ulogujte i "uite" u bazu podataka koju ste koristili pri kreiranju privremene tabele. Sada pokuajte da izlistate sadraje privremene tabele sa: SELECT * FROM #Radnik ; Dobiete rezultat kao na slici.

28

SQL - prirunik

Upiti u korelaciji sa podupitima U SQL-u imamo mogunost povezivanja sadraja dve tabele na vie naina. Do sada smo u SQL prilozima videli klasino spajanje i spajanje tabela po osnovu jednakosti. Postoji jo jedan nain spajanja dve ili vie tabela, odnosno njihovog dovoenja u korelaciju. Radi primera, kreiraemo dve tabele, radi postavljanja korelacije. Prva e biti tabela "Radnik" koju emo kreirati sledeom instrukcijom: CREATE TABLE Radnik ( Ime char (15), Prezime char (20), MBR int, Sektor int ) ; Potom emo kreirati i tabelu "Sektor", koja e uvati podatke o sektorima neke fiktivne firme: CREATE TABLE Sektor ( Sektor int , NazSektora char (30)) ; Nakon kreiranja tabela, dodajte po nekoliko slogova u svaku tabelu naredbom INSERT. Potom moemo kreirati i jedan korelisani podupit (corelated subquery): SELECT * FROM Radnik AS R WHERE 'Finansije' = (SELECT NazSektora FROM Sektor S WHERE S.Sektor = R.Sektor); Ovaj korelisani podupit e dati iste rezultate (vidi sliku) kao i upit spajanja po jednakosti: SELECT Ime, Radnik, Sektor FROM Radnik AS R, Sektor AS S WHERE S.Sektor = R.Sektor S.NazSektora = 'Finansije'; Vezu izmeu ove dve tabele kod korelacije, smo uspostavili upotrebom elemenata iz upita u podupitu, tj. poredimo broj sektora iz tabele "S.Sektor" (koja se nalazi u podupitu), i broj sektora koji se nalazi u tabeli "S.Radnik" : WHERE S.Sektor = R.Sektor S obzirom da sektor iz tabele "Radnik" moe imati razliite vrednosti za svaki slog u tabeli, podupit e se izvravati za svaki slog iz upita. Kako ukloniti duplikate iz tabela?

29

SQL - prirunik

Ponekad e vam zatrebati mogunost uklanjanja dupliciranih slogova (onih koji imaju iste vrednosti nekih ili svih atributa). Uklanjanje vika istih slogova, sa zadravanjem samo jednog sloga, moe se izvriti na vie naina, a mi emo vam prikazati metod sa upotrebom jedne privremene (temporary) tabele. Za potrebe primera kreiraemo tabelu sa dva polja i dva ista sloga. Recimo, tabela "Linkovi" moe ovako da izgleda (SELECT * FROM Linkovi;): naziv URL ---------------------------------------------Krstarica www.krstarica.com Yahoo www.yahoo.com Krstarica www.krstarica.com ---------------------------------------------Da bismo uklonili ponavljanje istog sloga (Krstarica), uradiemo sledee: 1. Kreiraemo privremenu tabelu selektovanjem samo razliitih slogova osnovne tabele ("Linkovi"). 2. 3. 4. 5. CREATE TABLE Linkovi_Priv AS SELECT DISTINCT naziv, URL FROM Linkovi; Moemo proveriti stanje u novonastaloj tabeli i uveriti se da sada nema dupliciranih slogova:

6. SELECT * 7. FROM Linkovi_Priv; Rezultat e biti: naziv URL ---------------------------------------------Krstarica www.krstarica.com Yahoo www.yahoo.com ---------------------------------------------8. Vrimo brisanje osnovne tabele iz baze, instrukcijom DROP: 9. DROP TABLE Linkovi; 10. I na kraju, vrimo preimenovanje privremene tabele (Linkovi_Priv) u osnovnu (Linkovi), instrukcijom ALTER:

30

SQL - prirunik

11. ALTER TABLE Linkovi_Priv RENAME TO Linkovi; Ne zaboravite samo da ponovo kreirate sve potrebne indekse, i dozvole za rad i pristup novoj tabeli (kao na izbrisanoj originalnoj tabeli)

Funkcija COUNT SQL poseduje ugraenu funkciju za prebrojavanje podataka (slogova, n-torki) unutar baza podataka. Ova funkcija je funkcija COUNT, koja kao rezultat vraa broj slogova koji zadovoljavaju odreeni uslov. Kao argumente ove funkcije moete koristiti i doker znake, gde se prvenstveno misli na zvezdicu ("*"), te ako je upotrebite samostalno, funkcija e vratiti sve slogove koji zadovolje uslov naredbe SELECT. Sintaksa funkcije COUNT je sledea: SELECT COUNT(naziv_kolone) FROM naziv_tabele; Radi izvoenja primera, upotrebiemo sledeu tabelu "Radnik": Ime Starost ----------------------------------Hadzic, Olga 34 Skoro, Milan 45 Petric, Karlo 19 Ako biste zadali upit sa funkcijom COUNT radi prebrojavanja svih radnika (upotrebiemo zvezdicu "*"), onda bi to ovako izgledalo: SELECT COUNT(*) FROM Radnik Rezultat ovog upita bi bio "3". A ako biste recimo eleli sa prebrojimo sve radnike koji su stariji od 20 godina, upit bi mogao ovako da izgleda: SELECT COUNT(*) FROM Radnik

31

SQL - prirunik

WHERE Starost > 20; Rezultat koji e vratiti upit je "2". Treba znati i to da funkcija vraa samo broj onih slogova koji nemaju Null vrednost u navedenoj koloni (atributu). Postavimo da tabela-primer sada izgleda na drugaiji nain: Ime Starost ----------------------------------Hadzic, Olga 34 Skoro, Milan 45 Petric, Karlo Sada e upit: SELECT COUNT(*) FROM Radnik; vratiti samo broj radnika koji u koloni "Starost" imaju bar neku vrednost - rezultat e biti "2". Zato je funkcija COUNT dobrodola za potrebu pronalaenja slogova sa kolonama koje nemaju vrednosti. Pored obine funkcije COUNT, moete kreirati i upite koji e sa ovom funkcijom upotrebljavati i kljunu re DISTINCT, a, radi prebrojavanja razliitih rezultata. Sintaksa ovakvog upita je sledea: SELECT DISTINCT COUNT(kolona(e)) FROM tabela; Radi primera, kreiraemo tabelu narudbine, koja poseduje sledee slogove: Firma Br_narudz --------------------------Mega 3412 Kovac 2347 Trio 2328 Kovac 9998 --------------------------"Obini" upit izgledao bi ovako: SELECT COUNT(Firma) FROM Narudzbe;

32

SQL - prirunik

Rezultat upita bi bio - "4", prebrojale bi se sve firme u tabeli. A ako biste sada postavili sledei upit: SELECT DISTINCT COUNT(Firma) FROM Narudzbe; Rezultat upita bi bio "3", jer e se prebrojati sve razliite firme u tabeli, tj. nee se uzeti u obzir slogovi sa nazivima koji se ponavljaju. Inae, performanse izvoenja ove funkcije u radu sa velikim tabelama moete poboljati ukoliko indeksirate kolone po kojima se vri prebrojavanje.

33