Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
SUSTAVI BAZA PODATAKA 1
Doc.dr.sc. GORAN KRALJEVIĆ
SUSTAVI BAZA PODATAKA
FAKULTET STROJARSTVA I RAČUNARSTVA
SVEUČILIŠTE U MOSTARU
SUSTAVI BAZA PODATAKA 2
Web:
http://www.uni-mo.ba/~goran
Pitanja, primjedbe, dogovor za konzultacije ...
o E-mail: [email protected]
Sustavi baza podataka
SUSTAVI BAZA PODATAKA 3
Uvod u SQL
SUSTAVI BAZA PODATAKA 4
SQL
• SQL = Structured Query Language
• SQL je upitni jezik temeljen na relacijskoj algebri i predikatnom računu.
• SQL se koristi kao programski jezik i interaktivni upitni jezik. Kao programski jezik može se ugrađivati u jezike treće i četvrte generacije.
• Zadaća SQL-a je omogućiti definiciju podataka, upravljanje podacima i provođenje kontrole nad podacima u relacijskoj bazi podataka.
• Proizvođači komercijalnih sustava također ugrađuju i svoje, uglavnom nestandardne, DDL i DML naredbe.
Ti su nestandardni dijelovi problematični jer programski kod postaje neprenosiv između različitih SQL sustava, a također se bitno otežava usaglašavanje oko budućih standarda.
SUSTAVI BAZA PODATAKA 5
SQL
• DDL (Data Definition Language)
= izrazi za definiranje podataka
CREATE, ALTER, DROP, GRANT, REVOKE ...
• DML (Data Manipulation Language)
= izrazi za upravljanje podacima
SELECT, INSERT, UPDATE, DELETE ...
SUSTAVI BAZA PODATAKA 6
DDL naredbeCREATE, ALTER, DROP, ...
SUSTAVI BAZA PODATAKA 7
Kreiranje tablica
SUSTAVI BAZA PODATAKA 8
SQL – Kreiranje i brisanje tablica
Kreiranje tablice:
CREATE TABLE ime_tablice
(ime_stupca tip (veličina) (ograničenje),
ime_stupca tip (veličina) (ograničenje),
ime_stupca tip (veličina) (ograničenje),
...);
Brisanje tablice:
DROP TABLE ime_tablice;
SUSTAVI BAZA PODATAKA 9
Ograničenja nad stupcima tablice i nad tablicama ...
• NULL/NOT NULL
• UNIQUE
• PRIMARY KEY
• FOREIGN KEY
• CHECK
SUSTAVI BAZA PODATAKA 10
Tipovi podataka (ORACLE)
• VARCHAR2(size)
• CHAR[(size)]
• NUMBER[(p,s)]
• DATE
SUSTAVI BAZA PODATAKA 11
Tipovi podatakaVeliki objekti
SUSTAVI BAZA PODATAKA 12
PRIMJER – Relacijski model
SUSTAVI BAZA PODATAKA 13
SQL – CREATE TABLE
CREATE TABLE MJESTO
( PBR NUMBER(10) NOT NULL,
NAZIV VARCHAR2(40) NOT NULL,
CONSTRAINT mjesto_pk PRIMARY KEY(PBR)
);
SUSTAVI BAZA PODATAKA 14
SQL – CREATE TABLE
CREATE TABLE OSOBA
( MBR NUMBER(10) NOT NULL,
IME VARCHAR2(25) NOT NULL,
PREZIME VARCHAR2(25) NOT NULL,
EMAIL VARCHAR2(40),
PBR NUMBER(10) NOT NULL,
CONSTRAINT osoba_pk PRIMARY KEY(MBR),
CONSTRAINT osoba_mjesto_fk FOREIGN KEY(PBR)
REFERENCES MJESTO(PBR)
);
SUSTAVI BAZA PODATAKA 15
SQL – ALTER TABLE
Primjeri:
ALTER TABLE osoba
DROP COLUMN email;
ALTER TABLE osoba
ADD (email VARCHAR2(25));
ALTER TABLE mjesto
MODIFY (naziv VARCHAR2(50));
SUSTAVI BAZA PODATAKA 16
DML naredbeSELECT, INSERT, UPDATE, DELETE
SUSTAVI BAZA PODATAKA 17
Najčešće korišteni DML izrazi
SELECT - Pretraživanje podataka
INSERT - Upisivanje novih podataka
UPDATE - Promjena vrijednosti podataka
DELETE - Brisanje postojećih podataka
SUSTAVI BAZA PODATAKA 18
INSERT – Unos podataka u tablicu
• INSERT INTO ime_tablice (stupac, stupac,…)
VALUES (vrijednost, vrijednost, …);
Primjeri:
• INSERT INTO osoba (mbr, ime, prezime, email)
VALUES (1, 'Ivo', 'Ivic', '[email protected]');
• INSERT INTO osoba
VALUES (1, 'Ivo', 'Ivic', '[email protected]');
SUSTAVI BAZA PODATAKA 19
UPDATE – Ažuriranje podataka u tablici
• UPDATE ime_tablice [alias] SET
stupac [,stupac…] = {iskaz, podupit}
[WHERE uvjet];
Primjer:
• UPDATE osoba SET email='[email protected]'
WHERE mbr=1;
SUSTAVI BAZA PODATAKA 20
DELETE – Brisanje podataka u tablici
• DELETE FROM ime_tablice
[WHERE uvjet];
Primjer:
• DELETE FROM osoba
WHERE mbr=2;
SUSTAVI BAZA PODATAKA 21
SELECT – Selektiranje podataka iz tablice
• SELECT stupac, stupac, stupac, …
FROM ime_tablice
[WHERE uvjet];
Primjeri:
• SELECT mbr, ime, prezime, email
FROM osoba;
• SELECT * FROM osoba;
SUSTAVI BAZA PODATAKA 22
INSERT – Primjeri
• INSERT INTO mjesto (pbr, naziv)
VALUES (88000, 'Mostar');
• INSERT INTO mjesto (pbr, naziv)
VALUES (88220, 'Široki Brijeg');
• INSERT INTO osoba (mbr, ime, prezime, email, pbr)
VALUES (1, 'Ivo', 'Ivic', '[email protected]', 88000);
• INSERT INTO osoba (mbr, ime, prezime, pbr)
VALUES (2, 'Mate', 'Matic', 88220);
SUSTAVI BAZA PODATAKA 23
INSERT – Primjeri
• INSERT INTO osoba (mbr, ime, prezime, email, pbr)
VALUES (2, 'Pero', 'Peric', '[email protected]', 88000);
→ ORA-00001: unique constraint (PC-1.OSOBA_PK) violated
• INSERT INTO osoba (mbr, ime, prezime, email, pbr)
VALUES (3, 'Pero', 'Peric', '[email protected]', 90000);
→ ORA-02291: integrity constraint (PC-1.OSOBA_MJESTO_FK)
violated - parent key not found
• INSERT INTO osoba (mbr, ime, email, pbr)
VALUES (3, 'Pero', '[email protected]', 88000);
→ ORA-01400: cannot insert NULL into ("OSOBA"."PREZIME")
SUSTAVI BAZA PODATAKA 24
UPDATE – Primjeri
• UPDATE mjesto SET pbr=10000
WHERE naziv='Mostar';
→ ORA-02292: integrity constraint (PC-1.OSOBA_MJESTO_FK) violated - child record found
• UPDATE mjesto SET naziv='Š.Brijeg'
WHERE pbr=88220;
• UPDATE osoba SET email='[email protected]'
WHERE mbr=2;
SUSTAVI BAZA PODATAKA 25
DELETE – Primjeri
• DELETE FROM mjesto
WHERE pbr=88000;
→ ORA-02292: integrity constraint (PC-1.OSOBA_MJESTO_FK) violated - child record found
• DELETE FROM osoba
WHERE mbr=1;
• DELETE FROM mjesto
WHERE pbr=88000;
SUSTAVI BAZA PODATAKA 26
S Q L
SUSTAVI BAZA PODATAKA 27
Testna baza (Oracle DBMS) (Baza je napunjena testnim podacima - koristiti ćemo je na vježbama za SELECT upite ...)
SUSTAVI BAZA PODATAKA 28
SELECT – Odabir podataka iz tablice
• SELECT stupci [alias]
FROM ime_tablice [alias]
[WHERE uvjeti za redak]
[GROUP BY stupci]
[HAVING uvjeti za grupu redaka]
[ORDER BY stupci];
Primjer – odabir svih podataka iz tablice djelatnik
• SELECT * FROM djelatnik;
SUSTAVI BAZA PODATAKA 29
Operatori usporedbe, Logički i SQL operatori
=, >, <, >=, <=, <>
BETWEEN … AND… – između dvije vrijednosti (uključivo)
IN (lista) – odgovara bilo kojoj vrijednosti iz liste
LIKE – odgovara znakovnom “uzorku”
IS NULL – je NULL vrijednost
AND – vraća TRUE ako su svi uvjeti TRUE
OR – vraća TRUE ako je jedan od uvjeta TRUE
NOT – logičko NE
SUSTAVI BAZA PODATAKA 30
Agregatne funkcije SQL-a
• ISO standard definira 5 agregatnih funkcija:
o COUNT
o SUM
o AVG
o MIN
o MAX
• Ove funkcije se izvršavaju nad jednim stupcem tablice i vraćaju jednu vrijednost.
• VAŽNO ! Agregatne funkcije se mogu koristiti samo
u SELECT listi i HAVING iskazu.
SUSTAVI BAZA PODATAKA 31
GROUP BY
• Grupiranje se obavlja tako da se n-torke koje imaju jednake vrijednosti atributa navedenih u listi za grupiranje, kombiniraju u zajedničku grupu. Za svaku dobivenu grupu, u rezultatu se pojavljuje samo jedna n-torka.
• Grupiranje je vrlo korisno u kombinaciji s agregatnim funkcijama (COUNT, SUM, AVG, MIN, MAX).
Primjer:
• SELECT sifra_radmj, AVG(placa) prosjecna_placa
FROM djelatnik
GROUP BY sifra_radmj;
SUSTAVI BAZA PODATAKA 32
GROUP BY
• P R A V I L O !
Bilo koji atribut ili izraz u SELECT listi koji
nije agregatna funkcija mora biti i u GROUP BY iskazu.
Međutim, dopušteno je u GROUP BY iskazu koristiti i one atribute koji se ne nalaze u SELECT listi.
SUSTAVI BAZA PODATAKA 33
HAVING
• Koristi se ako se želi specificirati koje grupe treba prikazati, odnosno, koristi se za restrikciju grupa koje se prikazuju, tj. za ispitivanje vrijednosti agregatnih funkcija.
• VAŽNO ! WHERE iskaz se ne može koristiti za
restrikciju grupa (kao HAVING).
WHERE se koristi samo za restrikciju pojedinačnih redaka.
SUSTAVI BAZA PODATAKA 34
Izvršavanje SQL iskaza ...
• SELECT sifra_radmj, COUNT(*) broj_djelatnika
FROM djelatnik
WHERE placa>1000
GROUP BY sifra_radmj
HAVING COUNT(*)>2
ORDER BY 2 desc;
• Pregled radnih mjesta na kojima radi više od 2 djelatnika s plaćom većom od 1000 KM.
SUSTAVI BAZA PODATAKA 35
Izvršavanje SQL iskaza ...
• Pregled radnih mjesta na kojima radi više od 2 djelatnika s plaćom većom od 1000 KM.
ID_DJELATNIKA SIFRA_RADMJ PLACA
1 DIR 4800
2 TAJNIK 1100
100 IT-VOD 2500
101 IT-PROG 1600
102 IT-ADM 1400
103 IT-PROG 1800
104 IT-PROG 1500
105 IT-PROG 1500
106 IT-ADM 1300
107 IT-PROG 1250
108 IT-PROG 1200
109 IT-PROG 1000
110 IT-PROG 800
111 IT-PROG 900
112 IT-ADM 700
113 IT-PROG 1100
114 IT-PROG 950
115 IT-PROG 1350
200 PROD-VOD 2000
201 PROD-KAM 1000
202 PROD-KAM 1400
203 PROD-KAM 1100
204 PROD-KAM 1200
... ... ...
WHEREplaca > 1000
1. 2.
ID_DJELATNIKA SIFRA_RADMJ PLACA
1 DIR 4800
2 TAJNIK 1100
100 IT-VOD 2500
101 IT-PROG 1600
102 IT-ADM 1400
103 IT-PROG 1800
104 IT-PROG 1500
105 IT-PROG 1500
106 IT-ADM 1300
107 IT-PROG 1250
108 IT-PROG 1200
113 IT-PROG 1100
115 IT-PROG 1350
200 PROD-VOD 2000
202 PROD-KAM 1400
203 PROD-KAM 1100
204 PROD-KAM 1200
... ... ...
GROUP BY sifra_radmj
SUSTAVI BAZA PODATAKA 36
Izvršavanje SQL iskaza ...
SIFRA_RADMJ COUNT(*)
PROD-KAM 3
IT-ADM 2
IT-PROG 8
...
GROUP BY sifra_radmj
HAVING COUNT(*)>2
ORDER BY 2 desc
2. 3.
4.
• Pregled radnih mjesta na kojima radi više od 2 djelatnika s plaćom većom od 1000 KM.
SIFRA_RADMJ COUNT(*)
PROD-KAM 3
IT-PROG 8
SIFRA_RADMJ COUNT(*)
IT-PROG 8
PROD-KAM 3
SUSTAVI BAZA PODATAKA 37
WHERE – GROUP BY – HAVING
• WHERE dio naredbe određuje koje n-torke će
formirati grupe.
• GROUP BY lista određuje strukturu grupa tj. po
kojim atributima se obavlja grupiranje n-torki.
• HAVING dio naredbe određuje koje od nastalih
grupa će biti prihvaćene kao rezultat.
SUSTAVI BAZA PODATAKA 38
Osnovne metode spajanja tablica
SUSTAVI BAZA PODATAKA 39
SQL (spajanje tablica)
SQL – osnovne metode spajanja tablica:
equi-join
non-equi join
outer join
self join
SUSTAVI BAZA PODATAKA 40
SQL (osnovna sintaksa spajanja tablica)
• SELECT tablica1.atribut1, tablica2.atribut2
FROM tablica1
[INNER JOIN tablica2
ON (tablica1.atribut1=tablica2.atribut2)] |
[LEFT|RIGHT|FULL OUTER JOIN tablica2
ON (tablica1.atribut1=tablica2.atribut2)];
• Rezervirane riječi INNER i OUTER se mogu izostaviti !
• JOIN ON – Sintaksa za spajanje koja se najčešće koristi bilo
da je u pitanju equi-join ili self-join.
SUSTAVI BAZA PODATAKA 41
SQL (osnovna sintaksa spajanja tablica)
• SELECT tablica1.atribut1, tablica2.atribut2, ...
FROM tablica1, tablica2, tablica3, ...
WHERE uvjet spajanja 1 (FK<->PK)
AND uvjet spajanja 2 (FK<->PK)
...
P R A V I L O !
Broj tablica – 1 = Broj uvjeta spajanja
SUSTAVI BAZA PODATAKA 42
SQLCROSS JOIN (Kartezijev produkt)
Primjer:
• SELECT id, ime, naziv_mjesta
FROM osoba, mjesto
• SELECT id, ime, naziv_mjesta
FROM osoba
CROSS JOIN mjesto
Obratiti pozornost ! Obavljanje Kartezijevog produktarelacija često je posljedica pogreške programera – kad se zaboravi navesti uvjet spajanja.
SUSTAVI BAZA PODATAKA 43
ID IME PBR
1 Pero 88000
2 Mate 88000
3 Ivo 88220
PBR NAZIV_MJESTA
88000 Mostar
88220 Široki Brijeg
OSOBA MJESTO
ID IME NAZIV_MJESTA
1 Pero Mostar
2 Mate Mostar
3 Ivo Mostar
1 Pero Široki Brijeg
2 Mate Široki Brijeg
3 Ivo Široki Brijeg
OSOBA x MJESTO
SQLCROSS JOIN
SUSTAVI BAZA PODATAKA 44
ID IME PBR
1 Pero 88000
2 Mate 88000
3 Ivo 88220
4 Tomo 88000
5 Marija 88220
PBR NAZIV_MJESTA
88000 Mostar
88220 Široki Brijeg
OSOBA MJESTO
Primjer:
• SELECT id, ime, naziv_mjesta
FROM osoba, mjesto
WHERE osoba.pbr=mjesto.pbr;
• SELECT id, ime, naziv_mjesta
FROM osoba JOIN mjesto
ON osoba.pbr=mjesto.pbr;
SQLEQUI JOIN
SUSTAVI BAZA PODATAKA 45
ID IME NAZIV_MJESTA
1 Pero Mostar
2 Mate Mostar
3 Ivo Široki Brijeg
4 Tomo Mostar
5 Marija Široki Brijeg
Rezultat upita
Primjer:
• SELECT id, ime, naziv_mjesta
FROM osoba, mjesto
WHERE osoba.pbr=mjesto.pbr;
• SELECT id, ime, naziv_mjesta
FROM osoba JOIN mjesto
ON osoba.pbr=mjesto.pbr;
SQLEQUI JOIN
OSOBA wv MJESTO
SUSTAVI BAZA PODATAKA 46
Primjer (spajanje 3 tablice):
• SELECT ime, prezime, placa, o.naziv_opcine, z.naziv_zupanije
FROM djelatnik d, opcina o, zupanija z
WHERE d.sifra_opcine = o.sifra_opcine
AND o.sifra_zupanije = z.sifra_zupanije;
• SELECT ime, prezime, placa, o.naziv_opcine, z.naziv_zupanije
FROM djelatnik d
JOIN opcina o
ON d.sifra_opcine = o.sifra_opcine
JOIN zupanija z
ON o.sifra_zupanije = z.sifra_zupanije;
SQLEQUI JOIN
SUSTAVI BAZA PODATAKA 47
ID IME PBR
1 Pero 88000
2 Mate 88000
3 Ivo 88220
4 Tomo 88000
5 Marija NULL
PBR NAZIV_MJESTA
88000 Mostar
88220 Široki Brijeg
OSOBA MJESTO
?
SQLOUTER JOIN
Primjer:
• SELECT id, ime, naziv_mjesta
FROM osoba JOIN mjesto
ON osoba.pbr=mjesto.pbr;
• SELECT id, ime, naziv_mjesta
FROM osoba LEFT JOIN mjesto
ON osoba.pbr=mjesto.pbr;
SUSTAVI BAZA PODATAKA 48
ID IME NAZIV_MJESTA
1 Pero Mostar
2 Mate Mostar
3 Ivo Široki Brijeg
4 Tomo Mostar
5 Marija
• SELECT id, ime, naziv_mjesta
FROM osoba JOIN mjesto
ON osoba.pbr=mjesto.pbr;
ID IME NAZIV_MJESTA
1 Pero Mostar
2 Mate Mostar
3 Ivo Široki Brijeg
4 Tomo Mostar
• SELECT id, ime, naziv_mjesta
FROM osoba LEFT JOIN mjesto
ON osoba.pbr=mjesto.pbr;
SQLOUTER JOIN
SUSTAVI BAZA PODATAKA 49
Primjeri:
• SELECT rm.naziv_radmj, o.naziv_odjela
FROM radno_mjesto rm
LEFT (OUTER) JOIN odjel o
ON rm.sifra_odjela=o.sifra_odjela;
• SELECT rm.naziv_radmj, o.naziv_odjela
FROM radno_mjesto rm
RIGHT (OUTER) JOIN odjel o
ON rm.sifra_odjela=o.sifra_odjela;
• SELECT rm.naziv_radmj, o.naziv_odjela
FROM radno_mjesto rm
FULL (OUTER) JOIN odjel o
ON rm.sifra_odjela=o.sifra_odjela;
SQLOUTER JOIN
SUSTAVI BAZA PODATAKA 50
ID IME ID_SEFA
1 Pero NULL
2 Mate 1
3 Ivo 1
4 Tomo 1
5 Marija 3
OSOBA
Primjer:
• SELECT a.id, a.ime, b.ime šef
FROM osoba a, osoba b
WHERE a.id_sefa=b.id;
ID IME_DJ IME_SEFA
2 Mate Pero
3 Ivo Pero
4 Tomo Pero
5 Marija Ivo
SQLSELF JOIN
• SELECT a.id, a.ime, b.ime šef
FROM osoba a JOIN osoba b
ON a.id_sefa=b.id;
SUSTAVI BAZA PODATAKA 51
Web:
http://www.uni-mo.ba/~goran
Pitanja, primjedbe, dogovor za konzultacije ...
o E-mail: [email protected]
Sustavi baza podataka