Professional Documents
Culture Documents
Baze Podataka
Baze Podataka
Baze Podataka
Koriste je:
društvene mreže
e-Matica
online trgovine
...
Podaci u bazama podataka moraju biti organizirani na način da je rad s podacima (dodavanje novih
podataka, izmjena, brisanje, pretraživanje postojećih podataka) maksimalno učinkovit.
OSNOVNI KONCEPTI ORGANIZIRANJA PODATAKA U BAZI
PODATAKA
Primjer. Osmislimo način pohranjivanja podataka o učenicima neke škole. Pri tome bismo htjeli za svakog
učenika spremati sljedeće podatke:
Ime učenika
Prezime učenika
Datum rođenja učenika
Razredno odjeljenje
Ime razrednika
Prezime razrednika
Školska godina
Jedan način rješavanja danog problema jest da sve podatke prikažemo u jednoj tablici.
Način zapisivanja podataka odgovara ako je malen broj podataka
Pojavljuju se neki podaci koji su jednaki (npr. razredno odjeljenje, ime razrednika, školska godina,...).
Npr. kod Ivane i Ive, stoga kažemo da su podaci o razrednom odjeljenju i razredniku reduntantni.
S velikim uzorkom podataka možemo zaključiti da bi se pojavio veliki broj reduntantnih podataka,
time se troši više prostora, a time će i postupak pretraživanja biti zahtjevniji.
Postupak kojim osiguravamo dobru organizaciju podataka bez reduntancije te učinkovit rad s
podacima naziva se dizajn baze podataka
DIZAJN BAZE PODATAKA
MODELIRANJE PODATAKA
Rješavanju problema iz primjera pristupit ćemo tako da uočimo osnovne elemente, a to bi mogli biti:
podaci o učenicima (ime, prezime, datum rođenja, razredno odjeljenje)
podaci o razredima (odjeljenje, ime razrednika, prezime razrednika)
Izdvojene osnovne elemente nazivamo entitetima, a podatke koje oni sadrže (koji ih „opisuju” ) nazivamo
atributima
Kreirani model čini osnovu za kreiranje baze podataka: svaki entitet postaje jedna tablica, a atributi entiteta
postaju stupci te tablice.
MODELIRANJE PODATAKA
MODELIRANJE PODATAKA
Primarni ključ (engl. Primary Key) – atribut koji jedinstveno određuje entitet
„Umjetni ključ” – najčešće brojevi koji se automatski povećavaju, kada se ne može lako pronaći primarni ključ
Strani ključ (engl. Foreign Key) - Atributi koji poprimaju vrijednosti primarnog ključa iz povezane tablica
U našem primjeru:
Podatak Razrednik u tablici Razredi biti će vrijednost primarnog ključa IDNastavnika iz tablice Nastavnici.
Podatak SkolskaGodina u tablici je vrijednost primarnog ključa IDGodine iz tablice Školske godine.
Dobra je praksa da atribute koji poprimaju vrijednost primarnog ključa iz povezanih tablica preimenujemo tako da
imaju isti naziv kao odgovarajući primarni ključevi.
VEZE IZMEĐU ENTITETA I ATRIBUTA
naziv opis
cursor() Vraća objekt tipa Cursor koji omogućuje
izvođenje upita nad bazom podataka
commit() Pohranjuje sve promjene u bazu podataka
close() Zatvara vezu s bazom podataka
Pozivom metode execute(upit) nad objektom tipa Cursor izvodi se upit nad bazom podataka, pri čemu je upit
string koji sadrži SQL upit
PYTHON I BAZE PODATAKA
Zadatak. Napišimo u Pythonu program koji će kreirati tablicu za entitet Ucenici, a imat će stupce kao u zadanoj tablici.
stupac ID Pravilo
IDUcenika INTEGER Primarni ključ,
autoincrement
Pri kreiranju tablice ponekad ćemo htjeti naglasiti da je neki stupac strani ključ u toj tablici kako bismo osigurali
konzistentnost podataka, to činimo definiranjem reference među tablicama:
REFERENCES tablica_roditelj(id)
Primjer. Kreirajmo tablicu Razredi unutar koje ćemo pohranjivati podatke o razredima: razredno odjeljenje,
podaci o školskoj godini(IDGodine), podaci o razredniku (IDNastavnika) uz pretpostavku da u bazi podataka
postoje tablice: Ucenici, Nastavnici te SkolskeGodine čije su strukture kao u tablici:
stupac ID pravilo
IDRazreda INTEGER Primarni ključ
Odjeljenje TEXT Polje ne smije biti
prazno
IDNastavnika INTEGER Strani ključ u
tablici Nastavnici
Zadatak. Napišimo upit kojim ćemo tablici Ucenici dodati stupac EmailAdresa koji će biti tipa TEXT.
SQL UPITI ZA RAD S PODATCIMA
Opći oblik: INSERT INTO ime_tablice (st1, st2, ..., stn) VALUES (v1, v2, ..., vn), pri čemu su st1, st2, ..., stn
nazivi stupaca, a v1, v2, ..., vn odgovarajuće vrijednosti. Ako je neki stupac tipa TEXT, pripadnu vrijednost
navodimo unutar navodnika.
UPIT INSERT
Zadatak. Napišimo dio programa kojim ćemo u tablicu Ucenici dodati učenicu Ines Marković koja je rođena
12.2.2003.
Zadatak. Napišimo dio programa kojim ćemo dodati razredno odjeljenje 4.f u kojem je razrednik Petar Nikolić.
Taj profesor još ne postoji u bazi, a radi se o školskoj godini 2019./2020. koja također ne postoji u bazi.
UPIT SELECT
Upit SELECT koristimo ako iz tablice trebamo dohvatiti podatke prema nekom kriteriju
Opći oblik naredbe:
SELECT st1, st2, ..., stn
FROM ime_tablice
WHERE kriterij
ORDER BY st1[nacin], st2[nacin], …
pri čemu su st1, st2, ...,stn nazivi stupaca čije vrijednosti želimo da nam upit vrati dok je kriterij svojevrsni filtar za podatke. Kriterij se
sastoji od jednog ili više uvjeta koji su međusobno povezani relacijskim operatorima.
Svaki od uvjeta je oblika: ime_stupca [operator] vrijednost,
pri čemu je operator:
neki od relacijskih operatora (=, <, >, <=, >=)
LIKE – unutar vrijednosti koristimo se zamjenskim znakom % koji zamjenjuje nula, jedan ili više znakova
IN – unutar vrijednosti nabrajamo više vrijednosti za pretraživanje, koje su pobrojeni unutar okruglih zagrada
Opcija ORDER BY poredat će podatke prema stupcima koje smo naveli u nastavku ove naredbe (s1, s2, ... )dok je način na koji ćemo
poredati podatke:
ASC – uzlazno redanje
DESC – silazno redanje
Moguće je pisati i SELECT upite bez uvjeta, u tom slučaju nećemo imati WHERE, a rezultat će biti cijela tablica.
UPIT SELECT
Zadatak. Napiši upit kojim ćemo dobiti imena, prezimena i datume rođenja svih učenika kojima ime završava
slovom a, poredane prema prezimenu uzlazno.
Za odabir svih stupaca neke tablice nije ih potrebno sve navoditi nego napisati znak *
SQLite u jednoj posebnoj tablici čuva sve relevantne podatke vezane za bazu podataka: sqlite_master
Zadatak: Napiši upit kojim ćemo dohvatiti sve podatke iz tablice sqlite_master
SELECT *
FROM sqlite_master
UPIT DELETE
Zadatak. Napiši upit kojim ćeš obrisati sve nastavnike čiji je IDNastavnik 1,4,6 ili 7.
UPDATE ime_tablice
SET st1=vr1, st2=vr2,...
WHERE uvjet
Nakon ovog upita, svim zapisima koji zadovoljavaju kriterij za stupac st1 će biti postavljena vrijednost vr1, itd.
Zadatak. Napiši upit kojim ćemo nastavniku čiji je ID 1 promijeniti prezime u Tomić.
UPDATE Nastavnici
SET Prezime = ‘Tomić’
WHERE IDNastavnika = 1
ZADACI ZA VJEŽBU
RJEŠENJE
Primjer. Pretpostavimo da želimo jednim upitom dohvatiti podatke kako bismo ispisali sva razredna odjeljenja u školskoj
godini 2019./2020.
SELECT Razredi.Odjeljenje #ispred imena stupca moramo pisati ime pripadne tablice i točku npr: Razred.Odjeljenje
FROM Razredi #kada dohvaćamo podatke iz dviju tablica obavezno se zadaje kako su tablice povezane
LEFT JOIN SkolskeGodine ON SkolskeGodine.IDGodine = Razredi.IDGodine
WHERE SkolskeGodine.Oznaka = ‘2019./20.’
Općenito moguće je uvesti supstitucije za kraći zapis; navode se u dijelu FROM na način da iza imena tablice napišemo proizvoljni
zamjenski naziv koji navodimo svaki puta umjesto imena tablice
SELECT r.Odjeljenje
#Općenito, upit FROM A LEFT JOIN B ON B.IDB =
FROM Razredi r A.IDB
vraća sve zapise tablice A bez obzira jesu li oni povezan s
LEFT JOIN SkolskeGodine s ON s.IDGodine = r.IDGodine
WHERE s.Oznaka = ‘2019./20.’ podacima iz tablice B
SLOŽENI SELECT UPITI
Ilustrirajmo na tablicama Razredi i SkolskeGodine. Pretpostavimo da imamo razred koji nema pridruženu školsku
godinu jer je u tablici Razredi IDGodine u neki zapisima jednak None.
SELECT r.Odjeljenje, s.Oznaka
FROM Razredi r
LEFT JOIN SkolskeGodine s ON s.IDGodine = r.IDGodine
(‘4.a’, ‘2019./20.’)
(‘4.b’, None)
(‘4.c’,’2019./20.’)
(‘4.d’ ‘2019./20.’)
SLOŽENI SELECT UPITI
Ispišimo sada sve zapise kojima je IDGodine različit od None. Rezultat upita:
(‘4.a’, ‘2019./20.’)
SELECT r. Odjeljenje, s. Oznaka
(‘4.c’,’2019./20.’)
(‘4.d’ ‘2019./20.’)
FROM Razredi r
LEFT JOIN SkolskeGodine s ON s.IDGodine = r.IDGodine
WHERE r.IDGodine IS NOT NULL
Primjer. Za sve razrede u školskoj godini 2019./2020. dohvati razredni odjel te ime i prezime pripadnog razrednika.
Rješenje:
Podatke dohvaćamo iz tri tablice: Razredi (odjeljenje), Nastavnici (ime i prezime razrednika) i SkolskeGodine (kriterij)
|| spajanje stringova
UGRAĐENE SQL FUNKCIJE
Primjer. Napišimo upit kojim ćemo prebrojiti sve nastavnike u našoj bazi podataka.
SELECT count(IDNastavnika)
FROM Nastavnici
UGRAĐENE SQL FUNKCIJE
Primjer. Napišimo upit kojim ćemo ispisati sve učenike u obliku [prezime],[prvo slovo imena]. ([datum rođenja u
obliku d.m]).
SELECT
Prezime | | ”, ” | |
substr (Ime, 1, 1) | | ”.” | | ”(” | |
replace( replace(substr(DatumRodenja, 8), ”-0”, ”-”), ”-”, ””) | | ”.”
replace( replace(substr(DatumRodenja, 5, 3), ”-0”, ”-”), ”-”, ””) | | ”.” | | ”)”
FROM Ucenici
UGRAĐENE SQL FUNKCIJE
Funkcije koje od podataka iz više redaka tablice kreiraju jednu vrijednost zvat ćemo agregacijske funkcije. To su funkcije:
count(), sum(), avg(), min(), max().
Ukoliko želimo podatke koji su rezultat neke agregacijske funkcije dodati još neki stupac ili više njih,na kraj upita potrebno je
dodati GROUP BY te unutar tog dijela nabrojiti sve stupce osim ono koji koristimo kao parametar agregacijske funkcije
Primjer. Napišimo upit kojim ćemo za svaku školsku godinu ispisati broj razrednih odjeljenja koji su postojali u toj godini.