Primjer izvještaja o drugoj zadaći

 

 

Osnovne informacije

 

Ime baze: fakultet

Kratak opis baze: pohranjuju se podaci o studentima i nastavnicima nekog fakulteta te o predmetima koje oni upisuju odnosno predaju.

Popis tablica: STUDENT, NASTAVNIK, PREDMET, UPISAO.

 

 

Sadržaj tablica

 

STUDENT

+------------+----------+---------+------------+--------+

| JMBAG      | PREZIMES | IMES    | DATR       | GODINA |

+------------+----------+---------+------------+--------+

|   36398757 | Markovic | Marko   | 2001-09-05 | 1      |

| 1191203289 | Petrovic | Petar   | 2000-11-05 | 2      |

| 1192130031 | Horvat   | Dragica | 2000-05-12 | 2      |

| 1191205897 | Jankovic | Marija  | 2002-01-01 | 1      |

|  165043021 | Kolar    | Ivan    | 2000-02-27 | 3      |

|   36448430 | Grubisic | Katica  | 1999-09-11 | 3      |

|  246022858 | Vukovic  | Janko   | 2002-09-01 | 1      |

|  246022859 | Tokic    | Slavko  | 1999-02-04 | 4      |

|  246022875 | Vukovic  | Mirko   | 1998-07-21 | 4      |

|  246022888 | Puskarec | Janja   | 1996-07-29 | 5      |

+------------+----------+---------+------------+--------+

 

NASTAVNIK

+-------------+----------+--------+--------+-------+

| OIB         | PREZIMEN | IMEN   | BRSOBE | PLACA |

+-------------+----------+--------+--------+-------+

| 13257600947 | Cantor   | Georg  |    102 | 12000 |

| 25810043761 | Goedel   | Kurt   |    305 |  6000 |

| 33571209458 | Codd     | Edgar  |    127 |  8000 |

| 44102179316 | Klein    | Felix  |    252 | 12000 |

| 50076128203 | Pascal   | Blaise |    101 | 11000 |

| 67741205512 | Turing   | Alan   |    315 | 10000 |

| 67554120551 | Levinov  | Boris  |    315 |  9000 |

| 34571209458 | Lovelace | Ada    |    127 | 13000 |

+-------------+----------+--------+--------+-------+

 

PREDMET

+-------+-----------------------+-------------+----------+------+

| SIFRA | NASLOV                | OIB         | SEMESTAR | ECTS |

+-------+-----------------------+-------------+----------+------+

| 56001 | Baze podataka         | 33571209458 | L        |    5 |

| 72001 | Linearna algebra      | 44102179316 | Z        |    6 |

| 72005 | Matematicka analiza   | 25810043761 | L        |    6 |

| 56002 | Programiranje u C-u   | 67741205512 | Z        |    5 |

| 72009 | Analiticka geometrija | 44102179316 | L        |    5 |

| 56000 | Programiranje         | 44102179316 | L        |    5 |

+-------+-----------------------+-------------+----------+------+

 

UPISAO

+------------+-------+------------+--------+

| JMBAG      | SIFRA | DATU       | OCJENA |

+------------+-------+------------+--------+

|   36398757 | 72001 | 2020-09-05 | NULL   |

| 1191203289 | 56001 | 2019-10-03 | 3      |

| 1191203289 | 56002 | 2019-10-03 | 2      |

| 1192130031 | 72001 | 2019-09-15 | 5      |

| 1192130031 | 56002 | 2019-09-15 | 4      |

| 1192130031 | 72009 | 2019-09-15 | 2      |

| 1191205897 | 72009 | 2020-09-05 | NULL   |

|  165043021 | 56001 | 2018-10-03 | 3      |

|  165043021 | 72001 | 2018-10-03 | 4      |

|  165043021 | 56002 | 2019-06-10 | NULL   |

|   36448430 | 56001 | 2019-09-04 | 5      |

|  246022858 | 56001 | 2020-09-03 | NULL   |

|  246022858 | 72001 | 2020-09-03 | NULL   |

|  246022858 | 56002 | 2020-09-25 | NULL   |

|  246022858 | 72009 | 2020-09-25 | NULL   |

|  246022888 | 72009 | 2020-09-25 | 5      |

| 1191203289 | 72001 | 2017-10-01 | 3      |

|  165043021 | 56000 | 2019-06-10 | NULL   |

+------------+-------+------------+--------+

 

 

Upit 1

 

SQL naredba:

 

SELECT OIB, CONCAT(SUBSTRING(IMEN, 1, 1), '. ', SUBSTRING(PREZIMEN, 1, 1), '.') 'Inicijali'

FROM NASTAVNIK ORDER BY OIB;

 

Rezultat izvođenja naredbe:

 

+-------------+-----------+

| OIB         | Inicijali |

+-------------+-----------+

| 13257600947 | G. C.     |

| 25810043761 | K. G.     |

| 33571209458 | E. C.     |

| 34571209458 | A. L.     |

| 44102179316 | F. K.     |

| 50076128203 | B. P.     |

| 67554120551 | B. L.     |

| 67741205512 | A. T.     |

+-------------+-----------+

 

Što upit vraća: Vrijednosti OIB-a te inicijali svih nastavnika, uzlazno sortirano po vrijednosti OIB-a.

 

Kako upit radi: Izlazna tablica s dva stupca, OIB i Inicijali, formira se na sljedeći način. Za svaki redak tablice NASTAVNIK dodajemo po jedan novi redak u izlaznu tablicu. Vrijednost OIB u novom retku je vrijednost OIB u retku tablice NASTAVNIK. Vrijednost Inicijali računa se konkatenacijom sljedećih vrijednosti: prvo slovo stringa IMEN (podniz stringa IMEN koji počinje na indeksu 1 i duljina mu je 1), točka i razmak, prvo slovo stringa PREZIMEN, točka. Konačno, izlaznu tablicu sortiramo po vrijednosti OIB-a.

 

 

Upit 2

 

SQL naredba:

 

SELECT COUNT(*) Broj FROM UPISAO, PREDMET, NASTAVNIK

WHERE UPISAO.OCJENA = 5 AND UPISAO.SIFRA = PREDMET.SIFRA

AND PREDMET.OIB = NASTAVNIK.OIB AND NASTAVNIK.PREZIMEN = 'Goedel';

 

Rezultat izvođenja naredbe:

 

+------+

| Broj |

+------+

|    0 |

+------+

 

Što upit vraća: broj potpuno uspješno položenih ispita (tj. ocjenom 5) na kolegijima profesora Goedela.

 

Kako upit radi: Prvo formiramo pomoćnu tablicu T koja je Kartezijev produkt tablica UPISAO, PREDMET i NASTAVNIK. Potom kreiramo novu pomoćnu tablicu U u koju dodajemo točno one retke R tablice T koji ispunjavaju uvjete da je atribut OCJENA retka R jednaka 5, atribut SIFRA koji je potekao iz faktora UPISAO jednak atributu SIFRA koji je potekao iz faktora PREDMET, atribut OIB koji je potekao iz faktora PREDMET jednak atributu OIB koji je potekao iz faktora NASTAVNIK te konačno atribut PREZIMEN jednak 'Goedel'. Izlaznu tablicu čini jedan stupac, Broj, s jedinim retkom: broj redaka tablice U.

 

 

Upit 3

 

SQL naredba:

 

SELECT SEMESTAR, AVG(ECTS) 'Prosjecni bodovi' FROM PREDMET

WHERE EXISTS (SELECT * FROM UPISAO WHERE PREDMET.SIFRA = UPISAO.SIFRA)

GROUP BY SEMESTAR;

 

Rezultat izvođenja naredbe:

 

+----------+------------------+

| SEMESTAR | Prosjecni bodovi |

+----------+------------------+

| Z        |           5.5000 |

| L        |           5.0000 |

+----------+------------------+

 

Što upit vraća: Za svaki semestar, oznaka semestra i prosječan broj ECTS bodova kolegija u tom semestru, ali bez kolegija koje nitko nije upisao.

 

Kako upit radi:  Za svaki redak R tablice PREDMET odabiremo hoćemo li ga dodati u pomoćnu tablicu T, ovisno o tome je li ispunjen uvjet EXISTS (SELECT * FROM UPISAO WHERE PREDMET.SIFRA = UPISAO.SIFRA). Provjeru uvjeta radimo gradnjom pomoćne tablice U. Tablica U sastoji se od redaka tablice UPISAO čija je vrijednost atributa SIFRA jednaka vrijednosti atributa SIFRA retka R. Ako i samo ako postoji barem jedan redak u tako formiranoj tablici U, redak R dodajemo u tablicu T. Potom u tablici T grupiramo retke u skupine s obzirom na međusobno jednaku vrijednost atributa SEMESTAR. Izlazna tablica s dva stupca, SEMESTAR i Inicijali, formira se na sljedeći način. Za svaku spomenutu skupinu u tablici T dodajemo po jedan redak u izlaznu tablicu. Vrijednost SEMESTAR tog retka jednaka je vrijednosti SEMESTAR redaka u skupini. Vrijednost 'Prosjecni bodovi' računa se kao aritmetička sredina svih redaka u skupini, ignorirajući eventualne retke s NULL vrijednostima.

 

 

Upit 4

 

SQL naredba:

 

SELECT YEAR(S1.DATR) Godina, COUNT(*) 'Broj odabira' FROM STUDENT S1, STUDENT S2

WHERE S1.JMBAG < S2.JMBAG AND YEAR(S1.DATR) = YEAR(S2.DATR)

GROUP BY YEAR(S1.DATR)

HAVING COUNT(*) > 2;

 

Rezultat izvođenja naredbe:

 

+--------+--------------+

| Godina | Broj odabira |

+--------+--------------+

|   2000 |            3 |

+--------+--------------+

 

Što upit vraća: Za svaku godinu ispisuje broj mogućih odabira dvočlanih skupova studenata koji su oboje rođeni te godine, i to samo za godine za koje postoji barem dva moguća takva skupa.

 

Kako upit radi: Prvo formiramo pomoćnu tablicu T koja je Kartezijev produkt tablica STUDENT (alias S1) i STUDENT (alias S2). Potom kreiramo novu pomoćnu tablicu U u koju dodajemo točno one retke R tablice T koji ispunjavaju uvjete da je atribut JMBAG koji je potekao iz faktora S1 manji od atributa JMBAG koji je potekao iz faktora S2, a atribut DATR koji je potekao iz faktora S1 jednak atributu DATR koji je potekao iz faktora S2. Tako dobivena tablica U grupira se po skupinama ovisno o vrijednosti atributa DATR.  Izlaznu tablicu čine stupci Godina i 'Broj odabira', te ju formiramo tako da za svaku skupinu s barem tri retka dodajemo po jedan redak u izlaznu tablicu. Atribut Godina treba biti godina iz datuma DATR, a atribut 'Broj odabira' broj redaka u skupini.

 

 

Primjedbe

 

Gornji upiti ispunjavaju tražene uvjete na sljedeći način:

●       barem tri upita moraju kombinirati podatke iz dviju ili više tablica: upiti 2, 3 i 4;

●       barem jedan mora kombinirati podatke iz tri ili više tablica: upit 2;

●       barem dva moraju sadržavati klauzulu GROUP BY: upiti 3 i 4;

●       barem jedan mora sadržavati ugniježđene SELECT naredbe: upit 3.