Baze Podataka

You might also like

Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 45

BAZE PODATAKA

ŠTO JE BAZA PODATAKA?


 Baza podataka organizirana je i uređena cjelina međusobno povezanih podataka spremljenih u
vanjskoj memoriji računala u svrhu računalne obrade

 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

 Želimo dodati i razrede po generacijama.


 Ne možemo izravno vezati učenika za razredno odjeljenje jer imamo više razrednih odjeljenja s istim nazivom, ali različitom
školskom godinom. Slično je s razrednicima.
 U tom slučaju imamo sljedeće entitete i pripadne atribute:
 Učenici (ime, prezime, datum rođenja)
 Nastavnici (ime, prezime)
 Školske godine (oznaka školske godine)
 Razredi (odjeljenje, školska godina, razrednik)
VEZE IZMEĐU ENTITETA I ATRIBUTA
 Uočimo:
 Podaci su raspoređeni u nekoliko tablica
 Podaci su međusobno povezani
 Potrebno je povezati tablice na način da se osiguraju ispravne veze među podacima.

 Općenito postoje tri tipa veza među tablicama (entitetima):


 1:1 - jedan redak unutar neke tablice A povezan je samo s jednim retkom unutar neke tablice B, isto tako jedan redak iz
tablice B povezan je s najviše jednim retkom unutar tablice A. Primjerice, jedna škola ima jednog ravnatelja, a jedna osoba
može biti ravnatelj najviše jedne škole. Ovakvu vezu nazivamo jedan na jedan (engl. One to One)
 1:N - jedan redak iz neke tablice A povezan je s više redaka u nekoj tablici B dok je jedan redak iz tablice B povezan s
najviše jednim u tablici A. Primjerice, u jednoj školskoj godini ima više razrednih odjeljenja, dok jedno razredno odjeljenje
može pripadati samo jednoj školskoj godini. Ovakvu vezu nazivamo jedan na više (engl. One to Many)
 N:M - jedan redak iz neke tablice A može biti povezan s više redaka u nekoj tablici B i jedan redak iz tablice B može biti
povezan s više redaka u tablici A. Primjerice, jedan učenik ide u više različitih odjeljenja tijekom školovanja – u školskoj
godini 2016./17. je primjerice u 1.e razredu, u školskoj godini 2017./18. u 2.e itd. S druge strane, u jedno razredno odjeljenje
ide više učenika. Ovakvu vezu nazivamo više na više (engl. Many to Many).
VEZE IZMEĐU ENTITETA I ATRIBUTA

 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

 Prilikom dizajna uobičajeno je


linijama naglasiti veze među
primarnim i sekundarnim ključevima
VEZE IZMEĐU ENTITETA I ATRIBUTA

 Jedan učenik će tijekom školovanja


pohađati više razrednih odjeljenja,
a isto tako u jedno razredno
djeljenje u nekoj školskoj godini
ide više učenika. Dakle, veza
između učenika i razreda je N :M i
kod takvih veza potrebno je kreirati
posebnu tablicu. Tablicu ćemo
nazvati Ucenici- Razredi, i u njoj
će se nalaziti samo strani ključevi
iz tablica Ucenici i Razredi.
 Takva tablica, koja služi samo kao
veza između dviju tablica ne mora
imati primarni ključ.
VEZE IZMEĐU ENTITETA I ATRIBUTA

 Primjer modela na konkretnim podacima iz zadatka.


 Ovakvu bazu podataka gdje su podaci raspoređeni u
više tablica, a veze među tablicama ostvarene
povezivanjem primarnih i stranih ključeva zvat ćemo
relacijskom bazom podataka.
 Osim relacijskog modela baze podataka postoje i
neki drugi modeli baza poput hijerarhijskog,
mrežnog, objektnog,...
ZADATAK.
SQL UPITI ZA MODELIRANJE PODATAKA
 SQL (engl. Structured Query Language)
 univerzalni jezik sličan ili u potpunosti jednak za većinu sustava za rad s bazama podataka
 jezik deklarativnog tipa u kojem se navodi što se želi dobiti, bez konkretnih instrukcija kako to dobiti
 Ispravno napisanu naredbu za dizajniranje baze ili rad s podacima nazivamo SQL upit (engl. SQL query)
 Većina sustava za rad s bazama podataka imaju grafička sučelja za modeliranje baze podataka: MS SQL, MySQL,
Oracle, MS Access,...
 Za rad s bazama podataka koristit ćemo SQLite. Čitava baza podataka može se sastojati od više tablica, a pristupa
joj se s pomoću drugih aplikacija npr. DB Browser for SQLite
 Osnovni tipovi podataka:
 INTEGER – cijeli brojevi
 TEXT – tekst ( string )
 BLOB – binarni zapis podataka, koristi se za zapis bilo koje vrste podataka kao što su slike, zvuk, tekst i slično, a najčešće se
koristi za zapis čitavih datoteka u nekoj bazi
 REAL – brojevi s decimalnom točkom
SQL UPITI ZA MODELIRANJE PODATAKA
 SQL upit za kreiranje tablice: Opcija pravilo odnosi se na neke dodatne parametre stupca.
Neki od parametara su:
• NOT NULL – pri dodavanju retka u tablicu vrijednost pripadnog stupca mora
CREATE TABLE ime_tablice biti unesena
( • PRIMARY KEY – stupac je primarni ključ
stupac1 tip podataka pravilo,
• DEFAULT – inicijalna vrijednost stupca ako se pri unosu ne unese vrijednost
stupac2 tip podataka pravilo,
stupac3 tip podataka pravilo, • AUTOINCREMENT – vrijednost polja se automatski poveća za 1
... • REFERENCES – za definiranje veza, između primarnih i stranih ključeva među
) tablicama
PYTHON I BAZE PODATAKA

 U Pythonu se možemo koristiti SQLite bazom podataka korištenjem modula sqlite3


 Osnovna funkcija ovog modula je funkcija connect(ime_datoteke) koja vraća objekt tipa Connection i povezuje
program s datotekom u kojoj se nalazi baza podataka
 Neke od definiranih metoda nad objektom:

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

Ime TEXT Polje ne smije biti


prazno
Prezime TEXT Polje ne smije biti
prazno
#SQLite nema tip podataka Date ili
DateTime, stoga smo za DatumRodenja
DatumRodenja TEXT predvidjeli da se zapisuje u obliku stringa
YYYY-MM-DD.
#Ako datum zapisujemo u obliku
DD.MM.YYYY. Za odredivanje koji je
datum prije nekog drugog koristit ćemo
klasu date i metode fromordinal() i
toordinal().
PYTHON I BAZE PODATAKA

 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)

 tablica_roditelj – naziv tablice u kojoj je pripadni stupac primarni ključ


 id – naziv primarnog ključa u tablici u kojoj se pripadni primarni ključ nalazi
PYTHON I BAZE PODATAKA

 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

IDGodine INTEGER Strani ključ u


tablici
SkolskeGodine
PYTHON I BAZE PODATAKA
PYTON I BAZE PODATAKA

 Nakon kreiranja, tablicu je moguće preimenovati upitom:

ALTER TABLE ime_tablice RENAME TO novo_ime_tablice

 Dodati stupac upitom:


ALTER TABLE ime_tablice ADD COLUMN ime_stupca tip_podataka pravilo

 Obrisati tablicu upitom:


DROP TABLE ime_tablice
PYTON I BAZE PODATAKA

 Zadatak. Napišimo upit kojim ćemo tablici Ucenici dodati stupac EmailAdresa koji će biti tipa TEXT.
SQL UPITI ZA RAD S PODATCIMA

 Četiri su osnovna SQL upita za rad s podacima:


 Dodavanje podataka
 Brisanje podataka
 Izmjena podataka
 Dohvaćanje podataka
UPIT INSERT

 Upit INSERT koristimo kada dodajemo podatke u tablicu

 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.

#Sve tablice imaju ID koji je cjelobrojnog tipa


i koji se povećava automatski prilikom dodavanja u
tablicu. Taj podatak možemo dobiti pozivanjem
svojstva lastrowid (c.lastrowid) nad kursorom
nakon izvođenja upita.
UPIT INSERT

 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.

SELECT Ime, Prezime, DatumRodenja


FROM Ucenici
WHERE Ime LIKE %a
ORDER BY Prezime ASC
UPIT SELECT

 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

 SQL upit DELETE koristimo za brisanje podataka iz tablice


 Opći oblik upita:
DELETE FROM ime_tablice
WHERE uvjet

 Zadatak. Napiši upit kojim ćeš obrisati sve nastavnike čiji je IDNastavnik 1,4,6 ili 7.

DELETE FROM Nastavnici


WHERE IDNastavnik IN (1, 4, 6, 7)
UPIT UPDATE

 Upit UPDATE koristimo za ažuriranje, odnosno izmjenu podataka u tablici.


 Opći oblik upita:

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

a) INSERT INTO Ucenici(Ime, Prezime, DatumRodenja) VALUES ('[Ime]', '[Prezime]', '[DatumRodenja]’)


b) INSERT INTO Nastavnici(Ime, Prezime) VALUES ('[Ime]', '[Prezime]')
c) INSERT INTO SkolskeGodine(Oznaka) VALUES ('[godina]')
d) Prvo treba u tablici Nastavnici pronaći IDNastavnika za tvog razrednika - [IDRazrednika], nadalje treba u tablici
SkolskeGodine pronaći ID trenutne školske godine – [IDGodine] a potom upit ima oblik:
INSERT INTO Razredi (Oznaka, IDNastavnika, IDGodine) VALUES ('[Oznaka]', [IDRazrednika], [IDGodine])
e) U tablici razredi potrebno je pronaći ID tvog razreda unutar zadane školske godine - IDRazreda a potom u tablici
Ucenici pronaći tvoj ID - IDUcenika. Upit će tada imati oblik:
INSERT INTO UceniciRazredi(IDUcenika, IDRazreda) VALUES ([IDUcenika], [IDRazreda])
RJEŠENJE

from sqlite3 import *

def dodajUcenika(ime, prezime, datumRodenja):


con = connect('skola.db’)
c = con.cursor()
upit = f'''INSERT INTO Ucenici (Ime, Prezime, DatumRodenja)
VALUES ("{ime}", "{prezime}", "{datumRodenja}")'‘’
c.execute(upit)
dodani = c.lastrowid
con.commit()
con.close()
print(f’Ucenik je dodan\nID dodanog ucenika je: {dodani}’)
return
SLOŽENI SELECT UPITI

 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

#Općenito, upit FROM A INNER JOIN B ON B.IDB = A.IDB


 Drugi, pravilniji način: vraća one zapise tablice A koji imaju pripadni zapis u tablici B i
SELECT r. Odjeljenje, s.Oznaka obrnuto.
FROM Razredi r
INNER JOIN SkolskeGodine s ON s.IDGodine = r.IDGodine
SLOŽENI SELECT UPITI

 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)

SELECT r.Odjeljenje, n.Ime, n.Prezime


FROM Razredi r
LEFT JOIN Nastavnici n ON n.IDNastavnika = r.IDNastavnika
LEFT JOIN SkolskeGodine s ON s.IDGodine = r.IDGodine
WHERE s.Oznaka = ‘2019./20.’
UGRAĐENE SQL FUNKCIJE
Funkcija Opis
count(s) broj zapisa
sum(s) zbroj vrijednosti
avg(s) srednja vrijednost
min(s) najmanja vrijednost
max(s) najveća vrijednost
date(‘now’) trenutni datum
time(‘now’) trenutno vrijeme
instr(s, s2) pozicija prvog pojavljivanja stringa s2 u stringu s
length(s) broj znakova u stringu
substr(s, p[, d]) vraća dio stringa počevši od znaka na mjestu p duljine d. Ako d nije zadan,
vraća dio stringa od znaka na mjestu p do kraja stringa. Brojenje znaka u stringu
započinje s indeksom 1.

replace(s, s1, s2) svako pojavljivanje stringa s1 u stringu zamjenjuje se stringom s2

|| 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.

SELECT count(r.IDRazreda), s.Oznaka


FROM Razredi r, SkolskeGodine s
WHERE s.IDGodine = r.IDGodine
GROUP BY s.Oznaka
ZADATAK ZA VJEŽBU
RJEŠENJE
a) CREATE TABLE Osoba (
IDOsobe INTEGER PRIMARY KEY AUTOINCREMENT,
Ime TEXT NOT NULL,
Prezime TEXT NOT NULL,
DatumRodenja TEXT )
b) --Treba biti kreirana tablica Knjige
CREATE TABLE Posudba (
IDPosudbe INTEGER PRIMARY KEY AUTOINCREMENT,
IDOsobe INTEGER REFERENCES Osoba (IDOsobe),
IDKnjige INTEGER REFERENCES Knjige (IDKnjige),
DatumPosudbe TEXT NOT NULL,
DatumPovratka TEXT )

c) ALTER TABLE Osobe ADD COLUMN Spol TEXT


d) INSERT INTO Osobe(Ime, Prezime, DatumRodenja, Spol)
VALUES('[Ime]', '[Prezime]', '[gggg-mm-dd]', '[spol]’)
e) SELECT Ime, Prezime
FROM Osobe
WHERE Ime LIKE '%a’
ORDER BY DatumRodenja ASC
f) DELETE FROM Knjige
WHERE IDKnjige = 7
g) UPDATE Posudbe
SET DatumPovratka = '[GGGG-MM-DD]’
WHERE IDPosudbe = 55
h) SELECT k.Naziv
FROM Knige k
LEFT JOIN Posudbe p ON p.IDKnjige = k.IDKnjige
LEFT JOIN Osoba o ON o.IDOsobe = p.IDOsobe
WHERE o.Ime = 'Marija’
AND o.Prezime = 'Jurić’
i) SELECT k.Naziv, count(p.IDKnjige)
FROM Knjige k
LEFT JOIN Posudbe p ON p.IDKnjige = k.IDKnjige
GROUP BY k.Naziv
j) SELECT o.Ime, o.Prezime, count(p.IDKnjige)
FROM Osobe o
LEFT JOIN Posudbe p ON p.IDOsobe = o.IDOsobe
GROUP BY o.Ime, o.Prezime
k) SELECT o.Ime, o.Prezime, count(p.IDKnjige)
FROM Osobe o
LEFT JOIN Posudbe p ON p.IDOsobe = o.IDOsobe
WHERE p.DatumPovratka is NULL
GROUP BY o.Ime, o.Prezime

You might also like