baze podataka - uni-mo.sve-mo.bauni-mo.sve-mo.ba/~goran/nastava/baze_vjezbe.pdf · • sql se...
TRANSCRIPT
Ak.god. 2014/2015. BAZE PODATAKA 1
BAZE PODATAKA
FAKULTET STROJARSTVA I RAĈUNARSTVA
SVEUĈILIŠTE U MOSTARU
Doc.dr.sc. GORAN KRALJEVIĆ
Ak.god. 2014/2015. BAZE PODATAKA 2
Web:
http://www.fsr.ba/~goran
Pitanja, primjedbe, dogovor za konzultacije ...
o E-mail: [email protected]
Baze podataka
Ak.god. 2014/2015. BAZE PODATAKA 3
Uvod u SQL
Ak.god. 2014/2015. BAZE 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.
Ak.god. 2014/2015. BAZE 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 ...
Ak.god. 2014/2015. BAZE PODATAKA 6
SQL
• Primjer SQL naredbe iz DDL dijela jezika (kreiranje tablice mjesto):
CREATE TABLE mjesto
( pbr_mjesta VARCHAR2(5) NOT NULL ,
naziv_mjesta VARCHAR2(30) NOT NULL ,
sifra_opcine NUMBER(4)
);
• Primjer SQL naredbe iz DML dijela jezika (iz tablice mjesto dohvaća sve
n-torke kojima je vrijednost atributa poštanski broj jednaka 88000):
SELECT *
FROM mjesto
WHERE pbr = 88000;
Ak.god. 2014/2015. BAZE PODATAKA 7
Izvršavanje SQL iskaza (ORACLE server)
Ak.god. 2014/2015. BAZE PODATAKA 8
DDL naredbe Kreiranje tablica
Ak.god. 2014/2015. BAZE PODATAKA 9
Kreiranje tablica
Ak.god. 2014/2015. BAZE PODATAKA 10
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;
Ak.god. 2014/2015. BAZE PODATAKA 11
Ograniĉenja nad stupcima tablice i nad tablicama ...
• NULL/NOT NULL
• UNIQUE
• PRIMARY KEY
• FOREIGN KEY
• CHECK
Ak.god. 2014/2015. BAZE PODATAKA 12
Tipovi podataka (ORACLE)
• VARCHAR2(size)
• CHAR[(size)]
• NUMBER[(p,s)]
• DATE
Ak.god. 2014/2015. BAZE PODATAKA 13
Tipovi podataka Veliki objekti
Ak.god. 2014/2015. BAZE PODATAKA 14
PRIMJER – Relacijski model
Ak.god. 2014/2015. BAZE PODATAKA 15
SQL – Kreiranje tablica
CREATE TABLE MJESTO
( PBR NUMBER(10) NOT NULL,
NAZIV VARCHAR2(40) NOT NULL,
CONSTRAINT mjesto_pk PRIMARY KEY(PBR)
);
Ak.god. 2014/2015. BAZE PODATAKA 16
SQL – Kreiranje tablica
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)
);
Ak.god. 2014/2015. BAZE PODATAKA 17
SQL – Izmjena definicije tablice
ALTER TABLE
dodavanje novih atributa
modificiranje postojećih atributa
definiranje default-ne vrijednosti za novi atribut
brisanje atributa
Ak.god. 2014/2015. BAZE PODATAKA 18
SQL – ALTER TABLE
Primjeri:
ALTER TABLE osoba
DROP COLUMN email;
ALTER TABLE osoba
ADD (email VARCHAR2(25));
ALTER TABLE mjesto
MODIFY (naziv VARCHAR2(50));
Ak.god. 2014/2015. BAZE PODATAKA 19
DML naredbe SELECT, INSERT, UPDATE, DELETE
Ak.god. 2014/2015. BAZE PODATAKA 20
Najĉešće korišteni DML izrazi
SELECT - Pretraţivanje podataka
INSERT - Upisivanje novih podataka
UPDATE - Promjena vrijednosti podataka
DELETE - Brisanje postojećih podataka
Ak.god. 2014/2015. BAZE PODATAKA 21
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]');
Ak.god. 2014/2015. BAZE PODATAKA 22
INSERT – Unos podataka u tablicu
• INSERT se može koristiti i za kopiranje podataka
iz druge tablice.
Primjer:
• INSERT INTO osoba_2 (mbr, ime, prezime, email)
SELECT mbr, ime, prezime, email
FROM osoba;
Ak.god. 2014/2015. BAZE PODATAKA 23
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;
Ak.god. 2014/2015. BAZE PODATAKA 24
DELETE – Brisanje podataka u tablici
• DELETE FROM ime_tablice
[WHERE uvjet];
Primjer:
• DELETE FROM osoba
WHERE mbr=2;
Ak.god. 2014/2015. BAZE PODATAKA 25
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;
Ak.god. 2014/2015. BAZE PODATAKA 26
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);
Ak.god. 2014/2015. BAZE PODATAKA 27
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")
Ak.god. 2014/2015. BAZE PODATAKA 28
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;
Ak.god. 2014/2015. BAZE PODATAKA 29
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;
Ak.god. 2014/2015. BAZE PODATAKA 30
S Q L
Ak.god. 2014/2015. BAZE PODATAKA 31
Testna baza (Oracle DBMS) (Baza je napunjena testnim podacima - koristiti ćemo je na vjeţbama za SELECT upite ...)
Ak.god. 2014/2015. BAZE PODATAKA 32
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;
Ak.god. 2014/2015. BAZE PODATAKA 33
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
Ak.god. 2014/2015. BAZE PODATAKA 34
Primjeri
• SELECT id_djelatnika, ime, prezime, placa
FROM djelatnik
WHERE placa > 1000
AND sifra_radmj='IT-PROG';
• SELECT id_djelatnika, ime, prezime, placa
FROM djelatnik
WHERE placa BETWEEN 1000 AND 2000;
Ak.god. 2014/2015. BAZE PODATAKA 35
Primjeri
• SELECT id_djelatnika, ime, prezime, placa
FROM djelatnik
WHERE ime LIKE 'A%';
• SELECT id_djelatnika, ime, prezime, placa
FROM djelatnik
WHERE ime LIKE '_a%';
Ak.god. 2014/2015. BAZE PODATAKA 36
Primjeri
• SELECT id_djelatnika, ime, prezime, placa
FROM djelatnik
WHERE placa IN (1000, 2000);
• SELECT id_djelatnika, ime, prezime, placa
FROM djelatnik
WHERE placa NOT IN (1000, 2000);
Ak.god. 2014/2015. BAZE PODATAKA 37
Primjeri
• SELECT id_djelatnika, ime, prezime, placa, email
FROM djelatnik
WHERE email IS NULL;
• SELECT id_djelatnika, ime, prezime, placa, dodatak
FROM djelatnik
WHERE dodatak IS NOT NULL
AND dodatak <> 100;
Ak.god. 2014/2015. BAZE PODATAKA 38
Primjeri
• SELECT id_djelatnika, ime, prezime, placa
FROM djelatnik
WHERE placa < 1000
OR placa > 2000;
• SELECT id_djelatnika, ime, prezime, sifra_radmj
FROM djelatnik
WHERE sifra_radmj = 'IT-PROG'
OR sifra_radmj = 'IT-ADM';
Ak.god. 2014/2015. BAZE PODATAKA 39
Primjeri
Obratiti pozornost – razlikovati sljedeća 2 upita !
• SELECT id_djelatnika, ime, prezime, sifra_radmj, placa
FROM djelatnik
WHERE placa > 1300
AND sifra_radmj = 'IT-PROG'
OR sifra_radmj = 'IT-ADM';
• SELECT id_djelatnika, ime, prezime, sifra_radmj, placa
FROM djelatnik
WHERE placa > 1300
AND ( sifra_radmj = 'IT-PROG'
OR sifra_radmj = 'IT-ADM' );
Ak.god. 2014/2015. BAZE PODATAKA 40
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.
Ak.god. 2014/2015. BAZE PODATAKA 41
Agregatne funkcije SQL-a – Primjeri
• SELECT SUM(placa), AVG(placa), MIN(placa), MAX(placa)
FROM djelatnik;
• SELECT COUNT(*) broj_djelatnika
FROM djelatnik;
• SELECT COUNT (DISTINCT sifra_radmj)
FROM djelatnik;
DISTINCT – eliminira duple vrijednosti
Nema efekta na funkcije MIN i MAX, ali ima na SUM i AVG. Može
se navesti samo jedanput u upitu.
Ak.god. 2014/2015. BAZE PODATAKA 42
Agregatne funkcije SQL-a – Primjeri
• SELECT ime, prezime
FROM djelatnik
WHERE placa > AVG(placa);
→ ORA-00934: group function is not allowed here
• SELECT ime, prezime, SUM(placa)
FROM djelatnik;
→ ORA-00937: not a single-group group function
Ak.god. 2014/2015. BAZE PODATAKA 43
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;
Ak.god. 2014/2015. BAZE PODATAKA 44
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.
Ak.god. 2014/2015. BAZE PODATAKA 45
GROUP BY – Primjeri
• SELECT sifra_radmj, AVG(placa) prosj_placa
FROM djelatnik
GROUP BY sifra_radmj;
• SELECT AVG(placa)
FROM djelatnik
GROUP BY sifra_radmj;
Ak.god. 2014/2015. BAZE PODATAKA 46
GROUP BY – Primjeri
• SELECT sifra_radmj, spol, AVG(placa)
FROM djelatnik
GROUP BY sifra_radmj;
→ ORA-00979: not a GROUP BY expression
• SELECT sifra_radmj, spol, AVG(placa)
FROM djelatnik
GROUP BY sifra_radmj, spol;
Ak.god. 2014/2015. BAZE PODATAKA 47
GROUP BY – Primjeri
• SELECT AVG(COUNT(*)) prosjek_djel_rm
FROM djelatnik
GROUP BY sifra_radmj;
• SELECT MAX(COUNT(*)) max_djel_rm
FROM djelatnik
GROUP BY sifra_radmj;
Ak.god. 2014/2015. BAZE PODATAKA 48
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.
Ak.god. 2014/2015. BAZE PODATAKA 49
HAVING – Primjeri
• SELECT sifra_radmj radno_mjesto, AVG(placa) prosj_placa
FROM djelatnik
GROUP BY sifra_radmj
HAVING AVG(placa)>1500;
• SELECT sifra_opcine, COUNT(*) broj_dj
FROM djelatnik
GROUP BY sifra_opcine
HAVING COUNT(*)>=3;
Ak.god. 2014/2015. BAZE PODATAKA 50
ORDER BY
• ASC – uzlazno sortiranje (po default-u)
• DESC – silazno sortiranje
→ ORDER BY iskaz dolazi na kraju SELECT upita.
Primjer:
• SELECT ime, prezime, placa
FROM djelatnik
ORDER BY placa DESC;
Ak.god. 2014/2015. BAZE PODATAKA 51
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.
Ak.god. 2014/2015. BAZE PODATAKA 52
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
... ... ...
WHERE placa > 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
Ak.god. 2014/2015. BAZE PODATAKA 53
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
Ak.god. 2014/2015. BAZE PODATAKA 54
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.
Ak.god. 2014/2015. BAZE PODATAKA 55
DML naredbe Funkcije
Ak.god. 2014/2015. BAZE PODATAKA 56
Funkcije (ORACLE)
• CHARACTER funkcije
- LOWER, UPPER, INITCAP, CONCAT, LPAD, RPAD, SUBSTR, INSTR, LTRIM, RTRIM, LENGTH, TRANSLATE, REPLACE
• NUMBER funkcije
- ROUND, TRUNC, SIGN, SQRT, ABS, MOD
Matematičke (LOG, SIN, TAN, COS, EXP)
• DATE funkcije
- ADD_MONTHS, MONTHS_BETWEEN, NEXT_DAY, LAST_DAY, ROUND, TRUNC
• Funkcije za konverziju podataka
- TO_CHAR
- TO_NUMBER
- TO_DATE
Ak.god. 2014/2015. BAZE PODATAKA 57
Funkcije – Primjeri
Pr.) CHARACTER funkcije
• SELECT ime || ' ' || prezime NAZIV, spol, placa
FROM djelatnik
WHERE UPPER (prezime)='IVIĆ';
• SELECT ime, LENGTH (ime), SUBSTR (ime,1,3)
FROM djelatnik;
Ak.god. 2014/2015. BAZE PODATAKA 58
Pr.) NUMBER funkcije
• SELECT sifra_radmj, ROUND (AVG(placa),2)
FROM djelatnik
GROUP BY sifra_radmj
HAVING ROUND(AVG(placa),2)>1200
ORDER BY 2 desc;
Funkcije – Primjeri
Ak.god. 2014/2015. BAZE PODATAKA 59
Pr.) DATE funkcije
• SELECT id_djelatnika, ime, prezime, placa,
TO_CHAR (datum_zaposlenja, 'dd.mm.yyyy') ZAPOSLEN,
MONTHS_BETWEEN(SYSDATE, datum_zaposlenja)/12 STAZ
FROM djelatnik;
Funkcije – Primjeri
Ak.god. 2014/2015. BAZE PODATAKA 60
NULL vrijednost u izrazima
• Ukoliko vršimo neku od aritmetičkih operacija (+, -, *, /), a jedan ili oba operanda poprimaju NULL vrijednost, tada je rezultat izraza također NULL vrijednost.
• Primjeri:
o 3 + NULL = NULL
o NULL – NULL = NULL
o NULL * 2 = NULL
• Obratiti pozornost ! NULL i nula (0) nisu isto.
Ak.god. 2014/2015. BAZE PODATAKA 61
NVL funkcija
• SELECT id_djelatnika, ime, prezime, placa, dodatak,
placa+dodatak UKUPNA_PLACA
FROM djelatnik;
• SELECT id_djelatnika, ime, prezime, placa, dodatak,
placa+NVL(dodatak,0) UKUPNA_PLACA
FROM djelatnik;
Ak.god. 2014/2015. BAZE PODATAKA 62
IF-THEN-ELSE
• IF-THEN-ELSE logika u SQL upitima se može realizirati korištenjem:
o CASE izraza
o DECODE funkcije (Oracle)
Ak.god. 2014/2015. BAZE PODATAKA 63
CASE, DECODE – Primjeri
Primjer:
• SELECT ime, prezime, spol,
CASE spol
WHEN 'M' THEN 'Muško'
WHEN 'Ţ' THEN 'Ţensko'
ELSE '???'
END
FROM djelatnik;
• SELECT ime, prezime, spol,
DECODE ( spol, 'M', 'Muško', 'Ţ', 'Ţensko', '???')
FROM djelatnik;
Ak.god. 2014/2015. BAZE PODATAKA 64
CASE, DECODE – Primjeri
Primjer:
• SELECT ime, prezime, spol, placa,
CASE spol
WHEN 'M' THEN placa*0.95
WHEN 'Ţ' THEN placa*1.1
ELSE placa
END nova_plaća
FROM djelatnik;
• SELECT ime, prezime, spol, placa,
DECODE (spol, 'M', placa*0.95, 'Ţ', placa*1.1, placa) nova_plaća
FROM djelatnik;
Ak.god. 2014/2015. BAZE PODATAKA 65
Osnovne metode spajanja tablica
Ak.god. 2014/2015. BAZE PODATAKA 66
SQL (spajanje tablica)
SQL – osnovne metode spajanja tablica:
equi-join
non-equi join
outer join
self join
Ak.god. 2014/2015. BAZE PODATAKA 67
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.
Ak.god. 2014/2015. BAZE PODATAKA 68
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
Ak.god. 2014/2015. BAZE PODATAKA 69
SQL CROSS 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 produkta relacija ĉesto je posljedica pogreške programera – kad se zaboravi navesti uvjet spajanja.
Ak.god. 2014/2015. BAZE PODATAKA 70
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
SQL CROSS JOIN
Ak.god. 2014/2015. BAZE PODATAKA 71
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;
SQL EQUI JOIN
Ak.god. 2014/2015. BAZE PODATAKA 72
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;
SQL EQUI JOIN
OSOBA wv MJESTO
Ak.god. 2014/2015. BAZE PODATAKA 73
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;
SQL EQUI JOIN
Ak.god. 2014/2015. BAZE PODATAKA 74
• EQUI JOIN – spajanje koje se najčešće koristi !
o Kao operator spajanja koristi se isključivo operator jednakosti (=)
• NON-EQUI JOIN – spajanje koje se relativno rijetko koristi.
o Kod pisanja uvjeta spajanja ne koristi se operator jednakosti (=), nego se koriste drugi operatori usporedbe (>, <, >=, <=, <>)
Primjer:
• SELECT o.ime, o.prezime, o.placa
FROM osoba o, platni_razred p
WHERE o.placa > p.min_placa;
SQL NON-EQUI JOIN
Ak.god. 2014/2015. BAZE PODATAKA 75
• NATURAL JOIN – bazira se na spajanju onih atributa iz tablica koji imaju isto ime i tip.
U donjem primjeru to je atribut sifra_zupanije (PK u tablici zupanija, FK u tablici opcina).
Primjer:
• SELECT o.sifra_opcine, o.naziv_opcine, z.naziv_zupanije
FROM opcina o NATURAL JOIN zupanija z;
SQL NATURAL JOIN
Ak.god. 2014/2015. BAZE PODATAKA 76
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
?
SQL OUTER 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;
Ak.god. 2014/2015. BAZE PODATAKA 77
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;
SQL OUTER JOIN
Ak.god. 2014/2015. BAZE PODATAKA 78
Primjer:
• SELECT d.ime, d.prezime, d.placa, rm.naziv_radmj
FROM djelatnik d JOIN radno_mjesto rm
ON d.sifra_radmj=rm.sifra_radmj
WHERE placa>1500;
• SELECT d.ime, d.prezime, d.placa, rm.naziv_radmj, o.naziv_odjela
FROM djelatnik d JOIN radno_mjesto rm
ON d.sifra_radmj=rm.sifra_radmj
LEFT JOIN odjel o
ON rm.sifra_odjela=o.sifra_odjela
WHERE placa>1500;
SQL OUTER JOIN
Ak.god. 2014/2015. BAZE PODATAKA 79
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;
SQL OUTER JOIN
Ak.god. 2014/2015. BAZE PODATAKA 80
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
SQL SELF JOIN
• SELECT a.id, a.ime, b.ime šef
FROM osoba a JOIN osoba b
ON a.id_sefa=b.id;
Ak.god. 2014/2015. BAZE PODATAKA 81
Primjer:
• SELECT d1.ime || ' ' || d1.prezime djelatnik, d1.placa, d2.ime || ' ' || d2.prezime šef, d2.placa
FROM djelatnik d1, djelatnik d2
WHERE d1.id_sefa=d2.id_djelatnika
AND d1.placa > d2.placa;
• SELECT d1.ime || ' ' || d1.prezime djelatnik, d1.placa, d2.ime || ' ' || d2.prezime šef, d2.placa
FROM djelatnik d1 JOIN djelatnik d2
ON d1.id_sefa = d2.id_djelatnika
WHERE d1.placa > d2.placa;
SQL SELF JOIN
Ak.god. 2014/2015. BAZE PODATAKA 82
SQL podupiti
Ak.god. 2014/2015. BAZE PODATAKA 83
Podupiti
SELECT ...
FROM ...
WHERE ...
( SELECT ...
FROM ...
WHERE ... )
Podupit
Ak.god. 2014/2015. BAZE PODATAKA 84
Korištenje podupita
Primjer:
• SELECT ime, prezime, placa
FROM djelatnik
WHERE placa >
( SELECT placa
FROM djelatnik
WHERE ime = 'Ernest' );
• U ovom primjeru «unutarnji» SELECT iskaz (PODUPIT) vraća plaću djelatnika po imenu Ernest.
• «Vanjski» SELECT iskaz koristi taj rezultat «unutarnjeg» upita da bi prikazao sve djelatnike koji zarađuju više od tog iznosa.
1800
Ak.god. 2014/2015. BAZE PODATAKA 85
Tipovi podupita
• Podupiti koji vraćaju jedan redak
Operatori: =, >, <, >=, <=, <>
• Podupiti koji vraćaju više od jednog retka
Operatori: IN, ANY, ALL
Ak.god. 2014/2015. BAZE PODATAKA 86
Podupiti – Primjeri najĉešćih pogrešaka
GREŠKA ! Podupit vraća više od jednog retka, a koristi se
operator jednakosti (=).
Primjer:
• SELECT id_djelatnika, ime, prezime, placa
FROM djelatnik
WHERE placa =
( SELECT MIN(placa)
FROM djelatnik
GROUP BY sifra_radmj );
→ ORA-01427: single-row subquery returns more than one row
Ak.god. 2014/2015. BAZE PODATAKA 87
Podupiti koji vraćaju više od jednog retka
IN operator
Da bi ispravili grešku u prethodnom upitu operator (=) npr. moţemo promijeniti u operator (IN).
Primjer:
• SELECT id_djelatnika, ime, prezime, placa
FROM djelatnik
WHERE placa IN
( SELECT MIN(placa)
FROM djelatnik
GROUP BY sifra_radmj );
Ak.god. 2014/2015. BAZE PODATAKA 88
Podupiti – Primjeri najĉešćih pogrešaka
GREŠKA ! Podupit ne vraća niti jedan redak.
Primjer:
• SELECT ime, prezime, sifra_radmj
FROM djelatnik
WHERE sifra_radmj =
( SELECT sifra_radmj
FROM djelatnik
WHERE ime='Grigor' );
Ak.god. 2014/2015. BAZE PODATAKA 89
Podupiti – Primjer
Primjer: • Prikaţi djelatnike ĉije radno mjesto je isto kao i djelatnika 101.
• SELECT ime, prezime, sifra_radmj
FROM djelatnik
WHERE sifra_radmj =
( SELECT sifra_radmj
FROM djelatnik
WHERE id_djelatnika = 101 );
IT-PROG
Ak.god. 2014/2015. BAZE PODATAKA 90
Podupiti – Primjer korištenja agregatnih funkcija
Primjer: • Prikaţi sve djelatnike (ime, prezime, datum zaposlenja, plaća)
ĉija plaća je veća od prosjeĉne plaće u poduzeću.
• SELECT ime, prezime, datum_zaposlenja, placa
FROM djelatnik
WHERE placa >
( SELECT AVG (placa)
FROM djelatnik
);
1.450
Ak.god. 2014/2015. BAZE PODATAKA 91
Podupiti – Primjer
Primjer: • Prikaţi djelatnike ĉije radno mjesto je isto kao i djelatnika 101
i ĉija plaća je veća od plaće djelatnike 2.
• SELECT ime, prezime, sifra_radmj, placa
FROM djelatnik
WHERE sifra_radmj = ( SELECT sifra_radmj
FROM djelatnik
WHERE id_djelatnika = 101 )
AND placa > ( SELECT placa
FROM djelatnik
WHERE id_djelatnika = 2 );
Ak.god. 2014/2015. BAZE PODATAKA 92
Podupiti – Primjer korištenja podupita u HAVING dijelu iskaza
Primjer:
• SELECT sifra_radmj, AVG (placa)
FROM djelatnik
GROUP BY sifra_radmj
HAVING AVG (placa) >
( SELECT AVG(placa)
FROM djelatnik
WHERE sifra_radmj='IT-PROG');
• Podupit se moţe koristiti ne samo u WHERE dijelu SELECT iskaza, nego i u HAVING dijelu iskaza.
• Prvo se izvršava podupit, a zatim se rezultat podupita vraća u HAVING dio vanjskog upita.
Ak.god. 2014/2015. BAZE PODATAKA 93
Podupiti koji vraćaju više od jednog retka
ANY i ALL operator
< ANY = manje od maximuma
> ANY = više od minimuma
< ALL = manje od minimuma
> ALL = više od maximuma
Ak.god. 2014/2015. BAZE PODATAKA 94
Podupiti – Primjer
Primjer: • Prikaţi djelatnike koji nisu IT programeri i ĉija plaća je niţa od
plaće nekog od IT programera.
• SELECT id_djelatnika, ime, prezime, sifra_radmj, placa
FROM djelatnik
WHERE placa < ANY
( SELECT placa
FROM djelatnik
WHERE sifra_radmj = 'IT-PROG' )
AND sifra_radmj <> 'IT-PROG' ;
Ak.god. 2014/2015. BAZE PODATAKA 95
Podupiti – Primjer
Primjer: • Prikaţi djelatnike koji nisu na radnom mjestu PROD-KAM i ĉija
plaća je niţa od plaće svih djelatnika na radnom mjestu PROD-KAM.
• SELECT id_djelatnika, ime, prezime, sifra_radmj, placa
FROM djelatnik
WHERE placa < ALL
( SELECT placa
FROM djelatnik
WHERE sifra_radmj = 'PROD-KAM' )
AND sifra_radmj <> 'PROD-KAM' ;
Ak.god. 2014/2015. BAZE PODATAKA 96
Korelacijski podupiti
uzima se kandidat red iz vanjskog upita
izvršava se unutarnji upit koristeći podatke iz
kandidat reda
vrijednosti iz unutarnjeg upita se koriste da se kandidat red
kvalificira ili diskvalificira
• Podupit (unutarnji upit) se izvršava jedanput za svaki redak iz vanjskog upita.
Ak.god. 2014/2015. BAZE PODATAKA 97
Korelacijski podupiti
Primjer: • Prikaţi sve djelatnike koji zaraĊuju više od prosjeĉne plaće u
njihovom odjelu.
• SELECT ime, prezime, d.sifra_radmj, placa
FROM djelatnik d, radno_mjesto vanjski_rm
WHERE d.sifra_radmj=vanjski_rm.sifra_radmj
AND placa > ( SELECT AVG(placa)
FROM djelatnik d, radno_mjesto rm
WHERE d.sifra_radmj=rm.sifra_radmj
AND rm.sifra_odjela = vanjski_rm.sifra_odjela );
Ak.god. 2014/2015. BAZE PODATAKA 98
EXISTS operator
• EXISTS operator testira postojanje redaka u rezultatu podupita:
– ako podupit vrati bar jedan redak operator EXISTS će vratiti TRUE.
– ako podupit ne vrati niti jedan redak operator EXISTS će vratiti FALSE.
Ak.god. 2014/2015. BAZE PODATAKA 99
Podupiti – Primjer
Primjer: • Prikaţi sve djelatnike koji imaju bar jednu osobu koja im je
“podreĊena”.
a) korištenjem EXISTS operatora
• SELECT id_djelatnika, ime, prezime, sifra_radmj
FROM djelatnik d
WHERE EXISTS (
SELECT 'X'
FROM djelatnik
WHERE id_sefa=d.id_djelatnika
);
Ak.god. 2014/2015. BAZE PODATAKA 100
Podupiti – Primjer
Primjer: • Prikaţi sve djelatnike koji imaju bar jednu osobu koja im je
“podreĊena”.
b) korištenjem IN operatora
• SELECT id_djelatnika, ime, prezime, sifra_radmj
FROM djelatnik
WHERE id_djelatnika IN (
SELECT id_sefa
FROM djelatnik
WHERE id_sefa IS NOT NULL
);
Ak.god. 2014/2015. BAZE PODATAKA 101
Podupiti – Primjer
Primjer: • Prikaţi općine u kojima ne ţivi niti jedan djelatnik poduzeća.
a) korištenjem NOT EXISTS operatora
• SELECT sifra_opcine, naziv_opcine
FROM opcina o
WHERE NOT EXISTS (
SELECT 'X'
FROM djelatnik
WHERE sifra_opcine=o.sifra_opcine
);
Ak.god. 2014/2015. BAZE PODATAKA 102
Podupiti – Primjer
Primjer: • Prikaţi općine u kojima ne ţivi niti jedan djelatnik poduzeća.
b) korištenjem NOT IN operatora
• SELECT sifra_opcine, naziv_opcine
FROM opcina
WHERE sifra_opcine NOT IN
( SELECT sifra_opcine
FROM djelatnik );
Ak.god. 2014/2015. BAZE PODATAKA 103
Web:
http://www.fsr.ba/~goran
Pitanja, primjedbe, dogovor za konzultacije ...
o E-mail: [email protected]
Baze podataka