baze podataka - sql
DESCRIPTION
SQL, Oracle,TRANSCRIPT
BAZE PODATAKA
SQL – Structured Query Language
UVOD
SQL = Structured Query Languagestrukturirani upitni jezik za rad s BPstandardni jezik za rad s relacijskim BPtvorac je Chamberlin, a nastao je u IBM-ovom istraživačkom laboratoriju 1974.g. (na istom mjestu gdje je Codd 1970. definirao osnovne koncepte relacijskog modela podataka)
ZAŠTO TREBA ZNATI SQL?
u literaturi o relacijskim BP često se ne objašnjava SQL, nego se koristi kao standard pomoću kojeg se objašnjavaju drugi koncepti relacijskih BP
SQL je implementiran u više od 50 komercijalno raspoloživih SUBP relacijskog tipa (DB2, SQL/DS, ORACLE,…) i znajući SQL moguće je na gotovo identičan način raditi s bilo kojim od njih.
ORACLE
ORACLE je relacijski sustav za upravljanje bazom podataka sa SQL upitnim jezikokm
proizvodi ga Oracle Corporation iz Belmonta u Californii
server Oracle 9i
client Oracle 8.1.7.
OSNOVNE KARAKTERISTIKE SQL-a
jednostavnost i jednoobraznost u korištenju – tablica (relacija) se kreira jednom izvršnom naredbom i odmah nakon kreiranja tablica je raspoloživa za korištenje
mogućnost interaktivnog i klasičnog (aplikativnog) programiranja – koristeći SQL dobivaju se odgovori na trenutne, unaprijed nepredviđene zahtjeve ili se SQL blokovi ‘ugrađuju’ u klasični viši programski jezik omogućujući klasičnu obradu
neproceduralnost (tj. minimalna proceduralnost) –SQL je u velikoj mjeri neproceduralan jer definira ŠTO, a ne KAKO: koji podaci se žele, koje tablice se referenciraju i koji uvjeti trebaju biti ispunjeni, bez specifikacije procedure za dobivanje željenih podataka.
SQL kao jezik objedinjuje
jezik za opis podataka (DDL = Data Definition Language) – definiranje sheme BP, tj. kreiranje objekata
jezik za rukovanje podacima (DML = Data Manipulation Language) – traženje, unos, izmjena, brisanje
jezik za upravljanje podacima (DCL = Data Control Language) – kontrola pristupa podacima, tj. dodjeljivanje i ukidanja prava
DDL – kreiranje nove tablice
CREATEopći oblik naredbe je:
CREATE TABLE ime_tablice (atr1 tip [not null], atr2 tip [not null],
… )
Primjer: kreirati relaciju STUDENT s atributima MBROJ, IME, PREZIME, DATRODJ.
PRIMJER
Rješenje: CREATE TABLE STUDENT(MBROJ NUMBER NOT NULL,
IME VARCHAR(10),PREZIME VARCHAR(20),DATRODJ DATE);
Primjetimo: nismo definirali primarni ključ (not null <> primarni ključ)!
U SQL-u uloga ključa se može iskazati formiranjem jedinstvenog indeksa nad kombinacijom polja koja čine primarni ključ.
DDL – promjena tablice
ako želimo dodati novi atribut u postojeću tablicu naredba je:
ALTER TABLE ime_tablice ADD (atr tip [, ATR TIP])
Primjer: dodati atribut ADRESA u relaciju STUDENT.
Rješenje: ALTER TABLE STUDENT ADD (ADRESA VARCHAR(30));
DDL – promjena tablice
ako želimo izmijeniti definiciju postojećeg atributa (dužina, tip, not null) u postojećoj tablici naredba je:
ALTER TABLE ime_tablice MODIFY (atr modifikacija)
Primjer: povećati dužinu atributa IME na 15.
PRIMJER
Rješenje: ALTER TABLE STUDENT MODIFY (IME VARCHAR(15));
Napomena:dodavanje novog polja s opcijom NOT NULL postojećoj tablici koja nije prazna nije moguće direktno izvršiti (najprije treba naredbom ALTER TABLE … ADD … dodati novo polje bez klauzule NOT NULL, zatim dodati vrijednost za novo polje za sve n-torke i tek na kraju naredbom ALTER TABLE … MODIFY … treba dodati klauzulu NOT NULL prethodno definiranom polju
DML – unos podataka (1)Ubacivanje vrijednosti SVIH atributa n-torke:
INSERT INTO naziv_tablice VALUES (vrijednost_atr1, vrijednost_atr2,…)
Primjer: ubaciti u tablicu podatke o studentu Marku Periću, koji je rođen 25.01.1985., nepoznata mu je adresa i
ima matični broj 43323. Ubacite još nekoliko studenata.
Rješenje: INSERT INTO STUDENT VALUES (43323, ‘Marko’, ‘Perić’, ‘25011985’, NULL);
Rezultat INSERT naredbe: SELECT * FROM STUDENT;
DML – unos podataka (2)
Ubacivanje vrijednosti NEKIH atributa n-torke:
INSERT INTO naziv_tablice (ATR1, ATR2, …)VALUES (vrijednost_atr1, vrijednost_atr2,…)
Primjer: ubaciti u tablicu podatke o studentu Lovri Antiću s matičnim broj 35666.
Rješenje: INSERT INTO STUDENT (IME, PREZIME, MBROJ) VALUES ( ‘Lovro’, ‘Antić’, 35666);
Rezultat INSERT naredbe: SELECT * FROM STUDENT;
DML – unos podataka (3)
Ubacivanje podataka iz jedne tablice u drugu:Ako obje tablice imaju isti broj atributa i ukoliko su oni identično definirani naredba INSERT je oblika:
• INSERT INTO naziv_tablice1 SELECT * FROM naziv_tablice2
Inače:
• INSERT INTO naziv_tablice1 (atr1, atr2,…)SELECT atribut, izrazFROM naziv_tablice2WHERE kriterij selekcije
DML – izmjena podataka
Opći oblik naredbe je:
• UPDATE naziv_tablice SET atribut1=izraz1[, atribut2=izraz2] [WHERE kriterij selekcije n-torki]
odnosno
• UPDATE naziv_tablice SET (atribut1, atribut2, …) =(podupit) [WHERE kriterij selekcije n-torki]
PRIMJER
Studentu Marku promijenite adresu u Omladinska 14.
Rješenje: UPDATE STUDENTSET ADRESA=‘Omladinska 14’WHERE IME=‘Marko’;
DML – brisanje podataka
Opći oblik naredbe je:
• DELETE [FROM] naziv_tablice [WHERE kriterij selekcije n-torki]
Primjer: izbaciti podatke o Marku jer je diplomirao.
Rješenje: DELETE FROM STUDENTWHERE IME=‘Marko’;
DDL – izbacivanje relacije iz BP
ako želimo izbaciti definiciju tablice, zajedno s podacima koje sadrži naredba je:
DROP TABLE ime_tablice
Napomena:različit rezultat naredbi DROP TABLE i DELETE(DELETE može izbrisati kompletan sadržaj tablice, ali sama tablica ostaje u BP i s njom se može dalje raditi).
DDL – INDEKSI
Indeksi se koriste za:osiguravanje brzog pristupa po poljima koja se indeksirajuosiguravanje jedinstvenosti za vrijednosti indeksiranih kolona (tada te indeksirane kolone imaju ulogu primarnog ključa)
Opći oblik naredbe je:
CREATE [UNIQUE] INDEX naziv_indeksaON ime_tablice (atr [, atr,…])
PRIMJER
Kreirati indeks nad prezimenom i imenom studenta, te jedinstveni indeks nad matičnim brojem
Rješenje: CREATE INDEX PREZ_INDON STUDENT (PREZIME, IME);
CREATE UNIQUE INDEX MBROJ_INDON STUDENT (MBROJ);
Indeks se izbacuje naredbom:
DROP INDEX naziv_indeksa
DCL – dodjeljivanje i oduzimanje prava
korištenja vlastitih tablica drugim korisnicima BP Opći oblik naredbe za dodjeljivanje prava je:
GRANT {ALL | [ALTER, DELETE, INDEKS, INSERT, SELECT, UPDATE(atr)]}
ON [kreator.]{tablica | pogled}TO {PUBLIC | korisnik1, korisnik2,…}[WITH GRANT OPTION]
Opći oblik naredbe za oduzimanje prava je:
REVOKE {ALL | [ALTER, DELETE, INDEKS, INSERT, SELECT, UPDATE(atr)]}
ON [kreator.]{tablica | pogled}FROM {PUBLIC | korisnik1, korisnik2,…}
Pogled - VIEW
Što je pogled?pogled je ‘prozor’ kroz koji se vide podaci BPpogled je virtualna tablica - s njom se radi gotovo kao s baznom tablicom, iako nema svoje podatke i ne zauzima nikakav memorijski prostorpreciznije, pogled se koristi kao bilo koja druga tablica pri izvješćivanju
Zašto koristiti pogled?jednostavnost korištenja – pojednostavljuje upite,tajnost – jak mehanizam kontrole pristupa podacima,performanse – čuva se u kompajliranom obliku,nezavisnost podataka – mijenjaju se definicije pogleda, a ne aplikacijski programi koji koriste podatke BP preko pogleda.
Pogled - VIEW
Opći oblik naredbe za kreiranje pogleda je:
CREATE VIEW naziv_pogleda[(nazivi atributa pogleda)] AS
SELECT . . .
Primjer: kreirati pogled koji se sastoji od imena i prezimena studenata čija je adresa Omladinska 14.
Rješenje: CREATE VIEW Omladinska AS SELECT IME, PREZIMEFROM STUDENTWHERE ADRESA=‘Omladinska 14’
Rezultat naredbe VIEW: SELECT * FROM OMLADINSKA
Izbacivanje definicije pogleda: DROP VIEW naziv_pogleda
UPITI
Osnova SQL-a je upitni blok oblika:
SELECT [DISTINCT] {*|atribut|izraz [alias],…}FROM tablica[WHERE uvjet(i)][GROUP BY group_by_uvjet][ORDER BY atribut]
najjednostavniji oblik SELECT naredbe mora uključivati:SELECT (određivanje atributa koji će se prikazati) i FROM (određivanje tablice koje sadrže atribute navedene pod SELECT)
UPITI
sortira redoveORDER BY
specificira atribute čije vrijednosti čine osnovu za grupiranje redova
group_by_uvjet
dijeli redove tablice u grupeGROUP BY
sastoje se od naziva atributa, izraza, konstanti i operatora usporedbe
uvjeti
sužava rezultat upita na redove koji zadovoljavaju uvjetWHERE
specificira tablicu koja sadrži atribute (stupce)FROM tablica
izabranom stupcu daje različit naziv zaglavljaalias
selektira imenovani stupacatribut
selektira sve atribute*
izbacuje duple redove i prikazuje atribute u rastućem redoslijedu
DISTINCT
prikazuje jedan ili više atributa (stupaca)SELECT
Upiti nad jednom tablicom
prikaz jednostavnog, neizmijenjenog sadržaja tablice
prikazati šifre, nazive i lokacije svih odjela iz relacije ODJEL (prikaz svih atributa neke tablice)
SELECT SODJEL, NAZIV, GRAD FROM ODJEL
kada se traže svi atributi neke relacije, umjesto navođenja svih atributa, može se staviti znak ‘*’ s istim rezultatom:
SELECT * FROM ODJEL
prikazati nazive i šifre svih odjela (prikaz nekih atributa)
SELECT NAZIV, SODJEL FROM ODJEL
prikazati sve poslove radnika
SELECT POSAO FROM RADNIIK
prikazati sve RAZLIČITE poslove radnika
SELECT DISTINCT POSAO FROM RADNIIK
Upiti nad jednom tablicom
prikaz jednostavnog, neizmijenjenog sadržaja tablice
nije obavezna, a može se koristiti sa SELECT, UPDATE i DELETE naredbamakorištena u SELECT bloku omogućava:
selekciju specifičnih n-torki relacije (redova tablice)selekciju n-torki koje zadovoljavaju višestruke uvjeteselekciju n-torki koje zadovoljavaju bar jedan od više uvjetaselekciju n-torki koje ne zadovoljavaju određene uvjeteselekciju n-torki istovremenim korištenjem AND i OR logičkih operatoraselekciju n-torki unutar nekog intervalaselekciju n-torki koje zadovoljavaju vrijednosti iz liste vrijednostiselekciju n-torki koje sadrže određenu kombinaciju znakova
WHERE klauzula
prikazati sve podatke o radnicima koji rade u odjelu 30
WHERE klauzula
SELECT * FROM RADNIK WHERE SODJELA=30
osim operatora ‘=‘ moguće je koristiti i ostale operatore usporedbe:RAZLIČITO ‘!=‘, VEĆE ‘>’, MANJE ‘<‘, VEĆE ILI JEDNAKO ‘>=‘ i MANJE ILI JEDNAKO ‘<=‘
prikazati ime, plaću, posao i šifru odjela za voditelje koji ne rade u odjelu 30 – korištenje operatora usporedbe ‘!=‘
SELECT IME, PLACA, POSAO, SODJEL FROM RADNIK WHERE POSAO=‘VODITELJ’ AND SODJELA!=30
prikazati sve podatke o voditeljima odjela i direktoru –korištenje logičkog operatora OR
WHERE klauzula
SELECT * FROM RADNIK WHERE POSAO=‘VODITELJ’ OR POSAO=‘DIREKTOR’
prikazati ime, prezime, posao i placu svakog radnika iz odjela 20 koji zarađuje više od 20000kn – korištenje logičkog operatora AND
SELECT IME, PREZIME, POSAO, PLACA FROM RADNIK WHERE SODJELA=20 AND PLACA>20000
prikazati ime, plaću, posao i šifru odjela za voditelje i analitičare u odjelu 10 – prioritet (redoslijed) izvršavanja uvjeta
WHERE klauzula
SELECT IME, PLACA, POSAO, SODJELA FROM RADNIK WHERE (POSAO=‘VODITELJ’ OR POSAO=‘ANALITICAR’) AND SODJEL=10
prikazati ime, posao i plaću radnika koji zarađuju između 12000 i 15000 – klauzula BETWEEN
SELECT IME, POSAO, PLACA FROM RADNIK WHERE PLACA BETWEEN 12000 AND 15000
isto je moguće dobiti i ovako:
WHERE PLACA >=12000 AND PLACA <=15000
prikazati ime, posao i šifru odjela radnika koji nisu analitičari, savjetnici ili trgovački putnici– korištenje operatora IN koji mijenja višestruku primjenu operatora OR
WHERE klauzula
SELECT IME, POSAO, SODJEL FROM RADNIK WHERE POSAO NOT IN (‘ANALITICAR’, ‘SAVJETNIK’, ‘TRG_PUTNIK’)
prikazati ime, posao i šifru odjela radnika čija imena počinju s M – klauzula LIKE
SELECT IME, POSAO, SODJEL FROM RADNIK WHERE IME LIKE ‘M%’
klauzula LIKE koristi 2 specijalna znaka:‘%’ koji predstavlja string od 0 ili više znakova i ‘_’ koji predstavlja poziciju jednog znaka.
WHERE klauzula
Primjeri:ime završava s N WHERE IME LIKE ‘%N’treći znak imena je R WHERE IME LIKE ‘__R%’ime je dugačko 5 znakova WHERE IME LIKE ‘_____’ime nije dugačko 5 znakova WHERE IME NOT LIKE ‘_____’u imenu je slovo G poslije R WHERE IME LIKE ‘%R%G%’
bez obzira o kojem tipu nul-vrijednosti se radi, NULL vrijednost određenog atributa može se testirati samo pomoću dvije specijalne klauzule: IS NULLili IS NOT NULLoperatori usporedbe ne mogu se koristiti za testiranje NULL vrijednosti
KORIŠTENJE NULL VRIJEDNOSTI
prikazati ime, posao i dodatak radnika koji ne primaju dodatak
SELECT IME, POSAO, DODATAK FROM RADNIK WHERE DODATAK IS NULL
prikazati ime, posao i dodatak radnika koji primaju premiju
SELECT IME, POSAO, DODATAK FROM RADNIK WHERE DODATAK IS NOT NULL
omogućava sortiranje rezultirajuće tablice po jednom ili više atributa u rastućem (ASCending) ili padajućem (DESCending) redoslijeduumjesto naziva stupca u ORDER BY klauzuli moguće je navesti i samo redni broj rezultirajućeg stupcaORDER BY je uvijek posljednja klauzula u SELECT bloku
ORDER BY klauzula
prikazati ime, posao i plaću radnika u odjelu 30 složene u rastućem redoslijedu poslova i padajućem redoslijedu plaća
SELECT IME, POSAO, PLACA FROM RADNIK WHERE SODJEL=30ORDER BY POSAO, PLACA DESC
kada se sortiranje izvodi po stupcu s NULL vrijednostima, n-torke s NULL vrijednostima uvijek su na početku rezultirajuće tablice, bez obzira je li sortiranje u rastućem ili padajućem redoslijedu.
1. Prikazati šifru radnika, ime, prezime, posao i datum zapošljavanja za radnike iz odjela 10.
2. Prikazati imena, prezimena i plaću analitičara.3. Prikazati ime, prezime, posao i plaću svakog radnika zaposlenog
17.12.1980.4. Prikazati naziv i šifru svakog odjela sa šifrom većom ili jednakom 20.5. Prikazati ime, plaću i premiju svakog radnika koji ima premiju veću od
plaće.6. Prikazati ime, posao i plaću svakog radnika iz odjela 20 koji zarađuje
više od 20000 kn.7. Prikazati ime, prezime, plaću premiju, posao i šifru odjela voditelja koji
ne rade u odjelu 30.8. Prikazati imena radnika koja sadrže slovo S.9. Prikazati imena radnika koja ne završavaju na N.10. U tri posebna upita prikazati imena, prezimena, poslove, plaće, šifre
odjela i datume zaposlenja svih radnika u slijedećem redoslijedu:a) u rastućem redoslijedu šifri odjela,b) u redoslijedu zapošljavanja,c) u rastućem redoslijedu poslova i unutar posla padajućem redoslijedu plaća.
ZADACI 1
Upiti nad jednom tablicom
prikaz modificiranog sadržaja tablice
mogućnost dobivanja zbirnih informacija, mogućnost primjene aritmetičkih funkcija,mogućnost primjene funkcija nad stringovima
Funkcije za dobivanje zbirnih informacija su:
Ove funkcije su definirane nad numeričkim stupcima.
pronalazi maksimalnu vrijednostMAX (atribut)
pronalazi minimalnu vrijednostMIN (atribut)
izračunava ukupnu vrijednostSUM (atribut)
izračunava srednju vrijednostAVG (atribut)
Upiti nad jednom tablicom
prikaz modificiranog sadržaja tablice
pronalazi različite NOT_NULL vrijednosti stupca
COUNT (DISTINCT atribut)
pronalazi NOT_NULL vrijednosti stupcaCOUNT (atribut)
pronalazi broj n-torki u grupiCOUNT (*)
Funkcija COUNT definirana je nad stupcima bilo kojeg tipa. Ima tri oblika:
Sve ove funkcije navode se iza SELECT klauzule.
Upiti nad jednom tablicom
prikaz modificiranog sadržaja tablice
naći minimalnu, srednju i maksimalnu plaću, kao i brojradnika u odjelu 10
SELECT MIN(PLACA), AVG(PLACA), MAX(PLACA), COUNT(*) FROM RADNIKWHERE SODJELA=10
naći ukupnu plaću i ukupni dodatak za trgovačke putnike
SELECT SUM(PLACA), SUM(DODATAK) FROM RADNIKWHERE POSAO=‘TRG_PUTNIK’
Omogućava dobivanje zbirne informacije za svaku različituvrijednost stupca po kojem se vrši grupiranje
Pogledajmo slijedeći upit:
naći minimalnu, srednju i maksimalnu plaću, kao i ukupan broj radnika u svakom odjelu
GROUP BY klauzula
ovaj upit mogao bi se riješiti formiranjem onoliko SQL SELECT naredbi koliko ima različitih odjela i pri tom bi SELECT i FROM klauzule bile slijedećeg oblika:
SELECT MIN(PLACA), AVG(PLACA), MAX(PLACA), COUNT(*), FROM RADNIK
mijenjao bi se samo uvjet selekcije u klauzuli WHERE:
WHERE SODJELA=10WHERE SODJELA=20WHERE SODJELA=30
rezultat svake SELECT naredbe bila bi jedna n-torka.
GROUP BY klauzula
identičan rezultat dala bi i slijedeća naredba:
SELECT MIN(PLACA), AVG(PLACA), MAX(PLACA), COUNT(*), SODJELA
FROM RADNIKGROUP BY SODJELA
djelovanje GROUP BY klauzule je identično višestrukom pisanju SELECT naredbe s različitim uvjetimaosim funkcija u SELECT listi može doći samo onaj jednostavni atribut po kojem se vrši grupiranjegrupiranje se može vršiti po više atributa i tada svaka različita n-torka čini grupu
GROUP BY klauzula
izračunati broj radnika koji obavljaju različit posao unutar svakog odjela
SELECT SODJELA, POSAO, COUNT(*) FROM RADNIKGROUP BY SODJELA, POSAO
Određuje kriterije za selekciju grupa kada su grupe većformirane s GROUP BY klauzulom
prikazati koje poslove obavljaju više od 2 radnika u svakom odjelu
HAVING klauzula
SELECT SODJELA, POSAO, COUNT(*) FROM RADNIKGROUP BY SODJELA, POSAOHAVING COUNT(*)>2
SQL naredbe mogu sadržavati aritmetičke izraze sastavljene od naziva atributa i konstanti povezanih aritmetičkim operatorima (“+”, “*”, “-”, “/”)
kolika je srednja godišnja zarada trgovačkih putnika
HAVING klauzula
SELECT AVG(PLACA + DODATAK) * 12 FROM RADNIKWHERE POSAO = ‘TRG_PUTNIK’
odrediti srednju godišnju plaću za svaki odjel (pri računanju ne uzimati u obzir direktora i voditelje odjela)
SELECT SODJELA, AVG(PLACA) * 12 FROM RADNIKWHERE POSAO NOT IN (‘DIREKTOR’, ‘VODITELJ’)GROUP BY SODJELA
Aritmetičke funkcije
SQL podržava slijedeće aritmetičke funkcije:
izračunava pozitivan kvadratni korijen brojaSQRT (broj)
izračunava ostatak dijeljenja broja1 s brojem2
MOD (broj1, broj2)
daje +1 ako je broj>0, 0 ako je broj=0, -1 ako je broj<0
SIGN (broj)
pronalazi apsolutnu vrijednost brojaABS (broj)
odbacuje ostatak od d-tog decimalnog mjestaTRUNC (broj [,d])
zaokružuje broj na d decimalaROUND (broj [,d])
izračunava n-tu potenciju brojaPOWER (broj, n)
Koji radnici zarađuju više od 100 kuna po satu? Zaradu po satu zaokružiti na 2 decimale (podrazumijeva se da postoje 22 radna dana u mjesecu i 8 radnih sati u danu)
Aritmetičke funkcije
SELECT IME, PREZIME, ROUND(PLACA/(22*8),2) “ZARADA PO SATU”FROM RADNIKWHERE PLACA/(22*8) > 100
Napomena:Zaglavlje rezultirajućeg stupca privremeno je zamijenjeno izrazom pod duplim navodnicima, a odvojeni su jednim praznim mjestom (ukoliko se izraz sastoji samo od jedne riječi nije ga potrebno stavljati pod navodnike).
NULL funkcija - NVL
NULL vrijednost je nedefinirana vrijednost i zbog toga se ne koristi u izračunavanju izraza i funkcijada bi se izračunavanje ipak omogućilo koristi se NVL funkcija koja privremeno mijenja NULL vrijednost s vrijednošću za koju se sami odlučimo, tj. s vrijednošću koja je neutralna u odnosu na željenu operaciju
prikaži ukupnu mjesečnu zaradu radnika u odjelu 30
SELECT IME, PREZIME, PLACA, DODATAK, PLACA+NVL(DODATAK,0) FROM RADNIKWHERE SODJELA=30
Napomena:da nismo koristili NVL funkciju, radnici koji nemaju dodatak imali bi urezultirajućem stupcu nedefiniranu vrijednost – NULL (jer je zbroj konkretne vrijednosti i NULL vrijednosti uvijek NULL vrijednost).
NULL funkcija - NVL
za odjel 30 izračunaj srednju plaću, srednji dodatak, srednju mjesečnu zaradu za radnike koji primaju dodatak i srednju mjesečnu zaradu za sve radnike
SELECT AVG(PLACA), AVG(DODATAK), AVG(PLACA+DODATAK), AVG(PLACA+NVL(DODATAK,0))
FROM RADNIKWHERE SODJELA=30
Razmotriti i komentirati rezultirajuće vrijednosti!
Funkcije nad nizom znakova
U SQL-u su definirane brojne funkcije nad znakovnim atributima. Najčešće se primjenjuju slijedeće:
pretvara niz znakova u brojTO_NUM (str)
pretvara sva velika slova u malaLOWER(str)
pretvara sva mala slova u velikaUPPER(str)
traži podstring ‘sstr’ u stringu ‘str’ polazeći od pozicije i. Ako je nadjen vraća se njegova pozicija, inače 0.
INSTR(str, sstr [, i])
daje podstring dužine d od pozicije i SUBSTR(str, i,[, d])
daje dužinu stringaLENGTH(str)
spajanje stringovastring1 || string2
Funkcije nad nizom znakova
rezultat je rst, ako je str=cs. Posljednji argument je default vrijednost
DECODE(str, cs1, rst1,..., dft)
ako je str1 NULL vraća str2, inače vraća str1NVL(str1, str2)
popunjava desnu stranu stringa ‘str’ sa znakom ‘char’ u dužini od ‘len
RPAD(str, len [, char])
popunjava lijevu stranu stringa ‘str’ sa znakom ‘char’ u dužini od ‘len’
LPAD(str, len [, char])
pretvara broj u niz znakovaTO_CHAR(str)
Sve ove funkcije navode se iza SELECT klauzule.
Funkcije nad nizom znakova
Prikaži imena radnika odjela 30 iza kojih neposredno slijedi posao koji obavljaju (odvojeno zarezom). Sortiratirezultirajuću tablicu u rastućem redoslijedu vrijednosti atributa posao
SELECT IME ||’, ‘|| POSAO RADNIKFROM RADNIKWHERE SODJELA=30ORDER BY POSAO
Napomena:Ovaj upit spaja tri stringa i spojeni string naziva RADNIK. Prvi string je atribut IME, drugi string se sastoji od dva znaka – zareza i jednog praznog mjesta i treći string je atribut POSAO.
Funkcije nad nizom znakova
Koristeći atribut POSAO formirati stupac KLASA tako da za posao analitičara vrijednost klase bude 1, voditelja 3, direktora 5, a za sve ostalo 2.
SELECT IME, POSAO, DECODE(POSAO,’ANALITICAR’,1,’VODITELJ’,3, ’DIREKTOR’,5,2) KLASA
FROM RADNIK
Koliko su duga prezimena radnika?
SELECT PREZIME, LENGTH(PREZIME) DUZINAFROM RADNIK
1. Koliko iznosi dužina najdužeg imena radnika?
2. Prikazati ime, mjesečnu plaću, dnevnu zaradu i zaradu po satu rada radnika koji nemaju pravo na dodatak. (Podrazumijevati da su u mjesecu 22 radna dana i 8 radnih sati dnevno)
3. Izračunati broj radnika u odjelu 20 koji primaju plaću i broj radnika koji primaju dodatak.
4. Izračunati srednju, minimalnu i maksimalnu plaću onih grupa radnika koji obavljaju posao analitičara ili voditelja.
ZADACI 2
Umetanje upita nad jednom tablicom
u upit nad drugom tablicom
prvi način povezivanja tablica relacijske baze podatakadinamička zamjena rezultata jednog upita u WHERE klauzuli drugim
Pogledajmo slijedeći upit:
prikazati ime i posao svakog radnika koji ima isti posao kaoDean
najprije bi trebalo utvrditi koji posao obavlja Dean:
SELECT POSAO FROM RADNIKWHERE IME=‘DEAN’
izvršavanjem ove naredbe saznajemo da je Dean analitičar i polazni zahtjev se svodi na prikazivanje imena i posla svakog radnika koji obavlja posao analitičara:
Umetanje upita nad jednom tablicom
u upit nad drugom tablicom
SELECT IME, POSAO FROM RADNIKWHERE POSAO=‘ANALITICAR’
povezivanje tablica dinamičkom zamjenom rezultata jednog upita u WHERE klauzuli drugim sastoji se upravo u tome da se umjesto rezultata prvog upita (u našem slučaju ‘ANALITICAR’) u WHERE klauzuli drugog piše prvi upit:
SELECT IME, POSAO FROM RADNIKWHERE POSAO=(SELECT POSAO
FROM RADNIKWHERE IME=‘DEAN’)
prvi upit (upit u zagradi) se naziva unutarnji upit i on se uvijek izvršava prvidrugi upit se naziva vanjski upit
Umetanje upita nad jednom tablicom
u upit nad drugom tablicom
prikazati ime i posao radnika koji rade u Rijeci
SELECT IME, POSAO FROM RADNIKWHERE SODJELA IN (SELECT SODJELA
FROM ODJELWHERE LOKACIJA=‘RIJEKA’)
prikazati ime, posao i plaću radnika iz odjela 20 koji imaju isti posao kao radnici iz odjela projektiranje
SELECT IME, POSAO , PLACA FROM RADNIKWHERE SODJELA= 20 ANDPOSAO IN (SELECT POSAO FROM RADNIK
WHERE SODJELA IN (SELECT SODJEL FROM ODJEL WHERE NAZIV=‘PROJEKTIRANJE’))
Umetanje upita nad jednom tablicom
u upit nad drugom tablicom
Tko je najbolje plaćeni radnik u svakom odjelu?
SELECT IME, PREZIME, SODJELA,POSAO, PLACAFROM RADNIKWHERE (SODJELA, PLACA) IN (SELECT SODJELA, MAX(PLACA)
FROM RADNIKGROUP BY SODJELA)
Primjena operatora unije (UNION), presjeka (INTERSECT) i razlike (MINUS)
upit (unutarnji ili vanjski) može biti sastavljen od dva ili više SELECT blokova povezanih operatorima UNION, INTERSECT ili MINUS
rezultat primjene operatora UNION na dva SELECT bloka su sve rezultirajuće n-torke prvog SELECT bloka i one rezultirajuće n-torke drugog, koje nisu među rezultirajućim n-torkama prvog SELECT bloka
rezultat primjene operatora INTERSECT na dva SELECT bloka su sve rezultirajuće n-torke prvog SELECT bloka koje su istovremeno i rezultirajuće n-torke drugog SELECT bloka
rezultat primjene operatora MINUS na dva SELECT bloka su sve rezultirajuće n-torke prvog SELECT bloka koje nisu istovremeno rezultirajuće n-torke drugog SELECT bloka
Primjena operatora unije (UNION), presjeka (INTERSECT) i razlike (MINUS)
da bi se navedene operacije mogle primijeniti, SELECT blokovi (upiti) na koje se operacije odnose moraju imati isti broj rezultirajućih stupaca i oni moraju odgovarati po tipu
primjena ovih operacija na upite nad istom tablicom nema puno smisla, jer se identičan rezultat može postići korištenjem logičkih operatora AND, OR i NOT
pogledajmo primjer nad dvije tablice. Pretpostavimo da je kreirana i tablica o trgovačkim putnicima čija je shema:
TRGOVACKI_PUTNIK(SRADNIK, DODATAK)
prikazati šifre radnika koji nisu trgovački putnici mogao bi se riješiti na slijedeći način:
SELECT SRADNIK FROM RADNIK MINUSSELECT SRADNIK FROM TRGOVACKI_PUTNIK
1. Koji radnici zarađuju manje od 30% direktorove plaće?
2. Prikazati imena radnika s najdužim imenom.
3. Tko je posljednji zaposleni radnik u svakom odjelu?
4. Koliko radnika iz odjela 10 prima plaću veću od najveće plaće iz odjela projektiranje?
ZADACI 3
JOIN – spajanje dvije ili više tablica
povezivanje tablica dinamičkom zamjenom rezultata jednog upita u WHERE klauzuli drugim ima jedno značajno ograničenje:
iako se referenciraju podaci iz više tablica, mogu se prikazivati samo podaci jedne tablice
za prikazivanje podataka iz više tablica mora se koristiti JOIN
JOIN povezuje n-torke različitih tablica koristeći zajedničke atribute, odnosno atribute definirane nad istim domenama
uobičajeni način povezivanja tablica relacijske baze podataka
EQUIJOIN – spajanje s izjednačavanjem
prikazati za svakog radnika ime, prezime, posao i podatke o odjelu u kojem radi
SELECT IME, PREZIME, POSAO,RADNIK.SODJELA, ODJEL.SODJELA, NAZIV, LOKACIJAFROM RADNIK, ODJELWHERE RADNIK.SODJELA=ODJEL.SODJELA
potpuna specifikacija naziva atributa sastoji se od naziva tablice, točke i naziva stupca (ona se mora navoditi ukoliko naziv atributa (stupca) nije jedinstven u bazi podataka, tj. ukoliko se isti naziv koristi za stupce različitih tablica)
u WHERE klauzuli se javlja uvjet spajanja (do sada su u WHERE klauzuli prikazivani samo uvjeti selekcije)
EQUIJOIN – spajanje s izjednačavanjem
za svakog analitičara prikazati ime i lokaciju na kojoj radi
SELECT IME, PREZIME, LOKACIJAFROM RADNIK, ODJELWHERE RADNIK.SODJELA=ODJEL.SODJELAAND POSAO=‘ANALITICAR’
uz potpunu specifikaciju naziva atributa po kojima se vrši spajanje tablica RADNIK i ODJEL navodi se i operator spajanja, u ovom slučaju jednakost (=)
spajanje tablica moguće je vršiti u odnosu na bilo koji operator uspoređivanja
CARTESIAN JOIN – Kartezijev produkt
za svakog analitičara prikazati ime i lokaciju na kojoj radi (izostavljajući JOIN klauzulu)
SELECT IME, PREZIME, LOKACIJAFROM RADNIK, ODJELWHERE POSAO=‘ANALITICAR’
ako svakoj n-torki tablice s velikim brojem n-torki treba pridružiti istu vrijednost, moguće je formirati pomoćnu tablicu s jednim stupcem i tom vrijednosti u stupcu i izvršiti Kartezijev produkt te dvije tablice
ukoliko se izostavi uvjet spajanja u WHERE klauzuli izvršava se CARTESIAN JOIN
ako se primjenjuje na dvije tablice tada se svaka n-torka prve spaja sa svakom n-torkom druge tablice
ako se primjenjuje na više od dvije tablice tada se rezultirajuća tablica sastoji od svih kombinacija n-torki svih tablica
OUTER JOIN
prikazati naziv odjela, kao i ime i posao svakog radnika koji u njemu radi, uključujući i odjele bez radnika
SELECT NAZIV, IME, PREZIMEFROM ODJEL, RADNIKWHERE ODJEL.SODJELA=RADNIK.SODJELA(+)ORDER BY ODJEL.SODJELA
koristi se da bi se u rezultat JOIN-a uključili i oni redovi koji ne zadovoljavaju uvjet spajanja
samo zbog JOIN-a tablici se dodaje prazan red, koji se uključuje u JOIN samo za one redove za koje se ne nađe odgovarajuća stvarna vrijednost
OUTER JOIN se označava navođenjem oznake “(+)” u WHERE klauzuli iza tablica.stupac kombinacije koja zahtijeva prazan red
SELF JOIN
prikazati ime i posao svakog radnika koji ima nadređenog; također prikazati ime i posao nadređenog
SELECT PODR.IME, PODR.POSAO, PODR.SNADR,NADR.SRADNIK SEF, NADR.IME SEF_IME, NADR.POSAO SEF_POSAO
FROM RADNIK PODR, RADNIK NADRWHERE PODR.SNADR=NADR.SRADNIK
tablica može biti spojena sa samom sobom po stupcima koji sadrže isti tip informacije
SELF JOIN spaja redove tablice s ostalim ili istim redovima te iste tablice
tablici RADNIK se daju dva sinonima PODR i NADR, pomoću kojih su praktično formirane dvije virtualne tablice s identičnim sadržajem
Realizirati na dva načina (dinamičkom zamjenom rezultata jednog upita u WHERE klauzuli drugim, odnosno spajanjem tablica) slijedeće upite:
1. Koliko radnika radi u Matuljima?2. Koji radnici rade u Matuljima? 3. Prikazati naziv i lokaciju odjela koji su zaposlili bar dva trgovačka
putnika u prva dva mjeseca 1981. godine.4. Prikazati sve podatke o odjelima koji imaju bar dva analitičara.
Realizirati spajanjem tablica slijedeće upite:
1. Prikazati imena radnika i lokacije u kojima rade. Sortirati listu po rastućim vrijednostima atributa lokacija.
2. Prikazati ime i plaću radnika i njihovih neposredno nadređenih, za one radnike koji zarađuju više od svojih neposredno nadređenih.
3. Prikazati prosječnu plaću i broj radnika čije su plaće veće od plaća neposredno nadređenih
4. Prikazati ime, plaću i datum zaposlenja radnika i njegovog neposredno nadređenog, za radnike zaposlene prije svojih nadređenih.
5. Prikazati šifru odjela, lokaciju i broj radnika za svaki odjel.
ZADACI 4
Operacije nad tablicama koje u sebi
sadrže strukturu tipa stabla
ponekad postoji veza između n-torki relacije koja praktično predstavlja hijerarhijsku vezu (vezu tipa stabla)
koristeći atribute SRADNIK i SNADR tablicu RADNIK moguće je predstaviti i na slijedeći način:
STJEPAN
IVAN MARKO DANIEL
DEAN BOŽIDAR FILIP LOVRO PETAR JOSIP GORAN ANTE
MATEJ JAKOV
Operacije nad tablicama koje u sebi sadrže strukturu tipa stabla
prikazati organizacijsku kartu navodeći razinu na kojoj se nalazi svaki radnik
SELECT LEVEL, IME, PREZIME, SRADNIK, POSAO, SODJELA, SNADRFROM RADNIKCONNECT BY PRIOR SRADNIK=SNADRSTART WITH IME=‘STJEPAN’
koristeći SQL klauzule CONNECT BY i START WITH moguće je transformirati tablicu u stablo
CONNECT BY – definira strukturu stablaSTART WITH – definira korijen stabla
LEVEL – određuje razinu u hijerarhijiPRIOR – određuje smjer formiranja stabla
SQL *Plus
SQL je standardni upitni jezik implementiran unutar nekog programskog modula konkretnog SUBPkod ORACLA taj programski modul je SQL*Plus (od verzije 5)osim što omogućava korištenje standardnog SQL-a, ima i vlastite
naredbe, kojima se omogućava:editiranje teksta SQL naredbedobivanje novih izvedenih podataka,formatiranje rezultata upita i sl.
Pregled SQL *Plus naredbi dan je u slijedećoj tablici:
Izvršava naredbu iz SQL buffera/
Izvršava naredbu operativnog sustava ne izlazeći iz SQL*Plus-a. (ekvivalentno HOST naredbi)
$
Završava DOCUMENT naredbu#
Pokreće izvršavanje datoteke sa SQL i SQL*Plus naredbama@
OpisNaredba
SQL *Plus
Definira korisničku varijablu i dodjeljuje joj CHAR vrijednost
DEFINE
Omogućava izlazak iz ORACLE-a i ulazak pod drugom identifikacijom (username/password)
CONNECT
Izvršava obradu grupe selektiranih redovaCOMPUTE
Omogućava formatiranje stupca i njegovog zaglavlja na izvješću
COLUMN
Briše break definiciju, sadržaj tekućeg buffera, column definiciju itd.
CLEAR
Mijenja tekuću liniju tekućeg bufferaCHANGE
Omogućava prikaz konstantnog teksta na dnu svake strane izvješća
BTITLE
Specificira događaj koji će prouzrokovati prekid i SQL akciju u toku prekida
BREAK
Dodaje tekst na kraj tekuće linije naredbe tekućeg bufferaAPPEND
OpisNaredba
SQL *Plus
Prikazuje sadržaj tekućeg buffera (posljednja linija je tekuća linija)
LIST
Dodaje nove linije iza tekuće linije tekućeg bufferaINPUT
Izvršava naredbu operativnog sustava ne napuštajući SQL*Plus (ekvivalentno “$” naredbi)
HOST
Prikazuje informacije o SQL ili SQL*Plus naredbamaHELP
Puni tekući buffer sadržajem specificirane datotekeGET
Napušta SQL*Plus i vraća kontrolu operativnom sustavuEXIT
Poziva standardni tekst editor, sa sadržajem tekućeg buffera ili specificirane datoteke
EDIT
Omogućava pisanje komentara, sastavljenog od proizvoljnog broja linija teksta, unutar datoteke naredbi
DOCUMENT
Izvršava COMMIT i napušta ORACLE, ali ne i SQL*PlusDISCONNECT
Prikazuje kratak opis tabliceDESCRIBE
Briše tekuću liniju tekućeg bufferaDEL
OpisNaredba
SQL *Plus
Nastavlja prikaz izvješća na novoj straniciNEWPAGE
Prikazuje poruku i čeka pritisak tipke <RETURN>PAUSE
Sinonim za EXITQUIT
Počinje komentar u programuREMARK
Prikazuje i izvršava naredbu sadržanu u SQL bufferuRUN
Čuva sadržaj tekućeg buffera (programa ili SQL naredbe) u bazi podataka ili datoteci operativnog sustava
SAVE
Postavlja sustavnu varijablu na određenu vrijednostSET
Prikazuje vrijednost sustavne varijableSHOW
Omogućava da se sve što se prikazuje na terminalu istovremeno zapisuje u specificiranu datoteku ili se tiska
SPOOL
Starta SQL*Plus – sustavna naredbaSQLPLUS
Izvršava naredbe datoteke naredbiSTART
OpisNaredba
SQL *Plus
Prikazuje vremensku analizu izvršavanja SQL naredbi i SQL*Plus programa
TIMING
Omogućava prikaz zaglavlja na početku svake stranice izvješća
TTITLE
Briše definiciju korisničke varijableUNDEFINE
OpisNaredba
Sintaksa SQL naredbi:svaka SQL naredba mora se završiti znakom “;” (to nije dio naredbe, već služi za oznaku kraja teksta naredbe)posljednja unijeta SQL naredba čuva se u bufferu sve dok se ne unese novanaredba se može editirati i ponovno izvršavatiprilikom editiranja znak “;” se neće vidjeti i ne treba ga unositi (njegova funkcija je završena unošenjem SQL naredbe)ukoliko se radi o podatku tipa CHAR ili vrijednosti za identifikaciju korisnika (vrijednosti za username i password) mora se voditi računa o velikim i malim slovima; kada se radi o nazivima tablica, stupaca ili drugim objektima baze i rezerviranim riječima, nije važno koriste li se mala ili velika slova
SQL *Plus
Sintaksa SQL *Plus naredbi:obično se unosi u jednoj linijiukoliko ne stane, može se nastaviti u idućoj liniji i pri tom ne treba pritisnuti <ENTER> , već na kraju linije treba unijeti crticu (“-”)ako se za SQL *Plus naredbu koristi više linija, svaka linija , osim posljednje, završava crticomzavršetak cijele naredbe se označava pritiskom na <ENTER>znak “;” se ne koristi za oznaku kraja SQL *Plus naredbeSQL *Plus naredbe se ne čuvaju u SQL bufferu
SQL *Plus naredbe za editiranjeomogućavaju ispravljanje grešaka i modificiranje unijete SQL naredbeposljednja unijeta SQL naredba čuva se u bufferu tako da se SQL *Plus naredbama za editiranje mijenja sadržaj bufferaSQL naredba u bufferu je ‘tekuća’ SQL naredba
SQL *Plus editor je linijski editor; linija na koju se odnosi naredba za editiranje je ‘tekuća’ linija i označena je zvjezdicom (“*”)
SQL *Plus naredbe za editiranje
A[PPEND] <tekst> dodaje tekst na kraj tekuće linije tekućeg buffera ako tekst počinje praznim mjestom, iza riječi APPEND treba unijeti dva prazna mjesta (jedno prazno mjesto je obavezni kontrolni znak); ako se tekst završava znakom “;”, potrebno je unijeti dva takva znaka (“;;”)
C[HANGE] /<stari tekst>/<novi tekst>/ zamjenjuje stari tekst novim tekstom u tekućoj liniji
DEL briše tekuću liniju tekućeg buffera
I[NPUT] [<tekst>] dodaje jednu ili više linija iza tekuće linije tekućeg buffera
L[IST] <tekst> prikazuje sadržaj buffera, tj. linije tekuće SQL naredbe i čini posljednju liniju tekućom linijom
L[IST] <n> prikazuje specificiranu liniju, tj. čini je tekućom linijom
L[IST] <m> <n> prikazuje linije između specificiranih granica, uključujući i linije određene graničnim vrijednostima
R[UN] prikazuje i izvršava tekuću SQL naredbu
/ izvršava tekuću SQL naredbu
SQL *Plus naredbe za editiranje
Ako u SQL naredbi postoji greška, bit će prikazana odgovarajuća porukaPrimjer: SQL> SELECT *
2 FROM RADDNIK; - javit će grešku da tablica ne postoji
Prikazujemo sadržaj buffera:SQL> L
(zvjezdica iza broja 2 ukazuje da je druga linija SQL naredbe tekuća linija)
Ispravljamo grešku:SQL> C /RADDNIK/RADNIK/
Prikazujemo sadržaj buffera:SQL> L
Izvršavamo naredbu:SQL> / ili SQL> RUN (prikazuje se kompletan sadržaj tablice RADNIK)
Greška se mogla ukloniti i naredbom:SQL> C/DD/D/
ili:SQL> C/D…/DNIK/
SQL *Plus naredbe za editiranje
Ako umjesto svih podataka o radnicima želimo prikazati samo imena radnika, najprije treba prvu liniju SQL naredbe učiniti tekućom linijom:
SQL> L 1 (1* SELECT *)SQL> C/*/IME/ (1* SELECT IME)
Ako osim imena želimo i poslove koje radnici obavljaju, može se koristiti naredba APPEND:
SQL> A, POSAO (1* SELECT IME, POSAO)Izvršenje naredbe:
SQL> / ili SQL> RUN
Ako želimo prikazati ime i posao samo onih radnika koji rade u odjelu 30, treba dodati kriterij selekcije:
SQL> L 2 (pozicioniranje na drugu liniju)
Koristimo naredbu INPUT:SQL> I
Unosimo kriterij selekcije
WHERE SODJELA=30 (1* SELECT IME, POSAO.)
Izvršenje naredbe: SQL> / ili SQL> RUN