You are on page 1of 17

Kolegij

Baze podataka
Spajanje tablica
Povezivanje (spajanje) tablica
- podaci se mogu dohvaćati iz više tablica korištenjem jedne SELECT naredbe

- spajanje podataka iz više tablica uz uvjet da postoje zajedničke kolone (ključevi)

- PRIMARNI KLJUČ (engl. primary key) – jednoznačno određuje podatak


u tablici, a definira se na nivou jedne ili više kolona

- STRANI KLJUČ (engl. foreign key) – koristi se za vezu između


pojedinih tablica i ne mora biti jednoznačno određen unutar tablice

Primarni Strani Primarni


ključ ključ ključ
ID ime prezime sifra_odjel ID ime_odjel
1 Marko Markić 1 1 Proizvodnja
2 Ivo Ivić 2
2 Nabava
Povezivanje (spajanje) tablica
zaposlenik odjel
ID ime prezime sifra_odjel ID ime_odjel
1 Marko Markić 1 1 Proizvodnja
2 Ivo Ivić 2 2 Nabava

CILJ PREDAVANJA! Želimo ispisati jednu tablicu u kojoj će umjesto


šifre odjela pisati ime odjela!

ID ime prezime ime_odjel


1 Marko Markić Proizvodnja
2 Ivo Ivić Nabava
Načini spajanja (JOIN) tablica:
Glavni načini spajanja tablica:
EQUI-JOIN – povezivanje tablica pomoću zajedničke
kolone (korištenje ključeva)

NON-EQUI JOIN – povezivanje tablica korištenjem pojedinih SQL


operatora

Ostale metode spajanja tablica:


OUTER JOIN – koristi se u slučajevima spajanja tablica kada u jednoj tablici
ne postoji vrijednost za određenu kolonu, dok u drugoj
tablici ta vrijednost postoji

SELF JOIN – spajanje podataka tablice sa podacima te iste tablice

SET OPERATORS – skup operatora koji se koristi za kombiniranje


rezultata od više izvedenih SELECT naredbi
Nekorektno povezivanje tablica
- u slučajevima da spajanje ne završi korektno, rezultat je
umnožak (PRODUCT) tih tablica, a broj dobivenih
podataka biti će jednak umnošku broja pojedinih tablica
(tzv. Kartezijev produkt)

SELECT first_name, last_name, department_name


FROM employees, departments;
- rezultat nije korektan jer su prikazani svi redovi iz prve tablice (employees)
povezani sa svim redovima druge tablice (departments)
- broj redaka kod ispisa: 107(employees) x 27(departments) = 2889
zaposlenik odjel
ID ime prezime sifra_odjel ID ime_odjel
1 Ivo Ivić 1 1 Proizvodnja
2 Ana Anić 1 2 Nabava
3 Petar Perić 2

SELECT * FROM zaposlenik, odjel


Rezultat spajanja navedenih relacija je produkt relacija i nastala je relacija
koja se sastoji od ukupno 3 x 2 redaka! (Kartezijev produkt)

ID ime prezime sifra_odjel ID ime_odjel


1 Ivo Ivić 1 1 Proizvodnja
2 Ana Anić 1 1 Proizvodnja
3 Petar Perić 2 1 Proizvodnja
1 Ivo Ivić 1 2 Nabava
2 Ana Anić 1 2 Nabava
3 Petar Perić 2 2 Nabava
Equi-Join (1/2)
- povezivanje tablica pomoću zajedničke kolone (korištenje ključeva)

- za spajanje tablica koristi se WHERE klauzula

zaposlenik odjel
ID ime prezime sifra_odjel ID ime_odjel
1 Ivo Ivić 1 1 Proizvodnja
2 Ana Anić 1
2 Nabava
3 Petar Perić 2

SELECT ime, prezime, ime_odjel


FROM zaposlenik, odjel
WHERE zaposlenik.sifra_odjel = odjel.id ime prezime ime_odjel
Ivo Ivić Proizvodnja
Ana Anić Proizvodnja
Petar Perić Nabava
Equi-Join (2/2)

- kod Equi-Join veze potrebno je točno navesti na koju


se tablicu odnosi zajednička kolona

SELECT first_name, last_name,department_id, department_name


FROM employees, departments
WHERE employees.department_id = departments.department_id
ORA-00918: column ambiguously defined

SELECT first_name, last_name, employees.department_id,


department_name
FROM employees, departments
WHERE employees.department_id = departments.department_id
- navedenim upitom točno je definirana zajednička kolona
Aliasi nad tablicom
- koriste se kao alternativna imena za pojedine tablice
- smanjuju SQL kod
- ubrzavaju pristup podacima u bazama podataka
- alias imena trebaju biti kratka

Primjer:

SELECT e.first_name, e.last_name, d.department_id,


d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id
ORDER by d.department_id;
Non Equi-Join (1/2)
- povezivanje tablica korištenjem SQL operatora, a u
slučajevima kada ne postoji zajednička kolona između tablica

- koristi se za vrijednosti unutar određenih raspona

Primjer: Koje sve poslove može obavljati pojedini radnik, a da mu sadašnja plaća
bude u granicama između najmanje i najveće plaće definirane za pojedine
poslove

SELECT e.first_name, e.last_name, e.salary, j.job_title, j.min_salary, j.max_salary


FROM employees e, jobs j
WHERE e.salary BETWEEN j.min_salary AND j.max_salary
ORDER BY e.first_name;
Non Equi-Join (2/2)
Primjer: Koje sve poslove može obavljati pojedini radnik, a da mu sadašnja plaća bude u granicama između najmanje i najveće plaće definirane za pojedine poslove

zaposlenik posao
ID ime prezime placa ID naziv min_placa max_placa
1 Ivo Ivić 4000 1 analitičar 3000 5000
2 Ana Anić 5000 2 programer 4500 5500
3 Petar Perić 6000 3 voditelj 5000 6000

SELECT z.ime, z.prezime, z.placa, p.naziv, p.min_placa, p.max_placa


FROM zaposlenik z, posao p
WHERE z.placa BETWEEN p.min_placa AND p.max_placa

ime prezime placa naziv min_placa max_placa


Ivo Ivić 4000 analitičar 3000 5000
Ana Anić 5000 analitičar 3000 5000
Ana Anić 5000 programer 4500 5500
Ana Anić 5000 voditelj 5000 6000
Petar Perić 6000 voditelj 5000 6000
Outer Join
- koristi se u slučajevima spajanja tablica kada u jednoj tablici
ne postoji vrijednost za određenu kolonu, dok u drugoj tablici
ta vrijednost postoji

- npr. u tablici EMPLOYEES ne postoji radnik koji radi u odjelu


sa šifrom 120, dok u tablici DEPARTMENTS postoji taj odjel
SELECT e.first_name, e.last_name, d.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id (+) = d.department_id
AND d.department_id IN (20,120);

- Outer join operator se obilježava sa (+)

- Outer join operator se može napisati samo na jednoj strani izraza i to na onoj na
kojoj nedostaje podatak
Self Join (1/2)
- koristi se za spajanje podataka određene tablice sa
podacima te iste tablice

Primjer: Koji radnici imaju veću plaću od svojih manager-a?

SELECT e.first_name || e.last_name EMP_NAME,


e.salary EMP_SAL,
m.first_name || m.last_name MGR_NAME,
m.salary MGR_SAL
FROM employees e, employees m
WHERE e.manager_id = m.employee_id
AND e.salary > m.salary;
Self Join (2/2)
zaposlenik
ID ime prezime sifra_manager
1 Ivo Ivić NULL
2 Ana Anić 1
3 Petar Perić 2
Primjer: Napišite upit koji će ispisati ime i prezime radnika te njegovog managera!

SELECT z.ime || ‘ ‘ || z.prezime AS zaposlenik,


m.ime || ‘ ‘ || m.prezime AS manager,
FROM zaposlenik z, zaposlenik m
WHERE r.sifra_manager = m.ID

zaposlenik manager
Ana Anić Ivo Ivić
Petar Perić Ana Anić
Set Operators (1/2)
- skup operatora koji se koriste za kombiniranje rezultata od više
izvedenih SELECT-a
- izvode spajanje prema određenim kolonama
1. UNION
2. INTERSECT
3. MINUS

Primjeri:

SELECT department_id FROM departments


UNION
SELECT department_id FROM employees;

- ispisuje sve šifre odjela koje se pojavljuju u obje tablice


- eliminira duple redove tj. izvršava DISTINCT klauzulu
Set Operators (2/2)

SELECT department_id FROM departments


UNION ALL
SELECT department_id FROM employees;
- ispisuje sve šifre odjela koje se pojavljuju u obje tablice, ali bez eliminacije
duplih redova (ne izvršava DISTINCT klauzulu)

SELECT department_id FROM departments


INTERSECT
SELECT department_id FROM employees;
- ispisuje samo one šifre odjela koje se pojavljuju u obje tablice

SELECT department_id FROM departments


MINUS
SELECT department_id FROM employees;
- ispisuje samo one šifre odjela koje se pojavljuju u prvoj tablici, ali ne postoje u drugoj
SAŽETAK
- 5 načina spajanja tablica, od kojih su Equi-Join i Non-Equi-Join
glavni načini spajanja

- preporuča se korištenje aliasa nad tablicama radi efikasnijeg koda i


performansi

- svi načini povezivanja tablica osim pomoću ‘set operatora’ povezuju


tablice na nivou redaka.

- povezivanje pomoću ‘set operatora’ izvodi se na nivou kolona


(stupaca)

You might also like