Anda di halaman 1dari 6

****************************************************************************************************************************************************************************

****** NAPOMENA 1: ovo je gradivo iz akadamske godine 2012. (ja sam bila u grupi asistentice Karage) - mo!da se tokom godina ne"to promijenilo!
****** NAPOMENA 2: sve nakon znaka // je komentar koji sam si ja zapisala - zna#i, mo!da je ne"to krivo =)
****** NAPOMENA 3: negdje su reference na slike u bilje!nici - slika naravno ovdje nema =)
****************************************************************************************************************************************************************************

VJE!BE 1
RELACIJSKO MODELIRANJE BAZA PODATAKA
Ralacijski model zasnovan je na matemati#kom pojmu relacije. Relacije = podaci i veze prikazani tablicom
ENTITETI = podaci (objekti) od interesa
VEZE = odnosi me$u njima
ATRIBUTI = svojstva entiteta i veza
KLJU! = atribut (ili vi"e njih) koji opisuje entitet na jedinstven na#in
Analiza potreba --> Modeliranje entiteta i veza --> Pretvorba u relacije --> Normalizacija relacije

// predradnje prije izrade same baze podataka

Primjer BOLNICA
1) Analiza potreba (vidi web)
2) Modeliranje entiteta i veza (http://web.math.pmf.unizg.hr/~karaga/bpprvo.html)
Podtip= entitet koji ima sve atribute kao i nadre$eni tip plus neke dodatne. Podtip uvijek ima isti klju# kao nadre$eni tip i u njega (u podtip) upisujemo samo njegove dodatne atribute.
1:N vi"e veza = veza 1 primjerka atributa s vi"e njih
N:M veza = veza vi"e s vi"e
JE veza je 1:1 veza izme$u podtipa i nadre$enog tipa

// npr 1 kirurg obavlja N operacija

http://web.math.pmf.unizg.hr/~karaga/vj1bp.jpg
kvadrati% = entiteti
dijamanti% = veze
// ako se iz konteksta vidi veza, crtamo samo crtice, ina#e i strelicu: Mo!emo crtati strelicu uvijek, to je lijepo =)
3) Pretvorba u relacije
Svaki entitet prikazuje se jednom relacijom
KIRURG (IME_KIRURGA, ADRESA_KIRURGA, BROJ_TELEFONA) // podcrtani atribut je klju# !!
KONZULTANT (IME_KIRURGA, SPECIJALNOST)
PACIJENT (ID_PACIJENTA, IME PACIJENTA, ADRESA_PACIJENTA, DATUM_RO&ENJA, SPOL, ID_SOBE)
PRIVATNI _PACIJENT (ID_PACIJENTA, ID_PRIVATNE_SOBE, IME_KIRURGA)
SESTRA (ID_SESTRE, IME_SESTRE, STRU'NI_STUPANJ)
SOBA (ID_SOBE, TIP_SOBE, BROJ_KREVETA)
SALA (ID_SALE, TIP_SALE)
OPERACIJA (ID_OPERACIJA, TIP_OPERACIJE, DATUM, VRIJEME, IME_KIRURGA, ID_SALE, ID_PACIJENTA)
ASISTIRA (ID_OPERACIJA, IME_KIRURGA, ULOGA) <-- N:M veza (N:M veze se realiziraju kao posebne relacije s oba klju#a)
//to zna#i da je N:M veza veza izme$u 2 entiteta
ZADU(ENA_ZA_SOBU (ID_SESTRE, ID_SOBE, DATUM_ZADU(IVANJA) *
ZADU(ENA_ZA_SALU (ID_SESTRE, ID_SALE, DATUM_ZADU(AVANJA) *
NADGLEDA (IME_KIRURGA_NADGLEDANOG, IME_KIRURGA_KONZULTANTA) *
// ne mo!emo promijeniti ime klju#a, ali u kompu postoji na#in da se zna od kud dolazi i to
referencijom iz tablice
* 1:N veza s neobaveznim #lastvom, sadr!e klju# s N strane kao klju# i klju# s 1 strane kao atribut
1:N veze s obaveznim #lanstvom se realiziraju ubacivanjem klju#a s 1 strane kao atributa u relaciju entiteta s N strane.
4) Normalizacija relacija // pretvaranje reklacija (po nekim pravilima) u relacije koje zadovoljavaju formu
Na"a relacijska shema zadovoljava ve% 4NF (#etvrtu normalnu formu) pa ne moramo ni"ta raditi.
Napomena o http://web.math.pmf.unizg.hr/~karaga/bp1novoorig.jpg -- Reducirani Chenov dijagram // TO CRTAMO U KOLOKVIJU, zada%a=svejedno
_SLIKA BILJE(NICA_ !!!!
// razlike: 1) N zamijenjen s M, 2) od_kud do_kud
0 i 1 odre$uju obavezno i neobavezno #lasntvo.
// 0 = neobavezno, 1 = obavezno #lanstvo
Ovdje operacija ima obavezno #lanstvo zbog jedinice podebljane na crte!u u bilje!nici
http://web.math.pmf.unizg.hr/~karaga/vj1bpnovo1.jpg

// ove s to#kama imaju obavezno #lanstvo

===============================================================================================================
NORMALNE FORME ZA RELACIJE
-hijerarhijski oganizirani
1) Pretvorba u 1NF - eliminacija podzapisa // npr kada u jednu ku%icu treba upisati vi"e stvari (npr imena djece) se zove podzapis - to ne !elimo
- podzapis se pojavljuje kada imamo atribute koji mogu imati vi"e vrijednosti za istu vrijednost klju#a
Zad 1 Promatramo zapis o suradniku neke firme i njegovoj djeci: vidi zapis. Pretvorite taj zapis u 1NF.
SLIKA_ BILJE(NICA
RJE)ENJE:
SURADNIK (MATICNI_BROJ, IME_I_PREZIME, GODINA_RODJENJA_SURADNIKA)
DIJETE (MATICNI_BROJ, IME_DJETETA, GODINA_RODJENJA_DJETETA)
QED
Op%enito: slika bilje!nica (ona s ABCDEF)

VJE!BE 2
http://web.studenti.math.pmf.unizg.hr/~fireball/fax/baze_forme.txt

2) Pretvorba u 2NF (eliminacija parcijalne ovisnosti)


- neki atribut(i) ovisi samo o dijelu klju#a
(slika 2.1)
ZAD2
CJENIK (BR_DJELA, BR_DOBAVLJACA, IME_DOBAVLJACA, ADRESA_DOBAVLJACA, CIJENA)
RJ
da li je 1NF zadovoljena? da :)
2NF? imamo parcijalnu ovisnost // jel ima ne"to "to ovisi samo o dijelu klju#a? da pa imamo parc ovisnost
BR_DOBAVLJACA ---> IME_DOBAVLJACA

BR_DOBAVLJACA ---> ADRESA_DOBAVLJACA


CJENIK (BR_DJELA, BR_DOBAVLJACA, CIJENA)
DOBAVLJAC (BR_DOBAVLJACA, IME_DOBAVLJACA, ADRESA_DOBAVLJACA)
ZAD3
http://web.math.pmf.unizg.hr/~karaga/bpzadtablica2.html
// zbog !utih redaka nije jedinstveno odre$eno- pa uzmem prva 3 stupca za klju#
KATALOG (MARKA_AUTA, MODEL_AUTA, ZAPREMNINA_MOTORA, SLOBODNIH_KOMADA, KATEGORIJA_CIJENE)
RJ
1NF? :)
2NF? Pretp da kategorija cijena ovisi samo o zapremnini motora. Tada imamo parcijalnu ovisnost ZAPREMNINA_MOTORA --> KATEGORIJA_CIJENE
KATALOG (MARKA_AUTA, MODEL_AUTA, ZAPREMNINA_MOTORA, SLOBODNIH_KOMADA)
TARIFA (ZAPREMNINA_MOTORA, KATEGORIJA_CIJENE)
// to nije logi#no ali da radimo logi#no, ne bi imali "to rije"iti u zadatku :)
================================================================
3) Pretvorba u 3NF (eliminacija tranzitivne ovisnosti) // atributi ovise jedan od drugih, izgledaju kao vlaki%
- kad atributi ovise jedni o drugima
(slika 2.2)
================================================================
ZAD4
SURADNIK(MATICNI_BROJ, IME_I_PREZIME, PLACA, BROJ_PROJEKTA, ROK_ZAVRSETKA_PROJEKTA)
RJ
1NF :) // jel bi ne"to moglo biti vi"estruko? pa ne ba" jer imamo mati#ni broj pa nas ime_i _prezime ne zeza; isto s pla%om. Broj projekta i rok zavr"etka su ok jer "Pritom jedan suradnik radi
na tocno jednom projektu"
2NF :) // trivijalno zadovoljeno
3NF? tranzitivna ovisnost
MATICNI_BROJ --> BROJ_PROJEKTA --> ROK_ZAVRSETKA_PROJEKTA
SURADNIK(MATICNI_BROJ, IME_I_PREZIME, PLACA, BROJ_PROJEKTA)
PROJEKT (BROJ_PROJEKTA, ROK_ZAVRSETKA_PROJEKTA)
ZAD5
KNJIGE(ISBN, NASLOV, PRVI_AUTOR, IME_IZDAVACA, MJESTO_IZDAVANJA)
RJ
Pretostavimo da istu knjigu uvijek izdaje isti izdava# i da izdava# ima samo jedno mjesto izdavanja
1NF :)
2NF :)
3NF? tranzitivna ovisnost
ISBN --> IME_IZDAVACA --> MJESTO_IZDAVANJA
KNJIGE(ISBN, NASLOV, PRVI_AUTOR, IME_IZDAVACA)
IZDAVAC (IME_IZDAVACA, MJESTO_IZDAVANJA)
ZAD6
http://web.math.pmf.unizg.hr/~karaga/bpzadtablica1.html // tu je slika:
|
===========================================
=============|
BR_ISPOR DATUM_SL BR_KU IME_KU ADRESA_K BR_PROIZ IME_PROIZ KOMA CIJENA_PO_KO
UKE
ANJA
PCA
PCA
UPCA
VODA
VODA
DA
MADU
RJ
1NF: ISPORUKA (BR_ISPORUKE, DATUM_SLANJA, BR_KUPCA, IME_KUPCA, ADRESA_KUPCA)
DETALJI_ISPORUKE (BR_ISPORUKE, BR_PROIZVODA, IME_PROIZVODA, KOMADA, CIJENA_PO_KOMADU)
ISPOR
UKA

2NF: ISPORUKA :)
DETALJI_ISPORUKE: parc. ovisnost:
BROJ_PROIZVODA --> IME_PROIZVODA
DETALJI_ISPORUKE (BR_ISPORUKE, BR_PROIZVODA, KOMADA, CIJENA_PO_KOMADU)
PROIZVOD (BR_PROIZVODA, IME_PROIZVODA)
3NF ? // trebamo provjeriti ove sa +
PROIZVOD :)
DETALJI_ISPORUKE :)
ISPORUKA tranz.ovisnosti
BR_ISPORUKE --> BR_KUPCA --> IME_KUPCA
BR_ISPORUKE --> BR_KUPCA --> ADRESA_KUPCA
ISPORUKA (BR_ISPORUKE, DATUM_SLANJA, BR_KUPCA)
KUPAC (BR_KUPCA, IME_KUPCA, ADRESA_KUPCA)
kona#no rje"enje ne ovo rozo
// ako 2 imaju iste klju#eve, onda kao kona#no rje"enje to trpam u isti ko"
================================================================
4) Pretvorba u BCNF (eliminacija postojanja determinante koja nije kandidat za klju#) (BC = Boyce_Codd)
- kad klju# ovisi o ne#emu (atribut) van klju#a
(slika 2.3)
================================================================
ZAD7
RASPORED(BR_PREDAVAONICE, VREMENSKI_TERMIN, BR_KOLEGIJA)
RJ
1NF, 2NF, 3NF :)
BCNF: BR_KOLEGIJA --> BR_PREDAVAONICE // pa BR_PREDAVAONICE nije ok kao klju#
RASPORED(BR_PREDAVAONICE, VREMENSKI_TERMIN)
RASPORED2(BR_KOLEGIJA, BR_PREDAVAONICE)
================================================================
5) Pretvorba u 4NF (eliminacija vi"ezna#ne ovisnosti)
- elementi klju#a ovise jedan o drugom
(slika 2.4)
================================================================
ZAD8
IZBOR(BR_INDEKSA, BR_M_KOLEGIJA, BR_R_KOLEGIJA)
RJ
1NF, 2NF, 3NF, BCNF :)
5NF: vi"ezna#ne ovisnosti:
BR_INDEKSA --> BR_M_KOLEGIJA
BR_INDEKSA --> BR_R_KOLEGIJA
IZBORM (BR_INDEKSA, BR_M_KOLEGIJA)

+
+

IZBORR (BR_INDEKSA, BR_R_KOLEGIJA)

================================================================
~SQL - JEDNOSTAVNI UPITI~
SQL = Structured Query Language
MySQL = besplatan, http://web.math.pmf.unizg.hr/~karaga/bplinkovi.html

// mi %emo raditi preko studenta

ULAZ putty-->student --> mysql


IZLAZ exit;
NAREDBE:
SHOW DATABASES; // kaj sve ima nutra
USE fakultet;
SHOW TABLES;
Relacijska shema baze fakultet
STUDENT (JMBAG, PREZIMES, IMES, DATR, GODINA)
NASTAVNIK (OIB, PREZIMEN, IMEN, BRSOBE, PLACA)
PREDMET (SIFRA, NASLOV, OIB, SEMESTAR, ECTS)
UPISAO (JMBAG, SIFRA, DATU, OCJENA)

// DATR= datum ro$enja studenta, GODINA= godina studija


// veza izme$u predmeta i studenta

DESCRIBE STUDENT; // pokazuje kako tablica student izgleda


// klju# nikad ne smije biti null
========================================================================
Zad 1
Ispisati citav sadrzaj svake od 4 tabele u demo bazi.
RJ
SELECT * FROM STUDENT;
// SELECT= ispi"i, *=sve, FROM = iz tablice
SELECT * FROM NASTAVNIK;

VJE!BE 3
Zad 2 Ispisati imena i datume ro"enja za sve studente.
SELECT IMES, DATR FROM STUDENT;
Zad 3 Recimo da fakultet odluci svim nastavnicima udvostruciti placu od iduce godine. Ispisite kolike ce biti place nastavnika iduce godine.
SELECT PREZIMEN,PLACA*2 FROM NASTAVNIK;
//naravno, imamo i +, -, /, ()
Zad 4 Ispisite OIB-e nastavnika koji predaju bar jedan kolegij.
SELECT DISTINCT OIB FROM PREDMET;
// bar jednog nastavnika --> koristim DISTINCT
Zad 5 Ispisati sve podatke o nastavnicima iz sobe 127. Ispisati imena nastavnika s placom vecom od 10 000. Ispisati imena nastavnika koji ne sjede u sobi 315.
a) SELECT * FROM NASTAVNIK WHERE BRSOBE=127;
// * zna#i sve
b) SELECT IMEN FROM NASTAVNIK WHERE PLACA>10000;
c) SELECT IMEN FROM NASTAVNIK WHERE BRSOBE!=315;
Zad 6 Ispisati sve podatke o nastavnicima koji sjede u sobi 127 ili 315. Ispisati sve podatke o nastavnicima koji ne sjede ni u sobi 127 ni u sobi 315.
a) SELECT * FROM NASTAVNIK WHERE BRSOBE=127 OR BRSOBE=315; ili SELECT * FROM NASTAVNIK WHERE BRSOBE IN(127,315);
b) SELECT * FROM NASTAVNIK WHERE BRSOBE!=127 AND BRSOBE!=315; ili ... WHERE BRSOBE NOT IN(127, 315);
Zad 7 Ispisati sve podatke o nastavnicima koji zaradjuju izmedju 10 000 i 12 000 (ukljucivo). Ispisati sve podatke o nastavnicima koji zaradjuju manje od 9 000 ili vise od 11 000.
a) SELECT * FROM NASTAVNIK WHERE PLACA >= 10000 AND PLACA <= 12000; ili SELECT * FROM NASTAVNIK WHERE PLACA BETWEEN 10000 AND 12000; //postoji NOT
BETWEEN (to je stroga nejednakost)
b) SELECT * FROM NASTAVNIK WHERE PLACA > 11000 OR PLACA < 9000 ili .... WHERE PLACA NOT BETWEEN 9000 AND 11000;
Zad 8 Ispisati JMBAG-ove svih studenata koji su iz kolegija sa sifrom 72001 dobili ocjenu izmedju 3 i 5. Ispisati JMBAG-ove studenata koji su bar iz jednog kolegija dobili
ocjenu izmedju 3 i 5.
a) SELECT JMBAG FROM UPISAO WHERE SIFRA=72001 AND OCJENA BETWEEN 3 AND 5;
b) SELECT DISTNICT JMBAG FROM UPISAO WHERE OCJENA BETWEEN 3 AND 5;
Zad 9 Ispisi imena studenata koja pocinju slovom 'M', zatim sva imena studenata u kojima se pojavljuje niz znakova 'ar'. Na kraju, ispisati imena studenata kojima se kao trece
slovo pojavljuje 'a'.
a) SELECT IMES FROM STUDENT WHERE IMES BETWEEN 'M' AND 'N'; ili (korektniji na#in:) SELECT IMES FROM STUDENT WHERE IMES LIKE 'M%'; // %=0, 1 ili vi"e znakova
b) SELECT IMES FROM STUDENT WHERE IMES LIKE '%ar%';
c) SELECT IMES FROM STUDENT WHERE IMES LIKE '__a%';
// _ zamjenjuje to#no jedan znak
Zad 10 Ispisati podatke o nastavnicima, uzlazno sortirane po placi. Ispisati sve podatke o nastavnicima, silazno sortirano po placi.
a) SELECT * FROM NASTAVNIK ORDER BY PLACA ASC;
// ASC= ulazno, to je default pa ne moramo pisati
b) SELECT * FROM NASTAVNIK ORDER BY PLACA DESC;
// DESC= silazno
Zad 11 Ispisite prezimena studenata rodjenih 1992 godine, koji su na 1. godini studija. Ispis treba biti abecedno sortiran po prezimenima.
SELECT PREZIMES FROM STUDENT WHERE DATR LIKE '1992%' AND GODINA=1 ORDER BY PREZIMES;
// datum ro$enja je oblika godina, mjesec, dan
// kako umjesto DATR napisati DATUM RODENJA u tablici? ovako:
SELECT PREZIMES PREZIME_STUDENTA, DATR DATUM_RODJENJA FROM STUDENT;
Zad 12 Ispisati podatke o nastavnicima koji zaradjuju izmedju 10 000 i 12 000, tako da im prezimena budu sortirana po abecedi. Ispisati podatke o svim nastavnicima, sortirano
po sobama, s time da nastavnici iz iste sobe slijede abecedno poredani po prezimenima.
a) SELECT * FROM NASTAVNIK WHERE PLACA BETWEEN 10000 AND 12000 ORDER BY PREZIMEN;
b) SELECT * FROM NASTAVNIK ORDER BY BRSOBE, PREZIMEN); // mogu dodat DESC iza BRSOBE
Zad 13 Ispisite studente sortirano po starosti (pocevsi od najstarijeg).
SELECT JMBAG FROM STUDENT ORDER BY DATR; // JMBAG je jedinstven pa smo zato to ispisali
Zad 14 Ispisati imena i udvostrucene place nastavnika, sortirano po udvostrucenim placama.
SELECT IMEN, PLACA*2 FROM NASTAVNIK ORDER BY 2;
// 2 je ovo drugo koje je ovdje navedeno, dakle pla%a
====================================================================================================
STVARANJE I A!URIRANJE TABELA I INDEXA
exit; iz mysql-a
upitkaj:
mysql -u student -p ENTER
student // password
use student;
SHOW TABLES;
tipovi podataka: http://web.math.pmf.unizg.hr/~karaga/bptipovipodataka.html
Zad 15 Stvoriti tablice koje odgovaraju onima u demo bazi "fakultet".
CREATE TABLE STUDENT (JMBAG NIMERIC(10) UNSIGNED NOT NULL, PREZIMES CHAR(20), IMES CHAR (20), DATR DATE, GODINA ENUM ('1','2','3','4','5'), PRIMARY KEY
(JMBAG));
cREATE = naredba za stvaranje

TABLE= talica
STUDENT=ime, mi ne"to drugo
UNSIGNED= zna#i bez predznaka, to stavljamo iza brojeva
ENUM=mo!e poprimiti samo te vrijednosti (1, 2, 3, 4 ili 5)
NOT NULL= to uvijek stavim kod klju#a
PRIMARY KEY = klju#
EVO NA!E BAZE:
CREATE TABLE ST
(JMBAG NUMERIC(10) UNSIGNED NOT NULL,
PREZIMES CHAR(20),
IMES CHAR(20),
DATR DATE,
GODINA ENUM('1','2','3','4','5'),
PRIMARY KEY(JMBAG));
CREATE TABLE NA
(OIB NUMERIC(11) UNSIGNED NOT NULL,
PREZIMEN CHAR(20),
IMEN CHAR(20),
BRSOBE NUMERIC(3) UNSIGNED,
PLACA NUMERIC(5) UNSIGNED,
PRIMARY KEY(OIB));
CREATE TABLE PR
(SIFRA NUMERIC(5) UNSIGNED NOT NULL,
NASLOV CHAR(80),
OIB NUMERIC(11) UNSIGNED,
SEMESTAR ENUM('Z','L'),
ECTS NUMERIC(2) UNSIGNED,
PRIMARY KEY(SIFRA));
CREATE TABLE UP
(JMBAG NUMERIC(10) UNSIGNED NOT NULL,
SIFRA NUMERIC(5) UNSIGNED NOT NULL,
DATU DATE,
OCJENA ENUM('1','2','3','4','5'),
PRIMARY KEY(JMBAG,SIFRA));

VJE!BE 4
// DANAS I SAMO DANAS :) --> Kako napuniti tablice?
Zad 16 U direktoriju /math/karaga/baze nalaze se datoteke s podacima za demo bazu. Jedna datoteka odgovara jednoj tabeli, jedan redak datoteke jednoj n-torki. Vrijednosti
atributa razdvojene su znakovima tab. Imena datoteka su datanastavnik i datapredmet. Inicijalizirajte sadrzaj za vlastite tabele NASTAVNIK i PREDMET t. d. ucitate podatke iz
odgovarajucih datoteka.
LOAD DATA INFILE "../../../../math/karaga/baze/datanastavnik" INTO TABLE NASTAVNIK; // umjesto NASTAVNIK mi napisali NA ;)
LOAD DATA INFILE "../../../../math/karaga/baze/datapredmet" INTO TABLE PR;
Zad 17 Inicijalizirajte sadrzaj za vlastite tabele UPISAO i STUDENT t. d. prepisete podatke iz odgovarajucih tabela demo baze "fakultet".
INSERT INTO ST SELECT * FROM fakultet.STUDENT;
INSERT INTO UP SELECT * FROM fakultet.UPISAO;
Zad 18 Upisite u bazu novog nastavnika s OIB-om 50000000000, prezimenom Mirkovic, imenom Mirko, koji ce sjediti u sobi 101 i imati ce placu 8000 kuna.
1. NA'IN
INSERT INTO NA VALUES(50000000000, 'Mirkovic', 'Mirko', 101, 8000);
isti redosljed atributa kao u tablici // "to je lo"e jer trebamo pamtiti redosljed u tablici :(
2. NA'IN
INSERT INTO NA (PREZIMEN, IMEN, PLACA, BRSOBE, OIB) VALUE ('Mirkovic, 'Mirko', 8000, 101, 50000000000);
u redosljedu navedeno tu na po#etku :)
3. NA'IN
INSERT INTO NA SET PLACA=8000, BRSOBE=101, IMEN='Mirko', PREZIMEN='Mirkovic', OIB=50000000000;
ne moramo paziti na redosljed, a i smijemo izostaviti neke atribute - oni se postavljaju automatski na NULL (sve osim klju#a)
Zad 19 Realizirajte situaciju u kojoj je nastavnik s OIB-om 44102179316 (Klein) dobio otkaz. Sve njegove kolegije preuzima nastavnik s OIB-om 50000000000 (Mirkovic).
prvo mijenja predmet td OIB od kleina zamijenimo s OIBom od mirkovi%a
UPDATE PR SET OIB=50000000000 WHERE OIB=44102179316;
sad bri"eme kleina
DELETE FROM NA WHERE OIB=44102179316;
Zad 20 Nastavnika Pascala premjestite u sobu 201 i dajte mu povisicu u visini 20% dosadasnje place.
UPDATE NA SET BRSOBE=201, PLACA=PLACA*1.2 WHERE PREZIMEN='Pascal';
to mo!emo jer imamo samo jednog Pascala
Zad 21 Ponistite upise svih kolegija koji nisu polozeni.
DELETE FROM UP WHERE OCJENA IS NULL;
ako nije null, pi"emo IS NOT NULL
Zad 22 Dajte svim nastavnicima placu od 10000
UPDATE NA SET PLACA=10000;
Indeksi su pomo%ne strukture na atributima koji ubrzavaju pretra!ivanje po tim atributima. Dodatno, unique indeks na klju#u osigurava i "svojstvo klju#a" (tj. da ne mo!emo imati vi"e inosa s
istom vrijedno"%u klju#a)
Zad 23 Stvorite indeks po primarnom kljucu za svaku od 4 tablice.
CREATE UNIQUE INDEX STUDENT_IND ON ST(JMBAG);
CREATE UNIQUE INDEX UPISAO_IND ON UP(JMBAG, SIFRA);
CREATE UNIQUE INDEX PREDMET_IND ON PR(SIFRA);
CREATE UNIQUE INDEX NASTAVNIK_IND ON NA(OIB);

gdje STUDENT_IND = ime indexa

Zad 24 Provjerite da "unique indeks" zaista sprecava upis 2 n-torke s istom vrijednoscu primarnog kljuca.
sami...
Zad 25 Stvorite indekse se ubrzava: trazenje studenata na zadanoj godini, trazenje nastavnika koji sjede u zadanoj sobi.
CREATE INDEX SG ON ST(GODINA);
CREATE INDEX NS ON NA(BRSOBE);
NAPOMENA:
SHOW INDEX FROM imetablice; // ispisuje sve indexe koji su na nekoj tablici
DROP INDEX ima ON TABLE imet;
DROP TABLE imet; // brisanje tablice
ALTER TABLE
// promijeni ve% stvorenu tablicu ali bolje DROP TABLE pa sve ispo#etka

=========================================================================
- upiti koji koriste vi"e tablica
- ugnje!$eni upiti
- upiti koji koriste funkcije
sada sam napravila USE fakultet; da do$em u tu bazu..
Zad 1 Ispisati listu imena studenata zajedno s naslovima kolegija koje su oni upisali. Ispisati naslove onih kolegija koje je upisao studnet Vukovic Janko.
// Trebaju mi tablice STUDENT, PREDMET i UPISAO (jer upisao povezuje ova dva)
// pazi, imamo 2 OIBa (od nastavnika i od predmeta, morat %emo tu paziti
a) SELECT STUDENT.IMES, PREDMET.NASLOV FROM STUDENT, UPISAO, PREDMET WHERE STUDENT.JMBAG=UPISAO.JMBAG AND UPISAO.SIFRA=PREDMET.SIFRA;
b) SELECT PREDMET.NASLOV FROM STUDENT, UPISAO, PREDMET WHERE STUDENT.JMBAG=UPISAO.JMBAG AND UPISAO.SIFRA=PREDMET.SIFRA AND
STUDENT.IMES='Janko' AND STUDENT.PREZIMES='Jankovic';
Zad 2 Ispisati listu imena studenata zajedno s nazivima kolegija koje su oni upisali, s time da iskljucimo studente na 3. godini. Ispisati nazive onih kolegija koje je upisao bar
jedan student na 2. godini.
a) SELECT IMES, NASLOV FROM STUDENT, UPISAO, PREDMET WHERE GODINA !=3 AND STUDENT,JMBAG=UPISAO.JMBAG AND UPISAO.SIFRA=PREDMET.SIFRA;
b) SELECT DISTINCT NASLOV FROM STUDENT, UPISAO, PREDMET WHERE GODINA=2 AND STUDENT.JMBAG=UPISAO.JMBAG AND UPISAO.SIFRA=PREDMET.SIFRA;

VJE!BE 5
U SQLu mo!emo kombinirati tablicu samo sa sobom. Tada tablici dajemo nadimke (aliase).
Zad 3 Ispisati sve parove nastavnika (po prezimenima) koji sjede u istoj sobi.
SELECT N1.PREZIMEN,N2.PREZIMEN FROM NASTAVNIK N1. NASTAVNIK N2 WHERE N1.BRSOBE=N2.BRSOBE AND N1.PREZIMEN<N2.PREZIMEN;
// dodali smo AND... da ne bi parove ispisivao 2 puta
Zad 4 Ispisati prezimena i place svih nastavnika koji imaju vecu placu od nastavnika Codd-a.
// "etat %emo se po N2, fixirat %emo N1
SELECT N2.PREZIMEN, N2.PLACA FROM NASTAVNIK N1,NASTAVNIK N2 WHERE N1.PREZIMEN='Codd' AND N2.PLACA>N1.PLACA;
ili
SELECT PREZIMEN, PLACA FROM NASTAVNIK WHERE PLACA>(SELECT PLACA FROM NASTAVNIK WHERE PREZIMEN='Codd');
Zad 5 Ispisati listu imena i prezimena studenata zajedno s naslovima kolegija koje ti studenti nisu upisali.
// nisu upisali - tra!it %u koje jesu upisali pa %u to negirati tj na"i studenti nisu u tom skupu
SELECT IMES, PREZIMES, NASLOV FROM STUDENT, PREDMET WHERE SIRA NOT IN (SELECT SIFRA FROM UPISAO WHERE UPISAO.JMBAG=STUDENT.JMBAG);
Zad 6 Ispisati imena i prezimena studenata koji nisu upisali ni jedan kolegij.
SELECT IMES, PREZIMES FROM STUDENT WHERE JMBAG NOT IN (SELECT JMBAG FROM UPISAO);
Zad 7 Ispisati imena studenata koji su upisali bar jedan kolegij. Ispisati sobe nastavnika koji predaju bar jedan kolegij.
a) SELECT DISTINCT IMES FROM STUDENT, UPISAO WHERE STUDENT.JMBAG=UPISAO.JMBAG
B) SELECT DISTINCT BRSOBE FROM NASTAVNIK WHERE OIB IN (SELECT OIB FROM PREDMET);
Funkcije u MySQL-u: funkcije 1, funkcije2
//LPAD %emo koristiti :))
U SQLu umjesto atributa mo!emo koristiti i pozive funkcija.

Zad 8 Izracunaj izraz e^sinx + e^cosx za x=1.2 rad.


SELECT EXP(SIN(1.2))+EXP(COS(1.2));
Zad 9 Ispisi place svih nastavnika u stranoj valuti, kao cijeli broj. Jedinica strane valute vrijedi kao 7.8 jedinica domace. // ispisat %emo i prezime
SELECT PREZIMEN, ROUND(PLACA/7.8) FROM NASTAVNIK;
Zad 10 Ispisi parove studenata koji su se rodili istog dana u tjednu.
// imamo parove, koristit %emo aliase
SELECT S1.JMBAG, S2.JMBAG FROM STUDENT S1, STUDENT S2 WHERE S1.JMBAG<S2.JMBAG AND DAYOFWEEK(S1.DATR)=DAYOFWEEK(S2.DATR);
Zad 11 Prikazi uspjeh studenata koji su polozili predmet s sifrom 56001 u obliku histograma (veca ocjena-dulji niz zvjezdica. )
// LPAD(a,b,c) funkcionira ovak: cccca, ispod cccc je -->viti#asta zagrada-->b
SELECT IMES, PREZIMES, LPAD (' ', OCJENA*2, '*') HISTOGRAM FROM STUDENT, UPISAO WHERE STUDENT.JMBAG=UPISAO.JMBAG AND OCJENA IS NOT NULL AND
UPISAO.SIFRA=56001;
Zad 12 Ispisite svoje korisnicko ime i trenutnu verziju MySQL-a.
SELECT USER( );
SELECT VERSION( );

VJE!BE 6
SQL - GRUPIRAJU#I UPITI
Ponekad je korisno retke u tablici formirati u grupe po nekom kriteriju, te na te grupe primjenjivati tzv grupne funkcije. Mo!emo i #itavu tablicu promatrati kao jednu grupu i na nju primjeniti
grupne funkcije.
Pogledaj funkcije 3 s gornjeg linka
Zad 13 Ispisati: zbroj svih placa nastavnika, prosjecnu placu nastavnika, ime i placu nastavnika s najvecom placom.
a) SELECT SUM(PLACA) FROM NASTAVNIK;
b) SELECT AVG(PLACA) FROM NASTAVNIK;
c) SELECT IMEN, MAX(PLACA) FROM NASTAVNIK; NIJE DOBRO
c) upit mora biti ili "obi#an" ili grupiraju%i //pomo%u ugnje!$enih upita//
SELECT IMEN, PLACA FROM NASTAVNIK WHERE PLACA=(SELECT MAX(PLACA) FROM NASTAVNIK);
Zad 14 Ispisati: broj studenata na 1. godini, broj studenata na 2. godini, broj svih godina, broj svih studenata.
a) SELECT COUNT(GODINA) FROM STUDENT WHERE GODINA=1;
b) SELECT COUNT(GODINA) FROM STUDENT WHERE GODINA=2;
c) SELECT COUNT(DISTINCT GODINA) FROM STUDENT;
d) SELECT COUNT(*) FROM STUDENT;
Zad 15 Ispisati koliko studenata ima na svakoj godini studija.
// grupirat %emo studente po godinama pa puknuti COUNT(*) //
SELECT GODINA, COUNT(*) FROM STUDENT GROUP BY GODINA; //gdje je GODINAkriterij grupiranja); a GODINA=atribut po kojem smo grupirali
Zad 16 Ispisati maksimum, minimum i raspon place za nastavnike iz svake od soba. Zatim ispisati iste podatke samo za sobu 127.
a) SELECT MAX(PLACA), MIN(PLACA), MAX(PLACA)-MIN(PLACA) RASPON, BRSOBE FROM NASTAVNIK GROUP BY BRSOBE;
b) SELECT MAX(PLACA), MIN(PLACA), MAX(PLACA)-MIN(PLACA) RASPON, BRSOBE FROM NASTAVNIK WHERE BRSOBE=127 GROUP BY BRSOBE;
Zad 17 Ispisite srednje ocjene i standardne devijacije za ocjene po svim kolegijima.
SELECT SIFRA, AVG(OCJENA), STD(OCJENA) FROM UPISAO GROUP BY SIFRA
Zad 18 Ispisite maksimalnu ocjenu koju su studenti s pojedine godine ostvarili iz pojedinog kolegija.
SELECT UPISAO.SIFRA, STUDENT.GODINA, MAX(OCJENA) FROM UPISAO, STUDENT WHERE STUDENT.JMBAG=UPISAO.JMBAG GROUP BY UPISAO.SIFRA,
STUDENT.GODINA;
Zad 19 Ispisite prosjecnu placu za nastavnike iz iste sobe, no samo za sobe u kojima ima vise od jednog nastavnika.

SELECT BRSOBE, COUNT(*), AVG(PLACA) FROM NASTAVNIK GROUP BY BRSOBE HAVING COUNT(*)>1;
naredba HAVING je analogon naredbi WHERE, jedino "to se WHERE izvr"ava prije a HAVING nakon grupiranja
Zad 20 Zbrojite place po sobama i ispisite rang listu soba po placama.
SELECT BRSOBE, SUM(PLACA) FROM NASTAVNIK GROUP BY BRSOBE ORDER BY 2 DESC;
Zad 21 Ispisite imena i place za tri najbolje placena nastavnika.
// ovaj upit nema veze s grupiranjem nego nas u#i naredbi LIMIT
LIMIT(a,b) gdje a=broj retka od kojeg po#inje ispis, b= maximalan broj redaka koji ispisujemo
npr. LIMIT(0,3) ispisuje retke 0, 1, 2
SELECT IMEN, PLACA FROM NASTAVNIK ORDER BY PLACA DESCLIMIT 0,3;
___________________________________________
http://web.math.pmf.unizg.hr/~karaga/bpjoin.html
NAREDBA JOIN - va!no za praksu
PRO'ITAJ vje!be 7 i 8 ---- http://web.math.pmf.unizg.hr/~karaga/novevbaze.html

// to ne%e biti u kolokviju

// transakcije = (npr bankovne transakcije) skup naredbi


GRANT ALL // - dajem sva ovla"tenja (to je i 8.vje!bama)

KOLOKVIJ
$TO #E BITI: SQL - jednostavni upiti, slo!eni upiti, grupiraju%i upiti. Samo to. Kolokvij je na kompu, traje 45min, 8 selecta %emo morati napraviti
hintovi:
ne biti brzoplet!
smijemo koristiti SELECT(*), tako provjerim dal sam dobro rije"ila zadatak !!!!!!!!!!!!!!!!

2. ZADA"A
pi"e na webu...

ZAVR!NI
2 sata, 3 pitanja + 2 pitanja iz vje!bi (oni komplicirani zadaci iz prija"njih godina ne%e biti, to je od asistenta s fizike)