Você está na página 1de 110

3.

3 Manipulisanje podacima
SQL podrava etiri manipulativna iskaza: SELECT pretraivanje INSERT umetanje UPDATE auriranje DELETE brisanje

3.3.1

Pretraivanje

Osnovni oblik iskaza pretraivanja u SQL-u SELECT lista-kolona FROM ime-tabele WHERE logiki-izraz

Logiki-izraz ukljuuje pore- enja atributa, konstanti i izraza (odgovarajueg tipa) u kojima atributi i konstante uestvuju, kao i ispitivanje pripadnosti vrednosti takvih izraza zadatom skupu. Pripadne relacijske operacije su =, <>, <, <=, >, >=, IN, BETWEEN, LIKE, IS, NULL (NOT IN, NOT BETWEEN, NOT LIKE, IS NOT NULL)

Primer 3.2 Nai ifre i statuse izdavaa iz Amerike. SELECT I_SIF, STATUS FROM I WHERE DRZAVA=Amerika Rezultat:

Imena kolona mogu se (a nekad i moraju, kao to e biti pokazano) kvalifikovati imenima tabela iz kojih potiu, pa se prethodni primer ekvivalentno zapisuje kao SELECT I.I_SIF, I.STATUS FROM I WHERE I.DRZAVA = Amerika

3.3.2Jednorelacioni upiti Dve osnovne klase jednorelacionih upita (upita nad jednom tabelom) jesu upiti - ne- kvalifikovanog pretraivanja, u kojima nema WHERE linije, pa se sve vrste tabele kandiduju za rezultat, i - upiti kvalifikovanog pretraivanja, koji sadre WHERE liniju i - kriterijum odabira vrsta.

Primer 3.3 (zadravanje duplikata) Nai ifre svih izdatih knjiga. SELECT K_SIF FROM KI

ili, ekvivalentno:
SELECT ALL K_SIF FROM KI

Primer 3.4 (eliminacija duplikata) Nai sve razliite ifre izdatih knjiga. SELECT DISTINCT K_SIF FROM KI

Primer 3.5 (pretraivanje cele tabele) Nai sve podatke o svim izdavaima. SELECT * FROM I ekvivalentno sa SELECT I_SIF, NAZIV, STATUS, DRZAVA FROM I

Rezultat izvravanja upita je kopija cele tabele I.

Primer 3.6 (skalarni izrazi u SELECT liniji) Za svaku izdatu knjigu, nai ifru izdavaa, ifru knjige, izdanje i tira izdanja u hiljadama primeraka (tira knjige u tabeli KI je u primercima). SELECT K_SIF, I_SIF, IZDANJE, Tiraz u hiljadama=, TIRAZ/1000 FROM KI

Oznake 4 i 5 umesto (nepostojeih) imena kolona uvodi sam sistem, kao redne brojeve neimenovanih kolona u relaciji koja se dobije kao rezultat rezultatu.

Sistem DB2 (kao i standard SQL2) omoguuje imenovanje kolona nastalih od izraza, pa se prethodni iskaz moe zapisati i na sledei nain: SELECT K_SIF, I_SIF, IZDANJE, Tiraz u hiljadama= AS KOMENTAR, TIRAZ/1000 AS TIRAZH FROM KI

etvrta i peta kolona rezultujue tabele sada e imati naziv KOMENTAR, TIRAZH, redom.

Kao to nekvalifikovani oblik SELECT iskaza omoguuje izbor kolona navedene tabele, navoenje logikog izraza u WHERE liniji tog iskaza omoguuje i izbor samo onih vrsta za koje je vrednost tog izraza tano. Primer 3.7 (poreenja i logike operacije u logikom izrazu) Nai ifre izdavaa iz Jugoslavije sa statusom veim od 20. SELECT I_SIF FROM I WHERE DRZAVA=Jugoslavija AND STATUS>20

Umesto uobiajenih operacija poreenja, u logikom izrazu moe se pojaviti i neka od specifinih relacijskih operacija: IN, BETWEEN, LIKE, IS NULL (NOT IN, NOT BETWEEN, NOT LIKE, IS NOT NULL).

Primer 3.8 (BETWEEN) Nai ifre izdavaa iji je status u intervalu od 15 do 30, kao i njihove statuse. Rezultat: SELECT I_SIF, STATUS FROM I WHERE STATUS BETWEEN 15 AND 30

Kao i BETWEEN, relacijska operacija IN (tj. NOT IN) je skraeni zapis za disjunkciju (OR) niza poreenja na jednakost (odnosno konjunkciju AND niza poreenja na razliitost). Primer 3.9 (IN) Nai ifre izdavaa iji je status 20 ili 30, kao i njihove statuse.
SELECT I_SIF, STATUS FROM I WHERE STATUS IN (20, 30)

Relacijska operacija LIKE (odnosno NOT LIKE) omoguuje izbor vrednosti iz date kolone (obavezno tipa CHAR(n)) na osnovu slinosti (odnosno razliitosti) sa navedenim obrascem istog tipa. Primer 3.10 (LIKE) Nai ifre izdavaa iz drava koje u imenu imaju bar jedno slovo u, kao i te drave. Rezultat: SELECT I_SIF, DRZAVA FROM I WHERE DRZAVA LIKE %u%

Relacijska operacija IS NULL (odnosno IS NOT NULL) omoguuje testiranje nedostajue (NULL) vrednosti zadatog atributa. Primer 3.11 (IS NOT NULL) Nai sve ifre izdavaa i izdanja knjige sa ifrom k1 iji je tira poznat u bazi (nema nedostajuu vrednost). SELECT I SIF, IZDANJE FROM KI WHERE K SIF = k1 AND TIRAZ IS NOT NULL

3.3.3 Upiti spajanja Spajanje tabela predstavlja mogunost istovremenog pretraivanja podataka iz vie tabela, i moe se izvesti po jednoj od operacija poreenja (=, <, <=, >, >=, <>) nad uporedivim kolonama dve tabele. Ova operacija uestvuje u izgradnji logikog izraza u WHERE liniji, a sve tabele koje uestvuju u spajanju navode se u FROM liniji. U sluaju istih imena kolona u dve tabele, njihova pojavljivanja moraju biti kvalifikovana navoenjem imena tabela iz kojih potiu, prije imena kolone. (npr. I.DRZAVA ili P.DRZAVA )

Primer 3.12 (spajanje dve tabele) Nai sve informacije o izdavaima i piscima iz iste drave.

SELECT * FROM I, P WHERE I.DRZAVA = P.DRZAVA


ekvivalentno sa: SELECT I.*, P.* FROM I, P WHERE I.DRZAVA = P.DRZAVA

Primer 3.13 Nai sve parove ifara izdavaa i ifara pisca iz iste drave, pri emu je status izdavaa vei od 20.

SELECT I.I_SIF, P.P_SIF FROM I, P WHERE I.DRZAVA = P.DRZAVA AND I.STATUS > 20

Najznaajniji oblik spajanja je prirodno spajanje koje predstavlja spajanje po relacijskoj operaciji =, ali sa izostavljanjem jedne od dve identine kolone. U SQL- u to se postie eksplicitnim navoenjem svih kolona tabela koje se spajaju, osim po jedne iz svakog para identinih kolona dobijenih pri spajanju.

Primer 3.14 (prirodno spajanje) Nai sve informacije o izdavaima i piscima iz iste drave, pri emu se drava pojavljuje samo kao jedna kolona. SELECT I SIF, NAZIV, STATUS, I.DRZAVA, P SIF, IME, BR NASLOVA FROM I, P WHERE I.DRZAVA = P.DRZAVA

Rezultat izvravanja upita je isti kao u primeru 3.12, samo bez druge kolone DRZAVA.

Primer 3.15 (spajanje n (n > 2) tabela) Nai sve parove drava takve da izdava iz prve drave izdaje knjigu pisca iz druge drave.
SELECT DISTINCT I.DRZAVA AS IDRZAVA, P.DRZAVA AS PDRZAVA FROM I, KI, KP, P WHERE I.I_SIF = KI.I_SIF AND KI.K_SIF = KP.K_SIF AND KP.P_SIF = P.P_SIF

Primer 3.16 (spajanje tabele sa samom sobom) Nai sve parove ifara izdavaa iz iste drave. Koncepcijsko reenje sastoji se u sledeem: treba posmatrati dve identine kopije tabele I ( npr. DB2 ih, naravno, ne realizuje fiziki), prvu i drugu. Sada se posmatraju svi parovi vrsta iz prve i druge kopije i odabiraju oni parovi sa jednakom dravom. Ove kopije potrebno je razliito imenovati (to je omogueno tzv. korelacionim imenom tabele u sintaksi FROM linije). SELECT PRVI.I_SIF, DRUGI.I_SIF FROM I PRVI, I DRUGI WHERE PRVI.DRZAVA = DRUGI.DRZAVA

Upotrebljeni oblik FROM linije identifikuje ime PRVI sa tabelom I, kao i ime DRUGI sa istom tabelom. Nasuprot ovom koncepcijskom reenju, u realizaciji ovakvog upita nije neophodno imati dve kopije iste tabele. Dovoljno je obezbediti mehanizam za obraanje dvema vrstama tabele I istovremeno. Taj mehanizam su dve n-torne promenljive (PRVI, DRUGI, u ovom sluaju), od kojih svaka, kao skup moguih vrednosti, ima skup vrsta tabele I, tj. u svakom trenutku izvravanja upita ima kao svoju vrednost jednu vrstu te tabele (nezavisnu od vrednosti druge n-torne promenljive).

Poto u prethodnom rezultatu ima suvinih parova (npr. (i1, i1) kao i jedan od parova (i1, i3), (i3, i1)), upit se moe dopuniti uslovom PRVI.I SIF < DRUGI.I SIF, SELECT PRVI.I_SIF, DRUGI.I_SIF FROM I PRVI, I DRUGI WHERE PRVI.DRZAVA = DRUGI.DRZAVA AND PRVI.I_SIF < DRUGI.I_SIF

3.3.4 Podupiti injenica da je rezultat izvravanja upitnog bloka nad tabelom opet tabela omoguuje ugnjedenje SELECT upitnih blokova. Podupit je SELECT upitni blok umetnut u logiki izraz WHERE linije drugog SELECT upitnog bloka (ili iskaza auriranja). Svojstvo ugnjedenja SELECT upitnih blokova je osnovno svojstvo na kome je SQL utemeljen.

Podupit se koristi za: predstavljanje pojedinane vrednosti koja uestvuje u operaciji poreenja; predstavljanje skupa vrednosti ija se nepraznost ispituje primenom EXISTS (NOT EXISTS) kvantifikatora, koji se pretrauje IN (NOT IN) relacijskom operacijom, ili koji se kvantifikuje kvantifikatorima SOME, ANY ili ALL i zatim uestvuje u operaciji poreenja. Ugnjedenje blokova moe biti viestruko, ali u gotovo svim primenama na realne probleme ugnjedenje do nivoa 3 zadovoljava. Ugnjedeni SELECT upitni blok se, po pravilu, moe zameniti upitom spajanja, ije je izvrenje esto efikasnije.

Primer 3.17 (relacijska operacija IN) Nai nazive izdavaa koji izdaju knjigu sa ifrom k6.

SELECT I.NAZIV FROM I WHERE I.I_SIF IN (SELECT KI.I_SIF FROM KI WHERE KI.K_SIF=k6)

Prethodni iskaz ekvivalentan sledeem iskazu (tj. ima identian rezultat kao i predhodni iskaz):

SELECT NAZIV FROM I WHERE I_SIF IN (SELECT I SIF FROM KI WHERE K_SIF=k6)

Isti upit moe se formulisati i upotrebom operacije spajanja, bez podupita: SELECT I.NAZIV FROM I, KI WHERE I.I_SIF = KI.I_SIF KI.K_SIF = k6

AND

Primer 3.18 (podupit i spoljanji upit nad istom tabelom) Nai ifre izdavaa koji izdaju bar jednu knjigu koju izdaje i izdava sa ifrom i3. SELECT DISTINCT I_SIF FROM KI WHERE K_SIF IN (SELECT K_SIF FROM KI WHERE I_SIF=i3) Rezultat I_SIF i3 i4

Primer 3.19 (viestruki nivo ugnjedenja) Nai nazive izdavaa koji izdaju bar jedan roman. SELECT I.NAZIV FROM I WHERE I.I_SIF IN (SELECT KI.I_SIF FROM KI WHERE KI.K_SIF IN (SELECT K.K_SIF FROM K WHERE K.OBLAST=roman))

Primer 3.20 (operacija poreenja) Nai ifre izdavaa iz iste drave kao izdava sa ifrom i1. Rezultat: SELECT I_SIF I_SIF FROM I I1 WHERE DRZAVA = i3 (SELECT DRZAVA i4 FROM I WHERE I_SIF=i1) Ovakvi podupiti iji nekvantifikovani rezultat uestvuje u operaciji pore enja opravdani su samo kada se unapred zna da rezultat podupita sadri najvie jedan element.

Korienje podupita iji rezultati sadre vie od jednog elementa, ali im kvantifikatori SOME, ANY, ALL, omoguuju uestvovanje u operaciji poreenja (tzv. kvantifikovano poreenje). Primer 3.21 (kvantifikovano poreenje kvantifikator SOME) Nai nazive izdavaa koji izdaju knjigu sa ifrom k6 SELECT NAZIV FROM I WHERE I_SIF = SOME(SELECT I_SIF FROM KI WHERE K_SIF=k6) Parafraza ovog iskaza je da se trae nazivi onih izdavaa ija je ifra jednaka sa NEKOM (SOME) ifrom izdavaa koji izdaje knjigu sa ifrom k6. Isto je znaenje i kvantifikatora ANY.

Rezultat: NAZIV Djeije novine

Primer 3.22 (kvantifikovano poreenje kvantifikator ALL) Nai sve informacije o izdanjima iji je tira manji od svakog tiraa izdanja izdavaa sa ifrom i1. SELECT * FROM KI WHERE TIRAZ <ALL (SELECT TIRAZ FROM KI WHERE I_SIF=i1)

3.3.5

Korelisani podupiti

Pored strukture upita u kojoj se podupit izvrava samo jedanput pri jednom izvravanju celog upita, mogua je struktura u kojoj podupit zavisi od tabele iz FROM linije spoljanjeg upita (tj. sadri n-tornu promenljivu koja odgovara ovoj tabeli). Tada se podupit mora izvriti za svaku vrstu tabele iz spoljanjeg upita, da bi se utvrdilo da li se ta vrsta kvalifikuje za rezultat celog upita ili ne.

Primer 3.23 Isti upit kao u primeru 3.17 (nai nazive izdavaa koji izdaju knjigu sa ifrom k6) moe se preformulisati tako da ukljui korelisani podupit na sledei nain: SELECT I.NAZIV FROM I WHERE k6 IN (SELECT KI.K_SIF FROM KI WHERE KI.I_SIF=I.I_SIF) Ako pretraeni skup ifara knjiga K_SIF sadri ifru k6, posmatrana vrsta tabele I se dalje obrauje i izdaje se vrednost njene kolone NAZIV; postupak se ponavlja za sledeu vrstu tabele I.

Analogna forma upita odgovara i sluaju kada se korelisani podupit i spoljanji upitni blok odnose na istu tabelu. Primer 3.24 Nai ifre svih knjiga koje izdaje vie od jednog izdavaa. SELECT DISTINCT KIX.K_SIF FROM KI KIX WHERE KIX.K_SIF IN (SELECT KIY.K_SIF FROM KI KIY WHERE KIY.I_SIF <> KIX.I_SIF)

3.3.6

Egzistencijalni kvantifikator

U SQL-u, egzistencijalno kvantifikovani logiki izraz je oblika EXISTS (SELECT . . . FROM . . . ) (odnosno NOT EXISTS (SELECT . . . FROM . . . )). Ovaj izraz izraunavanjem dobija vrednost tano ako i samo ako je rezultat podupita pred- stavljenog konstrukcijom SELECT . . . FROM . . . neprazan (odnosno prazan).

Primer 3.25 Nai nazive izdavaa koji izdaju knjigu sa ifrom k3. SELECT I.NAZIV FROM I WHERE EXISTS (SELECT * FROM KI WHERE KI.I_SIF = I.I_SIF AND KI.K_SIF = k3) Ovaj iskaz nalazi nazive svih izdavaa za koje postoji vrsta u tabeli izdavatva (KI) sa istom ifrom izdavaa i ifrom knjige k3. Na primer, prva vrsta tabele I ima naziv izdavaa Prosveta i ifru izdavaa i1. U tabeli KI postoji vrsta sa ifrom izdavaa i1 i ifrom knjige k3, pa je Prosveta jedan (i jedini) od naziva koji se pojavljuju u rezultatu.

Primer 3.26 Nai nazive izdavaa koji izdaju sve knjige Branka opia. Da bi se pojednostavio upit, izdvojmo prvo sve knjige Branka opia u virtuelnu tabelu pogled K_BC sledeim SQL iskazom: CREATE VIEW K_BC AS (SELECT * FROM K WHERE K_SIF IN (SELECT K_SIF FROM KP WHERE P_SIF = (SELECT P_SIF FROM P WHERE IME = Branko opi)))

Sada se nalaenje naziva izdavaa koji su izdali sve knjige Branka opia moe izraziti sledeim SQL iskazom: SELECT I.NAZIV FROM I WHERE NOT EXISTS (SELECT FROM K_BC WHERE NOT EXISTS (SELECT FROM KI WHERE KI.I_SIF=I.I_SIF AND KI.K_SIF=K_BC.K_SIF))

3.3.7 Agregatne funkcije Za razliku od skalarnih funkcija , iji je argument skalarna vrednost, tj. jedna vrednost iz jednog domena, agregatne funkcije preslikavaju skup vrednosti jedne kolone (obino izvedene tabele) u skalarnu vrednost. Pod izvedenom tabelom ovde se podrazumeva rezultat primene logikog izraza iz WHERE linije na tabele iz FROM linije.

SQL podrava irok spektar skalarnih funkcija, od konverzionih (npr. funkcija za pretvaranje celobrojnog ili realnog tipa u decimalni tip, DECIMAL, za pre tvaranje brojevnih tipova u znakovni tip, realni tip dvostruke tanosti ili celobrojni tip DIGITS, FLOAT, INTEGER, redom), preko optih (npr. funkcija koja vraa duinu podatka u bajtovima LENGTH) i aritmetikih (ABS, TAN, SQRT, TRUNC), do funkcija za obradu znakovnih podataka (npr. SUBSTR vraa podnisku niske, navedene duine, od pozicije kao poetka,

ili POSSTR vraa poziciju prvog pojavljivanja jedne niske u drugoj), kao i druge funkcije vezane za specifine tipove odreenog sistema (npr. TIME, YEAR, CHAR, DATE, DAY nad podacima tipa TIME, DATE, TIMESTAMP). Poziv skalarne funkcije moe se navesti kao operand u izrazu odgovarajueg tipa.

Primer 3.27 Izdati nazive izdavaa i nazive njihovih drava prevedene na engleski jezik. Iskaz kojim se realizuje ovaj upit ilustrovae skalarnu funkciju SUBSTR i mogunost SQL-a sistema DB2 u selektivnoj dodeli vrednosti skalarnom izrazu tabele- rezultata. SELECT NAZIV, CASE SUBSTR(DRZAVA,1,1) WHEN J THEN Yugoslavia WHEN A THEN USA WHEN E THEN UK END AS DRZAVA_ENG FROM I

SQL podrava agregatne funkcije COUNT, SUM, AVG, MAX i MIN, sa sledeim znaenjem:

COUNT broj vrednosti u koloni SUM zbir vrednosti u koloni AVG srednja vrednost u koloni MAX najvea vrednost u koloni MIN najmanja vrednost u koloni.

Agregatna funkcija se poziva tako to se navede njeno ime sa argumentom imenom kolone u zagradi. Poziv agregatne funkcije moe se nai u SELECT liniji bilo glavnog bilo ugnjedenog upita. Ako se takav poziv navede, odgovarajua SELECT linija mora se sastojati samo od takvih poziva (izuzetak su upiti koji ukljuuju GROUP BY liniju, taku 3.3.8). Poziv agregatne funkcije ne moe se nai u WHERE liniji upita.

Upitni jezik SQL Argument za funkcije SUM i AVG mora biti kolona brojevnih vrednosti. Argumentu moe da prethodi rezervisana re DISTINCT, koja ukazuje na eliminaciju duplikata u koloniargumentu pre primene funkcije, ili rezervisana re ALL (to se i podrazumeva) kada se funkcija primenjuje na sve vrednosti u koloni, ukljuujui i duplikate.

Agregatna funkcija COUNT mora imati DISTINCT opciju (da nema brojanja duplih vrijednost u kolonama) ispred argumenta, osim u svom specijalnom obliku COUNT() kojim se prebrojavaju vrste (a ne vrednosti kolone) koje zadovoljavaju zadati logiki uslov; ovaj oblik agregatne funkcije COUNT ne dozvoljava navoenje DISTINCT opcije i podrazumeva opciju ALL.

Za sve agregatne funkcije (osim COUNT()) vai da se primenjuju samo na ne- NULL vrednosti kolone argumenta iz onih vrsta odgovarajue tabele koje zadovoljavaju logiki uslov WHERE linije upita;
agregatna funkcija COUNT() primenjuje se na sve vrste koje zadovoljavaju zadati uslov. Argument agregatne funkcije moe biti i izraz u kome uestvuje kolona (npr. TIRAZ/1000), ali samo kada opcija DISTINCT nije navedena.

Primer 3.28 (COUNT) Nai ukupan broj izdavaa koji su izdali bar po jednu knjigu.

SELECT COUNT(DISTINCT I SIF) FROM KI


Rezultat:

Primer 3.29 (COUNT()) Nai broj izdanja knjige sa ifrom k6. SELECT COUNT() FROM KI WHERE KI.K SIF=k6

Rezultat:
2

Primer 3.30 (SUM) Nai ukupni tira knjige sa ifrom k6 (svih izdanja svih izdavaa).

SELECT SUM(TIRAZ) FROM KI WHERE KI.K SIF=k6


Rezultat:

8000

Primer 3.31 (MAX) Nai ifre izdavaa iji je status nii od maksimalnog statusa u I tabeli.

SELECT I.I_SIF FROM I WHERE STATUS < (SELECT MAX(STATUS) FROM I)

Primer 3.32 (AVG) Nai ifru, status i dravu izdavaa iji je status vii ili jednak prosenom statusu izdavaa iz te drave (ovo je ujedno i primer agregatne funkcije u korelisanom podupitu). SELECT IX.I SIF, IX.STATUS, IX.DRZAVA FROM I IX WHERE IX.STATUS >= (SELECT AVG(STATUS) FROM I IY WHERE IY.DRZAVA = IX.DRZAVA)

3.3.8 Operator grupisanja Na jednostavni SELECT upitni blok mogue je primeniti i operator grupisanja GROUP BY ime-kolone
koji preureuje (logiki) tabelu iz FROM linije u particije ili grupe tako da unutar jedne grupe sve vrste imaju istu vrednost u koloni iz GROUP BY operatora. Takoe vai i da su sve vrste tabele sa istom vrednou kolone iz GROUP BY operatora u jednoj grupi. Za potrebe grupisanja, sve NULL vrednosti u koloni iz GROUP BY operatora tretiraju se kao jednake. SELECT linija se sada primenjuje na svaku grupu, a ne na svaku vrstu tabele.

Primer 3.33 Za svaku izdatu knjigu, nai ifru knjige i ukupni tira u kome je izdata. SELECT K_SIF, SUM(TIRAZ) FROM KI GROUP BY K_SIF

Svaki izraz u SELECT liniji mora biti singlton (jednolan skup) za svaku grupu, tj. mora biti jedna od kolona iz GROUP BY operatora, konstanta ili agregatna funkcija nad svim vrednostima neke kolone unutar te grupe. Ukoliko se agregatna funkcija javlja u SELECT liniji upita u kome se ne primenjuje GROUP BY operator na istom nivou ugnjedenja, ta linija ne sme da sadri ime kolone, konstantu ili izraz.

Ukoliko u SELECT upitnom bloku postoji WHERE linija, vrste koje ne zado- voljavaju logiki izraz iz WHERE linije eliminiu se pre bilo kakvog grupisanja. Primer 3.34 Za svaku knjigu, nai ifru knjige i maksimalni tira izdanja te knjige, iskljuujui izdanja izdavaa sa ifrom i1. SELECT K_SIF, MAX(TIRAZ) FROM KI WHERE I_SIF <> i1 GROUP BY K_SIF

Kvalifikovano grupisanje. Kao to pretraivanje vrsta tabele SELECT upitnim blokom moe biti kvalifikovano WHERE logikim izrazom kojim se biraju odnosno eliminiu vrste tabele iz FROM linije, tako i pretraivanje grupa dobijenih GROUP BY operatorom moe biti kvalifikovano primenom logikog izraza kojim se biraju one grupe na koje e se SELECT linija primenjivati, odnosno eliminiu ostale grupe. Taj novi logiki izraz zadaje se operatorom HAVING logiki-izraz Izrazi koji uestvuju u logikom izrazu HAVING operatora moraju imati jedinstvenu vrednost po grupi.

Primer 3.35 Nai ifru knjige za svaku knjigu koja ima vie izdanja: SELECT K_SIF FROM KI GROUP BY K_SIF HAVING COUNT(*) > 1 Ili SELECT K_SIF FROM K WHERE 1 < (SELECT COUNT (*) FROM KI WHERE K SIF=K.K_SIF)

3.3.9 Puni upitni blok Pored osnovnog oblika iskaza pretraivanja SQL-a sa strukturom jednostavnog upitnog bloka koja ukljuuje sve dosad pomenute mogunosti, iskaz pretraivanja moe imati i oblik punog upitnog bloka. Neformalno, puni upitni blok se dobija primenom (0 ili vie) skupovnih operacija unije, preseka i/ili razlike na jednostavne ili druge pune upitne blokove.

Mogunost primene skupovnih operacija na upitne blokove posledica je injenice da je rezultat izvravanja svakog upitnog bloka (izvedena) relacija tj. skup skup vrsta. Operacije unije (UNION), preseka (INTERSECT) i razlike (EXCEPT) u SQL-u se mogu primenjivati samo na unijski kompatibilne. Ako su odgovajujue kolone jednako imenovane, kolona tabele-rezultata nasleuje to ime. U suprotnom, kolona rezultujue tabele je neimenovana (tj. dobija sistemski generisano ime).

Primer 3.36 Nai ifre knjiga koje su romani ili ih izdaje izdava sa ifrom i2 (ili za koje vae oba uslova).

SELECT K_SIF FROM K WHERE OBLAST = roman UNION SELECT K_SIF FROM KI WHERE I_SIF = i2

Primer 3.37 Nai nazive drava u kojima su registrovani i izdavai i pisci (presjek). SELECT DRZAVA FROM I INTERSECT SELECT DRZAVA FROM P

Ako se u ovom primeru operacija INTERSECT zada sa opcijom ALL (INTER- SECT ALL), u rezultatu e se dobiti i ponovljene vrednosti:

SELECT DRZAVA FROM I INTERSECT ALL SELECT DRZAVA FROM P

Primer 3.38 Izdati nazive drava u kojima su registrovani pisci ali ne i izdavai (razlika). SELECT DRZAVA FROM P EXCEPT SELECT DRZAVA FROM I

Pri viestrukoj primeni skupovnih operacija, redosled njihovog izvravanja je sleva nadesno (odozgo nanie), pri emu operacija preseka (INTERSECT) ima prioritet. Redosled izvrenja se moe zagradama menjati. Puni upitni blok, pa prema tome i skupovne operacije UNION, INTERSECT, EXCEPT, mogu se primeniti i u podupitima iskaza pretraivanja, ali i u drugim iskazima SQL-a npr. u iskazu za kreiranje pogleda ili iskazima za unoenje, brisanje i auriranje.

3.3.10

Operator ureenja i operator WITH

Kompletni iskaz pretraivanja SELECT iskaz, pored strukture jednostavnog i punog upitnog bloka, moe imati i dodatne operatore operator ureenja po vrednostima izabranih kolona rezultujue tabele (ORDER BY)

Primer 3.39 (pretraivanje sa ureenjem) Prikazati ifre i statuse izdavaa u opadajuem redosledu statusa.

SELECT I_SIF, STATUS FROM I ORDER BY STATUS DESC

Ureenje se moe zadati na isti nain kao u CREATE INDEX iskazu. Osim opadajueg (DESC ) koji se obavezno navodi, mogu je i rastui poredak (ASC) koji se i podrazumeva pa ga netreba navoditi. Kolone u ORDER BY liniji (moe ih biti vie) mogu se identifikovati i svojim rednim brojevima (sleva nadesno u rezultujuoj tabeli) umesto imenima; ako je kolona neimenovani skalarni izraz, ona se mora identifikovati svojim rednim brojem.

Primer 3.40 Ureenje tabele iz primera 3.6 u rastuem poretku ifara izdavaa unutar rastuih tiraa u hiljadama postie se SELECT iskazom SELECT K_SIF, I_SIF, IZDANJE, Tiraz u hiljadama =, TIRAZ/1000 FROM KI ORDER BY 5, I_SIF

3.3.11

Nain izvravanja SELECT iskaza

SELECT iskaz koji ne sadri skupovne operacije UNION, INTERSECT, EXCEPT, moe biti dosta sloen, i moe da ukljui sledee linije, obavezno u navedenom redosledu: SELECT ... FROM ... WHERE ... GROUP BY HAVING ... ORDER BY

... ...

3.3.13 Unoenje Nove vrste se unose u tabelu iskazom INSERT ija sintaksa ima jedan od sledea dva oblika:

INSERT INTO ime-tabele [( ime-kolone {,ime-kolone})] VALUES ( konstanta {,konstanta})


ili INSERT INTO puni upitni blok ime-tabele [( ime-kolone {,ime-kolone})]

U kolone koje nisu navedene unose se NULL (odnosno podrazumevane) vrednosti ako kolona nije definisana kao NOT NULL kolona; pod istim uslovom vrednost NULL moe se i eksplicitno navesti kao konstanta. Ako se imena kolona ne navedu, vrednosti se dodeljuju kolonama u redosledu definisanom tabelom. U oba sluaja, takoe, za svaku vrstu koja se unosi mora biti obezbeena vrednost u svakoj NOT NULL koloni koja nije podrana DEFAULT opcijom.

Primer 3.42 Dodati tabeli K knjigu sa ifrom k7, sa naslovom arobna uma i sa trenutno nepoznatom oblau. INSERT INTO K (K SIF, NASLOV) VALUES (k7, arobna uma) Uneta vrsta ima nedostajuu (NULL) vrednost u koloni OBLAST. Isti efekat proizvodi i sledei iskaz: INSERT INTO K (K SIF, NASLOV, OBLAST) VALUES (k7, arobna uma, NULL)

Operacijom unoenja moe da bude naruen neki od uslova integriteta baze podataka, pri emu takvu operaciju sistem odbija da izvri. Primer 3.43 Iskaz INSERT INTO KI (K_SIF, I_SIF, IZDANJE, TIRAZ) VALUES (k20, i20, 3, 10000) bio bi odbijen, jer bi se njegovim izvravanjem realizovalo unoenje vrste u tabelu izdanja KI, koja se odnosi na izdavaa (i20) koji nije poznat u tabeli izdavaa I (i na knjigu k20 koja nije poznata u tabeli knjiga K); time bi bio naruen referencijalni integritet

Primer 3.44 Uneti u tabelu KI KOPIJA vrste tabele KI koje se odnose na iz- davae i1 i i2. Tabela KI_KOPIJA moe da se kreira prema obrascu tabele KI (analognim CREATE TABLE iskazom), sa istim kolonama kao i tabela KI. Izvravanjem sledeeg iskaza, u tabelu KI_KOPIJA unosi se odgovarajui sadraj:

INSERT INTO KI_KOPIJA SELECT K_SIF, I_SIF, IZDANJE, TIRAZ FROM KI WHERE I_SIF IN (i1, i2)

Tabeli se mogu dodati i vrste koje su rezultat operacije spajanja dve ili vie tabela, kao to pokazuje sledei primer: Primer 3.45 Kreirati tabelu IP_DRZAVA sa kolonama I SIF, P SIF, DRZAVA i uneti u tu tabelu sve parove ifara izdavaa i pisaca iz iste drave, kao i odgovarajue drave. CREATE TABLE IP_DRZAVA (I_SIF CHAR(6) NOT NULL, P_SIF CHAR(6) NOT NULL, DRZAVA CHAR(20), PRIMARY KEY (I SIF,P SIF)); INSERT INTO IP_DRZAVA SELECT I_SIF, P_SIF, I.DRZAVA FROM I, P WHERE I.DRZAVA = P.DRZAVA

3.3.14

Auriranje

Za auriranje u uem smislu, tj. za izmenu postojeih vrednosti u tabeli, koristi se UPDATE iskaz. Sintaksa iskaza ima oblik:

UPDATE ime-tabele [ ime n-torne promenljive] SET ime-kolone = izraz {,ime-kolone = izraz} [ WHERE logiki-izraz ]

Primer 3.47 Uveati tirae svih izdanja izdavaa i3 za 10%. UPDATE KI SET TIRAZ = TIRAZ * 1.1 WHERE I_SIF=i3

Ako pri izvravanju UPDATE iskaza doe do greke, izvravanje se obustavlja. Pri tome ni jedna vrsta tabele nije promenjena, odnosno ako su promene nad nekim vrstama ve izvrene, bie ponitene. Do greke moe doi, na primer, u sluaju da je nova vrednost suvie velika za datu kolonu, s obzirom na definiciju te kolone. Izvravanje UPDATE iskaza moe da bude odbijeno i u sluaju da se njime naruava referencijalni integritet.

Primer 3.48 Zahtev za izvrenje iskaza UPDATE KI SET I_SIF = i6 WHERE I_SIF = i4

bie odbijen, jer vrednost i6 ne postoji u tabeli I u kojoj je kolona I_SIF primarni klju.

3.3.15 Brisanje Za brisanje vrsta iz tabele upotrebljava se iskaz oblika DELETE FROM ime-tabele [ ime n-torne promenljive] [ WHERE logiki-izraz ] Izvravanjem ovog iskaza iz tabele ime-tabele briu se sve vrste te tabele koje zadovoljavaju logiki izraz. Vrste se briu u celosti (nije mogue izbrisati samo neke vrednosti iz date vrste). Ako se WHERE linija ne navede, briu se sve vrste navedene tabele. Tabela moe biti i pogled, pri emu se vrste briu iz bazne tabele nad kojom je pogled definisan.

Primer 3.50 Izbrisati iz tabele KI sva izdanja izdavaa i4. DELETE FROM KI WHERE I_SIF=i4 Izvravanjem ovog iskaza iz tabele KI brie se jedna vrsta. Ako za vreme izvravanja DELETE iskaza doe do greke, izvravanje iskaza se prekida. Sadraj tabele nee biti promenjen. Greka moe biti, na primer, rezultat naruenog referencijalnog integriteta.

Ako tabela iz koje se brie ima primarni klju koji je strani klju drugih tabela, DELETE iskaz se izvrava prema navedenim pravilima brisanja u definiciji stranih kljueva zavisnih tabela. Operacija brisanja definisana DELETE iskazom e biti uspena samo ako su pravila brisanja svih zavisnih tabela zadovoljena. Pravila brisanja (DELETE RESTRICT, DELETE CASCADE, DELETE SET NULL)

Korelisani podupit u auriranju u brisanju. U WHERE liniji DELETE (UPDATE) iskaza moe se primeniti i korelisani podupit koji se izvrava po jedan put za svaku vrstu tabele iz DELETE (UPDATE) iskaza, da bi se odredilo da li se ta vrsta brie (aurira) ili ne.

Primer 3.51 Izbrisati izdavae koji izdaju knjigu sa ifrom k3. DELETE FROM I WHERE k3 IN (SELECT KI.K_SIF FROM KI WHERE KI.I_SIF = I.I_SIF)

3.6

Autorizacija i prava korisnika baze podataka

Da bi baza podataka mogla bezbedno i efikasno da se koristi, svaki korisnik mora imati autorizaciju (engl. authorization) za pristup sistemu za upravljanje bazama podataka, tj. svakom korisniku mora da bude dodeljeno korisniko ime kojim se predstavlja tom sistemu. Pored ovog, prvog nivoa sigurnosti baze, SUBP obino podrava i vie nivoe bezbednosti. Na primer, razliitim korisnicima ili grupama korisnika moe se omoguiti da obavljaju razliite opte zadatke nad bazama podataka, kao to su povezivanja sa bazom, kreiranje tabela ili administriranje sistema. Za korisnike se tada kae da se razlikuju po nivoima autorizacije.

Nivo autorizacije dodeljuje se korisniku eksplicitno. Pravo (ili skup prava) na odreenom objektu baze podataka korisniku se moe dodeliti eksplicitno ili implic- itno. Za eksplicitnu dodelu koristi se SQL iskaz GRANT ija je sintaksa oblika GRANT lista-prava ON objekat TO lista-korisnika

Na primer, jedno pravo nad bazom podataka je CONNECT (pristup bazi), ALTER (promena) nad tabelom i indeksom, DELETE (pravo brisanja slogova), SELECT (pravo postavljanja upita).

Da bi se korisniku kome se dodeljuje pravo nad jednim objektom omoguilo da to pravo prenese na treeg korisnika (prenosivo pravo), ono se mora dodeliti GRANT iskazom sa opcijom WITH GRANT OPTION. Na primer, korisniku STUDENT mogu se dodeliti prava itanja i unosa u tabelu tabela, sa pravom da ta prava prenese, iskazom GRANT SELECT, INSERT ON tabela TO USER STUDENT WITH GRANT OPTION

Prethodno dodeljeno (implicitno ili eksplicitno) pravo nad pojedinim tipovima objekata u bazi podataka moe se oduzeti korisniku SQL iskazom REVOKE oblika REVOKE lista-prava ON FROM lista-korisnika. Na primer, REVOKE SELECT, INSERT ON FROM STUDENT tabela objekat

Você também pode gostar