Zadatak
SQL upiti nad bazom studenata i predmeta: rešen zadatak
Zadatak sa probnog testa iz predmeta Baze podataka (E1), FTN Novi Sad, 5. maja 2020. 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:
- Odsek({IDO, NAZO}, {IDO})
- Student({IDS, IMES, PREZS, GOD, IDO}, {IDS})
- Predmet({SPR, NAZP, SEM}, {SPR})
- Polozio({IDS, SPR, OCENA}, {IDS+SPR})
a skup I sledeća ograničenja referencijalnog integriteta:
- Student[IDO] ⊆ Odsek[IDO]
- Polozio[IDS] ⊆ Student[IDS]
- Polozio[SPR] ⊆ Predmet[SPR]
Značenje obeležja je sledeće:
- IDO – šifra odseka
- NAZO – naziv odseka
- IDS – šifra studenta
- IMES – ime studenta
- PREZS – prezime studenta
- GOD – godina u koju je upisan student
- SPR – šifra predmeta
- NAZP – naziv predmeta
- SEM – semestar u kom se predaje predmet
- OCENA – ocena sa kojom je student položio predmet
Prikazana je pojava nad datom šemom baze podataka:
| IDO | NAZO |
|---|---|
| O1 | Gradjevina |
| O2 | Masinstvo |
| O3 | Elektrotehnika |
| O4 | Racunarstvo |
| IDS | IMES | PREZS | GOD | IDO |
|---|---|---|---|---|
| S1 | Sava | Savic | 1 | O1 |
| S2 | Mara | Maric | 2 | O1 |
| S3 | Petar | Peric | 1 | O2 |
| S4 | Mira | Ilic | 3 | O4 |
| S5 | Ivan | Ivic | 3 | O4 |
| SPR | NAZP | SEM |
|---|---|---|
| P1 | Analiza 1 | 1 |
| P2 | Analiza 2 | 2 |
| P3 | Logika | 1 |
| P4 | Baze podataka | 3 |
| P5 | Informacioni sistemi | 4 |
| IDS | SPR | OCENA |
|---|---|---|
| S1 | P1 | 8 |
| S1 | P3 | 9 |
| S4 | P4 | 10 |
| S5 | P5 | 7 |
| S4 | P3 | 10 |
| S4 | P5 | 8 |
| S5 | P4 | 9 |
| S2 | P3 | 7 |
| S2 | P4 | 6 |
| S2 | P5 | 10 |
- Prikazati šifru, ime i prezime studenata (IDS, IMES, PREZS), sortirane u rastućem redosledu imena i prezimena.
- Prikazati različita imena studenata (IMES), koji imaju 10 iz nekog predmeta.
- Za položene ispite prikazati nazive predmeta (NAZP), imena i prezimena studenata (IMES, PREZS) koji su ih položili i ocenu koju su dobili (OCENA).
- Prikazati studente (IMES, PREZS) koji su položili neki predmet sa ocenom 10, a nisu položili ni jedan sa ocenom 8.
- U tabelu Polozio dodati kolonu BODOVI (broj osvojenih bodova na ispitu) koja ne sme da ima vrednost manju od 51.
- Prikazati predmete (NAZP), koje je položio bar jedan student, i broj studenata koji su ih položili.
- Svim predmetima čiji naziv počinje sa Analiza uvećati semestar za jedan.
- Prikazati studente (IMES, PREZS) koji imaju više od dva položena ispita.
- Za svaki predmet (SPR, NAZP) prikazati prosečnu ocenu na predmetu. Ukoliko predmet nije položio nijedan student, umesto prosečne ocene prikazati 0.
- Za svaki Odsek (NAZO) prikazati prosečnu ocenu studenata tog odseka. Ako odsek nema studenata ili ako nijedan student odseka nije položio nijedan predmet, ispisati 0 na mestu prosečne ocene.
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 predmete ili odseke bez ijednog položenog ispita, unutrašnji spoj nije dovoljan, pa ide LEFT JOIN. Svaki upit je pokrenut nad tabelama i podacima ovog testa, a ispod njega je dobijeni rezultat. Tamo gde nema ORDER BY, redosled redova nije zadat.
Upit 1
Redosled zadaje ORDER BY: prvo po imenu, pa među istim imenima po prezimenu. Rastući redosled je podrazumevan.
SELECT IDS, IMES, PREZS
FROM Student
ORDER BY IMES, PREZS;| IDS | IMES | PREZS |
|---|---|---|
| S5 | Ivan | Ivic |
| S2 | Mara | Maric |
| S4 | Mira | Ilic |
| S3 | Petar | Peric |
| S1 | Sava | Savic |
Upit 2
Ime je u tabeli Student, a ocena u tabeli Polozio, pa se spajaju po IDS. Isto ime može da se pojavi više puta, pa DISTINCT ostavlja svako jednom.
SELECT DISTINCT S.IMES
FROM Student S
JOIN Polozio P ON P.IDS = S.IDS
WHERE P.OCENA = 10;| IMES |
|---|
| Mira |
| Mara |
Upit 3
Ocena je u tabeli Polozio, ime i prezime u tabeli Student, a naziv u tabeli Predmet, pa se spajaju sve tri, po spoljnim ključevima iz tabele Polozio.
SELECT Pr.NAZP, S.IMES, S.PREZS, Po.OCENA
FROM Polozio Po
JOIN Student S ON S.IDS = Po.IDS
JOIN Predmet Pr ON Pr.SPR = Po.SPR;| NAZP | IMES | PREZS | OCENA |
|---|---|---|---|
| Analiza 1 | Sava | Savic | 8 |
| Logika | Sava | Savic | 9 |
| Baze podataka | Mira | Ilic | 10 |
| Informacioni sistemi | Ivan | Ivic | 7 |
| Logika | Mira | Ilic | 10 |
| Informacioni sistemi | Mira | Ilic | 8 |
| Baze podataka | Ivan | Ivic | 9 |
| Logika | Mara | Maric | 7 |
| Baze podataka | Mara | Maric | 6 |
| Informacioni sistemi | Mara | Maric | 10 |
Upit 4
To su dva uslova nad istim studentom, a ne nad istim redom tabele Polozio, pa svaki ide u svoj podupit. Mira Ilic ima i desetke i osmicu, pa ostaje samo Mara Maric.
SELECT IMES, PREZS
FROM Student
WHERE IDS IN (SELECT IDS FROM Polozio WHERE OCENA = 10)
AND IDS NOT IN
(SELECT IDS FROM Polozio WHERE OCENA = 8);| IMES | PREZS |
|---|---|
| Mara | Maric |
Upit 5
Kolona se dodaje naredbom ALTER TABLE, a donja granica je ograničenje CHECK. Postojeći redovi dobijaju NULL, koji CHECK propušta, a unos vrednosti 50 baza odbija.
ALTER TABLE Polozio
ADD BODOVI integer
CONSTRAINT Polozio_BODOVI_CK CHECK (BODOVI >= 51);Upit 6
Unutrašnji spoj ostavlja samo predmete koje je neko položio, pa Analiza 2 ne ulazi u rezultat. Grupiše se i po šifri, jer dva predmeta mogu imati isti naziv.
SELECT Pr.NAZP, COUNT(*) AS BROJ_STUDENATA
FROM Predmet Pr
JOIN Polozio Po ON Po.SPR = Pr.SPR
GROUP BY Pr.SPR, Pr.NAZP;| NAZP | BROJ_STUDENATA |
|---|---|
| Analiza 1 | 1 |
| Logika | 3 |
| Baze podataka | 3 |
| Informacioni sistemi | 3 |
Upit 7
Naziv koji počinje sa Analiza traži LIKE sa znakom % na kraju. Posle naredbe predmeti imaju ove semestre:
UPDATE Predmet
SET SEM = SEM + 1
WHERE NAZP LIKE 'Analiza%';| SPR | NAZP | SEM |
|---|---|---|
| P1 | Analiza 1 | 2 |
| P2 | Analiza 2 | 3 |
| P3 | Logika | 1 |
| P4 | Baze podataka | 3 |
| P5 | Informacioni sistemi | 4 |
Upit 8
Broj položenih ispita je broj redova grupe, a uslov nad grupom ide u HAVING, ne u WHERE.
SELECT S.IMES, S.PREZS
FROM Student S
JOIN Polozio P ON P.IDS = S.IDS
GROUP BY S.IDS, S.IMES, S.PREZS
HAVING COUNT(*) > 2;| IMES | PREZS |
|---|---|
| Mara | Maric |
| Mira | Ilic |
Upit 9
LEFT JOIN čuva i predmet bez položenih ispita, sa NULL umesto ocene. Funkcija AVG ga preskače i vraća NULL, a COALESCE ga pretvara u 0. OCENA je celobrojna, a SQL Server bi prosek celih brojeva zaokružio na ceo broj, pa se ocena prvo množi decimalnim brojem.
SELECT Pr.SPR, Pr.NAZP,
COALESCE(AVG(1.0 * Po.OCENA), 0) AS PROSEK
FROM Predmet Pr
LEFT JOIN Polozio Po ON Po.SPR = Pr.SPR
GROUP BY Pr.SPR, Pr.NAZP;| SPR | NAZP | PROSEK |
|---|---|---|
| P1 | Analiza 1 | 8 |
| P2 | Analiza 2 | 0 |
| P3 | Logika | 8,67 |
| P4 | Baze podataka | 8,33 |
| P5 | Informacioni sistemi | 8,33 |
Upit 10
Od odseka se ide preko studenata do ispita, sa dva LEFT JOIN-a, da bi ostali i odseci bez studenata i studenti bez ispita. Elektrotehnika nema studenata, a jedini student Masinstva nema položen ispit, pa oba odseka imaju 0.
SELECT O.NAZO,
COALESCE(AVG(1.0 * Po.OCENA), 0) AS PROSEK
FROM Odsek O
LEFT JOIN Student S ON S.IDO = O.IDO
LEFT JOIN Polozio Po ON Po.IDS = S.IDS
GROUP BY O.IDO, O.NAZO;| NAZO | PROSEK |
|---|---|
| Gradjevina | 8 |
| Masinstvo | 0 |
| Elektrotehnika | 0 |
| Racunarstvo | 8,80 |
Rezultat
Upit 4 daje Maru Maric, a upit 8 Maru Maric i Miru Ilic.
Najveći prosek po predmetima ima Logika, 8,67, a Analiza 2 nema položenih ispita, pa ima 0.
Prosek po odsecima: Racunarstvo 8,80, Gradjevina 8, a Masinstvo i Elektrotehnika 0.
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.