Zadatak
SQL upiti nad bazom biblioteke, knjige i pozajmice: rešen zadatak
Zadatak sa kolokvijuma iz predmeta Baze podataka (E1), FTN Novi Sad. Rešenje: Miloš Sarić
Baze podataka (E1), FTN Novi Sad
Zadatak
Data je šema baze podataka (S, I), gde skup S čine sledeće šeme relacija:
- Zanr({IDZ, NAZIVZ}, {IDZ})
- Knjiga({IDK, IDZ, NAZIVK, AUTORK, GODK, BRSTRK}, {IDK})
- Clan({IDC, IMEC, PRZC, KATC, OMILJENAKC}, {IDC})
- Pozajmica({IDP, IDC, IDK, VRACENAP}, {IDP})
a skup I sledeća ograničenja referencijalnog integriteta i domena:
- Knjiga[IDZ] ⊆ Zanr[IDZ]
- Clan[OMILJENAKC] ⊆ Knjiga[IDK]
- Pozajmica[IDC] ⊆ Clan[IDC]
- Pozajmica[IDK] ⊆ Knjiga[IDK]
- dom(KATC) = {D, U, R, P}
- dom(VRACENAP) = {D, N}
Značenje obeležja je sledeće:
- IDZ – identifikaciona oznaka žanra
- NAZIVZ – naziv žanra
- IDK – identifikaciona oznaka knjige
- NAZIVK – naziv knjige
- AUTORK – autor knjige
- GODK – godina izdavanja knjige
- BRSTRK – broj strana knjige
- IDC – identifikaciona oznaka člana
- IMEC – ime člana
- PRZC – prezime člana
- KATC – kategorija člana
- OMILJENAKC – omiljena knjiga člana
- IDP – identifikaciona oznaka pozajmice
- VRACENAP – da li je pozajmica vraćena
Prikazana je pojava nad datom šemom baze podataka:
| IDZ | NAZIVZ |
|---|---|
| 1 | edukativne knjige |
| 2 | naucna fantastika |
| 3 | knjige za decu |
| 4 | klasici |
| 5 | poezija |
| 6 | kuvari |
| 7 | biografije |
| 8 | kriminalisticki |
| 9 | putopisi |
| 10 | tinejdz |
| IDK | IDZ | NAZIVK | AUTORK | GODK | BRSTRK |
|---|---|---|---|---|---|
| 1 | 4 | Male zene | Luiza Mej Olkot | 2019 | 632 |
| 2 | 4 | Proces | Franc Kafka | 2018 | 322 |
| 3 | 3 | Put oko sveta za 80 dana | Zil Vern | 2020 | 282 |
| 4 | 3 | Carobnjak iz Oza | L. Frenk Baum | 2020 | 162 |
| 5 | 10 | Upomoc! Izgleda da sam se zaljubila | Robert Takaric | 2020 | 144 |
| 6 | 5 | Plavi cuperak | Miroslav Antic | 2015 | 160 |
| 7 | 5 | Hodajuci na rukama | Miroslav Antic | 2017 | 168 |
| 8 | 5 | Tako zamisljam nebo | Miroslav Antic | 2013 | 200 |
| 9 | 6 | U sve se mesa – ljubav | Zdravko Gavrilovic | 2017 | 64 |
| 10 | 6 | U lepinji – najbolji recepti | Zan-Fransoa Male | 2017 | 64 |
| 11 | 2 | Ledeni zmaj | Dzordz R. R. Martin | 2019 | 114 |
| IDC | OMILJENAKC | IMEC | PRZC | KATC |
|---|---|---|---|---|
| 1 | 2 | Marko | Kanazir | R |
| 2 | 9 | Miroslav | Jeremic | R |
| 3 | 4 | Ana | Maksimovic | D |
| 4 | 4 | Jovana | Lalic | D |
| 5 | NULL | Sonja | Vukovic | U |
| 6 | 1 | Jelena | Acanski | R |
| 7 | NULL | Ivan | Ignjic | U |
| 8 | 1 | Jelena | Krstic | P |
| 9 | 5 | Aleksandar | Tomic | D |
| 10 | 10 | Lana | Martinovic | R |
| IDP | IDC | IDK | VRACENAP |
|---|---|---|---|
| 1 | 1 | 1 | D |
| 2 | 1 | 1 | D |
| 3 | 1 | 4 | N |
| 4 | 9 | 1 | D |
| 5 | 9 | 9 | D |
| 6 | 2 | 9 | D |
| 7 | 8 | 10 | D |
| 8 | 6 | 10 | N |
| 9 | 4 | 4 | D |
| 10 | 4 | 5 | D |
| 11 | 4 | 3 | D |
| 12 | 8 | 10 | D |
- Prikazati knjige (IDK, NAZIVK), sortirane u rastućem redosledu naziva knjige.
- Prikazati sve različite autore (AUTORK) knjiga čija dužina je veća od 100 strana.
- Za pozajmice prikazati ime i prezime člana koji je knjigu iznajmio, kao i naziv knjige.
- Prikazati članove (IMEC, PRZC) koji su barem jednom pozajmili knjigu sa identifikacionim brojem 1, ali nisu nikada pozajmili knjigu sa identifikacionim brojem 4.
- Prikazati sve knjige (IDK, NAZIVK) koje je pozajmio barem jedan član, kao i broj pozajmljivanja te knjige.
- Svim knjigama kojima naziv počinje na slovo P povećati broj strana za 10.
- U tabelu Knjiga dodati kolonu OCENAK (prosečna ocena te knjige) čije vrednosti moraju biti u opsegu od 0 do 10.
- Prikazati članove (IDC, IMEC, PRZC) koji su pozajmili više od dve različite knjige.
- Za svaki žanr (IDZ, NAZIVZ) prikazati prosečan broj strana koje imaju knjige tog žanra. Ako za neki žanr ne postoji ni jedna knjiga, kao prosečan broj strana prikazati 0.
- Za svaki žanr (IDZ, NAZIVZ) prikazati ukupan broj iznajmljivanja knjiga tog žanra. Ako žanr nema ni jednu knjigu ili knjige tog žanra nisu ni jednom pozajmljene prikazati 0.
Rešenje
Šta se traži i kojim postupkom
Svaki upit se sastavlja istim redom: iz kojih tabela dolaze obeležja, kako se te tabele spajaju, koji redovi ostaju i kako se grupišu. Kada zadatak traži i žanrove ili knjige bez ijedne pozajmice, unutrašnji spoj nije dovoljan, pa ide LEFT JOIN. Svaki upit je pokrenut nad skriptama ovog zadatka, a ispod njega je dobijeni rezultat. Tamo gde nema ORDER BY, redosled redova nije zadat.
Upit 1
Redosled zadaje ORDER BY, a rastući je podrazumevan.
SELECT IDK, NAZIVK
FROM Knjiga
ORDER BY NAZIVK;| IDK | NAZIVK |
|---|---|
| 4 | Carobnjak iz Oza |
| 7 | Hodajuci na rukama |
| 11 | Ledeni zmaj |
| 1 | Male zene |
| 6 | Plavi cuperak |
| 2 | Proces |
| 3 | Put oko sveta za 80 dana |
| 8 | Tako zamisljam nebo |
| 10 | U lepinji – najbolji recepti |
| 9 | U sve se mesa – ljubav |
| 5 | Upomoc! Izgleda da sam se zaljubila |
Upit 2
Isti autor ima više knjiga, pa DISTINCT ostavlja svakog jednom. Knjige sa 100 strana ili manje, ovde kuvari, ne prolaze, pa ni njihovi autori.
SELECT DISTINCT AUTORK
FROM Knjiga
WHERE BRSTRK > 100;| AUTORK |
|---|
| Luiza Mej Olkot |
| Franc Kafka |
| Zil Vern |
| L. Frenk Baum |
| Robert Takaric |
| Miroslav Antic |
| Dzordz R. R. Martin |
Upit 3
Svaka pozajmica ima po jedan član i jednu knjigu, pa se od tabele Pozajmica spaja na obe strane. Marko Kanazir je istu knjigu pozajmio dva puta, pa je to dva reda.
SELECT C.IMEC, C.PRZC, K.NAZIVK
FROM Pozajmica P
JOIN Clan C ON C.IDC = P.IDC
JOIN Knjiga K ON K.IDK = P.IDK;| IMEC | PRZC | NAZIVK |
|---|---|---|
| Marko | Kanazir | Male zene |
| Marko | Kanazir | Male zene |
| Marko | Kanazir | Carobnjak iz Oza |
| Aleksandar | Tomic | Male zene |
| Aleksandar | Tomic | U sve se mesa – ljubav |
| Miroslav | Jeremic | U sve se mesa – ljubav |
| Jelena | Krstic | U lepinji – najbolji recepti |
| Jelena | Acanski | U lepinji – najbolji recepti |
| Jovana | Lalic | Carobnjak iz Oza |
| Jovana | Lalic | Upomoc! Izgleda da sam se zaljubila |
| Jovana | Lalic | Put oko sveta za 80 dana |
| Jelena | Krstic | U lepinji – najbolji recepti |
Upit 4
Dva uslova nad istim članom, pa svaki ide u svoj podupit. Knjigu 1 pozajmili su Marko Kanazir i Aleksandar Tomic, a Marko je pozajmio i knjigu 4, pa ostaje Aleksandar.
SELECT IMEC, PRZC
FROM Clan
WHERE IDC IN (SELECT IDC FROM Pozajmica WHERE IDK = 1)
AND IDC NOT IN
(SELECT IDC FROM Pozajmica WHERE IDK = 4);| IMEC | PRZC |
|---|---|
| Aleksandar | Tomic |
Upit 5
Unutrašnji spoj ostavlja samo pozajmljene knjige, a broj pozajmica je broj redova grupe.
SELECT K.IDK, K.NAZIVK, COUNT(*) AS BROJ_POZAJMICA
FROM Knjiga K
JOIN Pozajmica P ON P.IDK = K.IDK
GROUP BY K.IDK, K.NAZIVK;| IDK | NAZIVK | BROJ_POZAJMICA |
|---|---|---|
| 1 | Male zene | 3 |
| 3 | Put oko sveta za 80 dana | 1 |
| 4 | Carobnjak iz Oza | 2 |
| 5 | Upomoc! Izgleda da sam se zaljubila | 1 |
| 9 | U sve se mesa – ljubav | 2 |
| 10 | U lepinji – najbolji recepti | 3 |
Upit 6
Naziv koji počinje slovom P traži LIKE sa znakom % na kraju. Posle naredbe te knjige imaju ovoliko strana:
UPDATE Knjiga
SET BRSTRK = BRSTRK + 10
WHERE NAZIVK LIKE 'P%';| IDK | NAZIVK | BRSTRK |
|---|---|---|
| 2 | Proces | 332 |
| 3 | Put oko sveta za 80 dana | 292 |
| 6 | Plavi cuperak | 170 |
Upit 7
Kolona se dodaje naredbom ALTER TABLE, a opseg je ograničenje CHECK. Postojeći redovi dobijaju NULL, a unos ocene 11 baza odbija.
ALTER TABLE Knjiga
ADD OCENAK decimal(4, 2)
CONSTRAINT Knjiga_OCENAK_CK CHECK (OCENAK BETWEEN 0 AND 10);Upit 8
Traže se različite knjige, pa se broji COUNT sa DISTINCT. Marko Kanazir ima tri pozajmice, ali samo dve različite knjige, pa ostaje Jovana Lalic.
SELECT C.IDC, C.IMEC, C.PRZC
FROM Clan C
JOIN Pozajmica P ON P.IDC = C.IDC
GROUP BY C.IDC, C.IMEC, C.PRZC
HAVING COUNT(DISTINCT P.IDK) > 2;| IDC | IMEC | PRZC |
|---|---|---|
| 4 | Jovana | Lalic |
Upit 9
LEFT JOIN čuva žanrove bez knjiga. AVG im daje NULL, a COALESCE to pretvara u 0. BRSTRK je celobrojan, a SQL Server bi prosek celih brojeva zaokružio na ceo broj, pa se množi decimalnim brojem.
SELECT Z.IDZ, Z.NAZIVZ,
COALESCE(AVG(1.0 * K.BRSTRK), 0) AS PROSEK_STRANA
FROM Zanr Z
LEFT JOIN Knjiga K ON K.IDZ = Z.IDZ
GROUP BY Z.IDZ, Z.NAZIVZ;| IDZ | NAZIVZ | PROSEK_STRANA |
|---|---|---|
| 1 | edukativne knjige | 0 |
| 2 | naucna fantastika | 114 |
| 3 | knjige za decu | 222 |
| 4 | klasici | 477 |
| 5 | poezija | 176 |
| 6 | kuvari | 64 |
| 7 | biografije | 0 |
| 8 | kriminalisticki | 0 |
| 9 | putopisi | 0 |
| 10 | tinejdz | 144 |
Upit 10
Dva LEFT JOIN-a čuvaju žanrove bez knjiga i knjige bez pozajmica, a COUNT sa kolonom IDP preskače NULL, pa oni dobijaju 0.
SELECT Z.IDZ, Z.NAZIVZ, COUNT(P.IDP) AS BROJ_POZAJMICA
FROM Zanr Z
LEFT JOIN Knjiga K ON K.IDZ = Z.IDZ
LEFT JOIN Pozajmica P ON P.IDK = K.IDK
GROUP BY Z.IDZ, Z.NAZIVZ;| IDZ | NAZIVZ | BROJ_POZAJMICA |
|---|---|---|
| 1 | edukativne knjige | 0 |
| 2 | naucna fantastika | 0 |
| 3 | knjige za decu | 3 |
| 4 | klasici | 3 |
| 5 | poezija | 0 |
| 6 | kuvari | 5 |
| 7 | biografije | 0 |
| 8 | kriminalisticki | 0 |
| 9 | putopisi | 0 |
| 10 | tinejdz | 1 |
Rezultat
Upit 4 daje Aleksandra Tomica, a upit 8 Jovanu Lalic.
Najviše strana u proseku imaju klasici, 477, a žanrovi bez knjiga imaju 0.
Najviše pozajmica imaju kuvari, 5, a klasici i knjige za decu po 3.
Slični zadaci
Teme
Folder predmeta Baze podataka (E1)Na Drive-u: Predavanja (2020-21) · Vežbe (2020-21) · Probni testovi i kolokvijumi · Pravila ocenjivanja (2020-21) · Stari materijali (2019-20)
Ako si autor nečega što je ovde i želiš da se ukloni, piši mi na milossaric@outlook.com i uklanjam ga.