Download as pdf or txt
Download as pdf or txt
You are on page 1of 75

Baze podataka

SQL
Jezik relacione BP

SQL

UPIT
- SELECT -

SQL je jezik veoma visokog nivoa (very-high-level language)


Programer izbegava korienje komplikovanih manipulacija nad
podacima (to je neophodno u jezicima kao to je C++, Java, itd.)

Pogodnost SQL-a
Upiti su veoma dobro optimizovani
Upiti se efikasno izvravaju

SQL

UPIT
- SELECT -

Najznaajnija i najee koriena SQL naredba za


manipulaciju podacima
Kod svakog upita zadajemo (u principu):
Koje podatke traimo kao rezultat,
Iz kojih tabela to traimo,
Koji uslov treba da zadovolje podaci, da bi bili ukljueni u
rezultat
U kom redosledu elimo prikaz podataka

SQL

UPIT
- SELECT -

Principska ema za postavljanje upita je:


SELECT koji atributi
FROM iz kojih tabela
WHERE uslov nad zapisima date tabele;

SQL

UPIT
- SELECT -

Tipian SQL upit:


SELECT A1, A2, ..., An
FROM r1, r2, ...rm
WHERE P
gde su Ai atributi, ri relacije, a P je uslov selekcije (predikat)
Navedeni upit je ekvivalentan sledeem upitu relacione
algebre
A1, A2, ..., An(P(r1r2 ... rn))
Rezultat SQL upita je opet relacija

SQL

Prost upit nad jednom tabelom

Sintaksa
SELECT * {[ALL DISTINCT] R-Lista}
FROM ImeTabele
[WHERE R-Predikat]
[ORDER BY ImeKolone [DESC]
{, ImeKolone [DESC]} ];
* - Specijalni sluaj R-liste, kada u rezultat elimo da
ukljuimo sve kolone tabele
ALL iz rezultata neuklanja istovetne redove,
DISTINCT suprotno. Podrazumeva se ALL.
R-Lista se zadaje kao jedan ili vie R-Izraza, pored naziva
kolone javljaju se i konstante
SQL

Prost upit nad jednom tabelom


Klauzula FROM (odakle), specificira se ImeTabele. To je
ime osnovne tabele ili pogleda nad kojim se vri upit. Ovo je
obavezna klauzula.
R_Predikat , uslov prikazivanja rezultata,
to je logiki izraz izraunljiv nad svakim pojedinim redom
tabele.
Rezultat upita se dobija samo za one vrednosti
R_Predikata koje daju istinitosnu vrednost.
Najee je to relacioni izraz (>,<,=,) sa kolonama, a
sa desne strane moe se javiti i konstanta
ORDER BY daje eljeni redosled prikaza rezultata.
Podrazumeva se rastui redosled (ASC). U suprotnom se
navodi DESC uz odgovarajuu kolonu. Uvek je poslednja
klauzula u SELECT bloku.
SQL

Prost upit nad jednom tabelom

Najjednostavniji mogui SQL upit je u formi:


SELECT * FROM ImeTabele;
Ova naredba prikazuje sve redove tabele ije je ime
navedeno iza FROM klauzule
U svakom redu prikazuju se vrednosti svih kolona, onim
redom kako je to zapisano u datoteci (tj. kreirano sa
CREATE TABLE)
Kod upita se obino trai prikaz samo odreenih kolona, ili
prikaz svih kolona u redosledu koji je drugaije odreen.
Ovo odgovara operaciji projekcije, ali se ne eliminiu
viestruka ponavljanja istih vrednosti
SQL

Prost upit nad jednom tabelom

Primeri: Upiti sa dobijenim rezultatima


Upit za prikaz cele tabele (simbol *)
Ogovara restrikciji - kada nema uslova P
SELECT *
FROM Student ;
Student
BrInd Ime

Prezime

BrInd Ime

Prezime

Marko

Markovi

Marko

Markovi

Petar

Petrovi

Petar

Petrovi

Aleksa

Peri

Aleksa

Peri

SELECT

SQL

Prost upit nad jednom tabelom


Tri iste naredbe !
SELECT *
FROM Student;
SELECT BrInd, Ime, Prezime
FROM Student;
SELECT Student.BrInd, Student.Ime, Student.Prezime
FROM Student;
Student
BrInd Ime

Prezime

BrInd Ime

Prezime

Marko

Markovi

Marko

Markovi

Petar

Petrovi

Petar

Petrovi

Aleksa

Peri

Aleksa

Peri

SELECT

SQL

10

Prost upit nad jednom tabelom

Upit za prikaz cele tabele u eljenom redosledu


SELECT *
FROM Student
ORDER BY Ime;

Student
BrInd Ime

Prezime

BrInd Ime

Prezime

Marko

Markovi

Aleksa

Peri

Petar

Petrovi

Marko

Markovi

Aleksa

Peri

Petar

Petrovi

28.11.2006.

SELECT

Predavanja
SQL

11

11

Prost upit nad jednom tabelom


Upit za prikaz samo jedne kolone iz tabele i bez
eliminacije duplikata
SELECT Fakultet
FROM Student;
Odgovara upitu relacione algebre
Fakultet(Student)
Student
BrInd Ime

Prezime

Fakultet

Fakultet

Marko

Markovi

PFB

PFB

Petar

Petrovi

FIM

FIM

Aleksa

Peri

FIM

Marko

Mari

FTHM

FTHM

Petar

Lazi

PFB

PFB

Jovan

Mari

PFB

PFB

SELECT

SQL

FIM

12

Prost upit nad jednom tabelom

Upit za prikaz samo jedne kolone iz tabele i sa eliminacijom


duplikata :
SELECT DISTINCT Fakultet
FROM Student ;
Student
BrInd Ime

Prezime

Fakultet

Marko

Markovi

PFB

Petar

Petrovi

FIM

Aleksa

Peri

FIM

Marko

Mari

FTHM

Petar

Lazi

PFB

Jovan

Mari

PFB

28.11.2006.

Fakultet
SELECT

PFB
FIM
FTHM

Predavanja
SQL

13

Prost upit nad jednom tabelom

Upit za prikaz samo jedne kolone iz tabele i sa eliminacijom


duplikata, a u eljenom redosledu:
SELECT DISTINCT Fakultet
FROM Student
ORDER BY Fakultet ;
Student
BrInd Ime

Prezime

Fakultet

Marko

Markovi

PFB

Petar

Petrovi

FIM

Aleksa

Peri

FIM

Marko

Mari

FTHM

Petar

Lazi

PFB

Jovan

Mari

PFB

28.11.2006.

Fakultet
SELECT

FIM
FTHM
PFB

Predavanja
SQL

14

Prost upit nad jednom tabelom

Upit za prikaz vie kolona sa zadavanjem uslova:


SELECT BrInd, Ime, Prezime
FROM Student
WHERE Fakultet=FIM;
Student
BrInd Ime

Prezime

Fakultet

Marko

Markovi

PFB

Petar

Petrovi

FIM

Aleksa

Peri

FIM

Marko

Mari

FTHM

Petar

Lazi

PFB

Jovan

Mari

PFB

SELECT

SQL

BrInd Ime

Prezime

Petar

Petrovi

Aleksa

Peri

15

Prost upit nad jednom tabelom

Upit za prikaz dve kolone sa zadavanjem uslova, a u


eljenom redosledu:
SELECT BrInd, Ime, Prezime
FROM Student
WHERE Fakultet=FIM
ORDER BY Ime;
Student
BrInd Ime

Prezime

Fakultet

Marko

Markovi

PFB

Petar

Petrovi

FIM

Aleksa

Peri

FIM

Marko

Mari

FTHM

Petar

Lazi

PFB

Jovan

Mari

PFB

SELECT

SQL

BrInd Ime

Prezime

Aleksa

Peri

Petar

Petrovi

16

Prost upit nad jednom tabelom

U WHERE klauzuli se mogu koristiti logike i aritmetike


operacije:
SELECT BrInd, Ime, Prezime
FROM Student
WHERE Fakultet=FIM OR Fakultet=FTHM
ORDER BY Ime;
Student
BrInd Ime

Prezime

Fakultet

Marko

Markovi

PFB

Petar

Petrovi

FIM

Aleksa

Peri

FIM

Marko

Mari

FTHM

Petar

Lazi

PFB

Jovan

Mari

PFB

SELECT

SQL

BrInd Ime

Prezime

Aleksa

Peri

Marko

Mari

Petar

Petrovi
17

Prost upit nad jednom tabelom


Komanda SELECT moe da sadri aritmetike izraze koji
ukljuuju operacije, +, , , /, na konstantama ili atributima:
SELECT SifP, NazivP, Cena 100
FROM Racun;
Racun
SifP

NazivP

Kolicina

Cena

SifP

NazivP

Cena

005

P1

1800,00

005

P1

180000,00

010

P2

300,00

010

P2

30000,00

020

P3

250,00

020

P3

25000,00

001

P3

1100,00

001

P3

110000,00

003

P3

600,00

003

P3

60000,00

011

P1

700,00

011

P1

70000,00

SELECT

SQL

18

Prost upit nad jednom tabelom


Pojedine vrednosti atributa mogu NULL vrednost
Predikat IS NULL se koristi za proveru null vrednosti
Npr: Nai sve ifre prouzvoda kod kojih je cena NULL
SELECT SifP
FROM Racun
WHERE Cena IS NULL ;
Racun
SifP

NazivP

Kolicina

Cena

005

P1

1800,00

010

P2

NULL

020

P3

250,00

001

P3

1100,00

003

P3

NULL

011

P1

NULL

SifP
SELECT

010
003
011

SQL

19

Prost upit nad jednom tabelom


sa izvedenim rezultatom
Podrazumeva se naredba upita SELECT nad jednom
tabelom koja kao rezultat daje jedan red podataka koji su
izvedeni iz svih redova tabele, koji zadovoljavaju zadati
uslov
SELECT lista takvog upita se sastoji iz jednog ili vie izraza
Zadavanje redosleda redova u rezultatu nema smisla
(dobija se samo jedan red)

SQL

20

Prost upit nad jednom tabelom


sa svodnim rezultatom
Sintaksa za SELECT (prost upit nad jednom T sa svodnim
rezultatom)
SELECT G-Izrazi
FROM ImeTabele
[WHERE R-Predikat];
G-Izrazi: najee ih ine posebne SQL funkcije
(svodne ili agregatne funkcije)
Svodne funkcije:
SUM (ImeKolone)
Nalazi sumu svih ne-NULL
vrednosti zadate kolone
AVG (ImeKolone)
Nalazi prosenu vrednost svih neNULL vrednosti zadate kolone
SQL

21

Prost upit nad jednom tabelom


sa izvedenim rezultatom
MIN (ImeKolone)
Nalazi minimalnu vrednost svih neNULL vrednosti zadate kolone
MAX (ImeKolone)
Nalazi maksimalnu vrednost svih
ne-NULL vrednosti zadate kolone
COUNT(*)
Nalazi ukupan broj redova u tabeli
COUNT([ALLDISTINCT] ListaKolona)
Bez DISTINCT nalazi ukupan broj ne-NULL vrednosti
zadate kombinacije kolona
Sa DISTINCT nalazi ukupan broj razliitih ne-NULL
vrednosti zadate kombinacije kolona

SQL

22

Prost upit nad jednom tabelom sa


izvedenim rezultatom
Upit za prikaz ukupnog broja studenata (odgovara broju
redova u tabeli Student)
SELECT COUNT(*)
FROM Student ;
Student
BrInd Ime

Prezime

Fakultet

Marko

Markovi

PFB

Petar

Petrovi

FIM

Aleksa

Peri

FIM

Marko

Mari

FTHM

Petar

Lazi

PFB

Jovan

Mari

PFB

SELECT

SQL

23

Prost upit nad jednom tabelom sa


izvedenim rezultatom
Upit za prikaz broja fakulteta na koje su upisani studenati
(odgovara broju razliitih vrednosti kolone Fakultet u
tabeli Student)
SELECT COUNT(DISTINCT Fakultet)
FROM Student ;

Student

BrInd Ime

Prezime

Fakultet

Marko

Markovi

PFB

Petar

Petrovi

FIM

Aleksa

Peri

FIM

Marko

Mari

FTHM

Petar

Lazi

PFB

Jovan

Mari

PFB

SELECT

SQL

24

Prost upit nad jednom tabelom


sa izvedenim rezultatom
Upit za prikaz broja studenata koji su upisali FTHM
SELECT COUNT(*)
FROM Student
WHERE Fakultet=FTHM;
Student
BrInd Ime

Prezime

Fakultet

Marko

Markovi

PFB

Petar

Petrovi

FIM

Aleksa

Peri

FIM

Marko

Mari

FTHM

Petar

Lazi

PFB

Jovan

Mari

PFB

SELECT

SQL

25

Prost upit nad jednom tabelom


sa izvedenim rezultatom
Upit za prikaz sume cena svih proizvoda:
SELECT SUM(Cena)
FROM Racun;
Racun
SifP

NazivP

Kolicina

Cena

005

P1

1800,00

010

P2

300,00

020

P3

250,00

001

P3

1100,00

003

P3

600,00

011

P1

700,00

SELECT

SQL

1800+300+250+1100 ....

26

Prost upit nad jednom tabelom


sa izvedenim rezultatom
Upit za prikaz minimalne i maksimalne cene iz rauna:
SELECT MIN(Cena), MAX(Cena)
FROM Racun;
Racun
SifP

NazivP

Kolicina

Cena

005

P1

1800,00

010

P2

300,00

020

P3

250,00

001

P3

1100,00

003

P3

600,00

011

P1

700,00

SELECT

SQL

250

1800

27

Prost upit nad jednom tabelom


sa izvedenim rezultatom
Upit za prikaz sume i proseka cena za proizvod P1:
SELECT SUM(Cena), AVG(Cena)
FROM Racun
WHERE NazivP= P1;
Racun

Primedba: rezultat AVG funkcije preuzima tip podataka od


argumenta (tip kolone)

SifP

NazivP

Kolicina

Cena

005

P1

1800,00

010

P2

300,00

020

P3

250,00

001

P3

1100,00

003

P3

600,00

011

P1

700,00

SELECT

SQL

2500

1250

28

Prost upit nad jednom tabelom


sa izvedenim rezultatom
Rezultat bilo kog aritemitikog izraza sa NULL je NULL
Na primer: 10+NULL daje NULL
Agregatne funkcije ignoriu NULL vrednosti
(izuzev COUNT(*)
Poreenje sa NULL daje unknown
Npr: 10<NULL, NULL<>NULL, NULL=NULL

SQL

29

Prost upit nad jednom tabelom


sa izvedenim rezultatom
Istinosna logika sa unknown:
OR:
(unknown OR true) = true,
(unknown OR false) = unknown
(unknown OR unknown) = unknown
AND:
(true AND unknown) = unknown,
(false AND unknown) = false,
(unknown AND unknown) = unknown
NOT:
(NOT unknown) = unknown
P is unknown je true ako je predikat P unknown
Rezultat predikata komande WHERE se tretira kao false
ako je unknown
SQL

30

Prost upit nad jednom tabelom


sa izvedenim rezultatom
Upit koji nema smisla:
SELECT SifC, SUM(Dana)
FROM Pozajmica;
Ovde je SifC podatak na nivou jednog reda, a
SUM(Dana) podatak sveden iz vie redova
Pozajmica (SifP,SifC,SifK,Dana)

SQL

31

Svodni upit nad jednom tabelom

Prethodni primer: eleo se prikaz sume trajanja pozajmica


po iframa lanova.
Dopuna: Prikazati samo podatke za lanove za koje je npr.
trajanje pozajmice >10
Postupak je sledei:
Od tabele Pozajmica formira se meurezultat sa
kolonama (SifC i Dana) grupisane po SifC
Formira se nova tabela sa jednom vrednou za SifC i
izraunate SUM (Dana) po SifC
Prikazati redove koji zadovoljavaju traeni uslov

SQL

32

Svodni upit nad jednom tabelom

SifP
1
2
3
4
5
6

SifC SifK Dana


JJ0 004 5
PP0 007 2
JJ1 005 6
JJ0 008 7
PP0 002 4
JJ1 009 3

SifC
JJ0
JJ0
PP0
PP0
JJ1
JJ1

Dana
5
7
2
4
6
3

SifC Dana
JJ0 12
PP0 6
JJ1
9

Rezultat
JJ0 12

Uslov:
SUM(Dana)>10

Potrebno je dodatno precizirati:


Po kojim kolonama se vri grupisanje, i koje svodne
funkcije se trae unutar grupe
Koji uslov se zadaje za ukljuenje svodnih redova u
rezultat
SQL

33

Svodni upit nad jednom tabelom

Sintaksa za SELECT za svodni upit nad jednom tabelom


SELECT ListaKolona [ListaFunkcija]
FROM ImeTabele
[WHERE R-Predikat]
GROUP BY ListaKolona
HAVING G-Predikat
[ORDER BY Element [DESC]
{, Element [DESC]} ];

SQL

34

Svodni upit nad jednom tabelom

WHERE, zadaje se uslov koji svaki red u tabeli


ImeTabele mora da zadovolji
GROUP BY, navodi se jedna ili vie kolona po kojima se
vri grupisanje
Kolone koje se navode ne moraju biti uz SELECT
Kolene koje su uz SELECT moraju se nai uz GRUP BY
HAVING, formira se uslov koji svaki red formiran
svoenjem mora da zadovolji da bi bio ukljuen u rezultat
Mogu da se jave kolone i funkcije koje nisu uz SELECT
ORDER BY, mogu se kao Element navoditi samo kolone
ili funkcije koje su navedene uz klauzulu SELECT
SQL

35

Svodni upit nad jednom tabelom

SifP
1
2
3
4
5
6

SifC SifK Dana


JJ0 004 5
PP0 007 2
JJ1 005 6
JJ0 008 7
PP0 002 4
JJ1 009 3

SifC
JJ0
JJ0
PP0
PP0
JJ1
JJ1

Dana
5
7
2
4
6
3

SifC Dana
JJ0 12
PP0 6
JJ1
9

Rezultat
JJ0 12

HEAVING
SUM(Dana)>10

GROUP BY
SifC, Dana
SQL

36

Svodni upit nad jednom tabelom

Primeri:
Upit za prikaz ifara autora i broja naslova koje su napisali
SELECT SifA, COUNT(*)
FROM Je_Autor
GROUP BY SifA ;

AP0
JN0
DM0
ZP0
AP1
IT0

SQL

1
1
2
2
1
1

37

Svodni upit nad jednom tabelom


Primer
BrInd

IdPred

IdProf

Ocena

100/2007

BP03

MV01

200/2007

BP03

MV01

100/2007

OOP02

RP00

150/2008

BP03

MV01

250/2008

OOP02

RP00

300/2006

RM03

MV01

100/2007

RM03

MV01

300/2006

RM03

MV01

SQL

Sala

Datum

Vreme

38

Svodni upit nad jednom tabelom


SELECT BrInd,AVG(Ocena)
FROM Ispit
GROUP BY BrInd;
Ispit
BrInd

IdPred

IdProf

Ocena

100/2007

BP03

MV01

200/2007

BP03

MV01

100/2007

OOP02

RP00

150/2008

BP03

MV01

250/2008

OOP02

RP00

300/2006

RM03

MV01

100/2007

RM03

MV01

300/2006

RM03

MV01

SQL

Sala

Datum

Vreme

39

Svodni upit nad jednom tabelom


SELECT IdPred,AVG(Ocena)
FROM Ispit
GROUP BY IdPred;
Ispit
BrInd

IdPred

IdProf

Ocena

100/2007

BP03

MV01

200/2007

BP03

MV01

100/2007

OOP02

RP00

150/2008

BP03

MV01

250/2008

OOP02

RP00

300/2006

RM03

MV01

100/2007

RM03

MV01

300/2006

RM03

MV01

SQL

Sala

Datum

Vreme

40

Svodni upit nad jednom tabelom


SELECT IdProf,AVG(Ocena)
FROM Ispit
GROUP BY IdProf;
Ispit
BrInd

IdPred

IdProf

Ocena

100/2007

BP03

MV01

200/2007

BP03

MV01

100/2007

OOP02

RP00

150/2008

BP03

MV01

250/2008

OOP02

RP00

300/2006

RM03

MV01

100/2007

RM03

MV01

300/2006

RM03

MV01

SQL

Sala

Datum

Vreme

41

Svodni upit nad jednom tabelom


SELECT IdProf,IdPred,AVG(Ocena)
FROM Ispit
GROUP BY IdProf, IdPred;
Ispit
BrInd

IdPred

IdProf

Ocena

100/2007

BP03

MV01

200/2007

BP03

MV01

100/2007

OOP02

RP00

150/2008

BP03

MV01

250/2008

OOP02

RP00

300/2006

RM03

MV01

100/2007

RM03

MV01

300/2006

RM03

MV01

SQL

Sala

Datum

Vreme

42

Svodni upit nad jednom tabelom


SELECT IdProf,IdPred,BrInd,AVG(Ocena)
FROM Ispit
neispravno
GROUP BY IdProf, IdPred;
Ispit
BrInd

IdPred

IdProf

Ocena

100/2007

BP03

MV01

200/2007

BP03

MV01

100/2007

OOP02

RP00

150/2008

BP03

MV01

250/2008

OOP02

RP00

300/2006

RM03

MV01

100/2007

RM03

MV01

300/2006

RM03

MV01

SQL

Sala

Datum

Vreme

43

Dekartov (Kartezijanov) proizvod


Neka je zadata relacija r(R) i s(S), pri emu je RS=
Nakon Dekartovog proizvoda
p=rs
dobija se relacija p(P), gde je P=RS
deg(p)=deg(r)+deg(s)
card(p)=card(r)card(s)

SQL

44

Dekartov (Kartezijanov) proizvod


Predmet

Student
Prezime

Sifra

Naziv

100/2010 Marko

Markovi

SPRI01

Informatika

200/2011 Petar

Petrovi

SPRI02

Matematika

SPRI03

Engleski jezik 1

BrInd

Ime

Upis = Student Predmet


BrInd

Ime

Prezime

Sifra

Naziv

100/2010 Marko Markovi

SPRI01

Informatika

100/2010 Marko Markovi

SPRI02

Matematika

100/2010 Marko Markovi

SPRI03

Engleski jezik 1

200/2011 Petar

Petrovi

SPRI01

Informatika

200/2011 Petar

Petrovi

SPRI02

Matematika

200/2011 Petar

Petrovi

SPRI03

Engleski jezik 1

SELECT *
FROM Student, Predmet;
SQL

45

Upiti nad vie tabela


Ako se u SELECT naredbi navedu dve tabele obavezno se
deava Dekartov proizvod
SELECT * FROM Student, Predmet;
Drugaija sintaksa:
SELECT * FROM Student CROSS JOIN Predmet;
Dekartov proizvod nad 3 relacije (r1, r2, r3):
SELECT * FROM r1 CROSS JOIN r2 CROSS JOIN r3;

SQL

46

spajanje
Neka je zadata relacija r(R) i s(S), pri emu je RS=
Neka postoji atribut A iz R i atribut B iz S nad kojima je
mogue izvriti
AB
je operator poreenja; <,,= ,>,

SQL

47

spajanje
Avion

Linija
Let

Udaljenost

Tip

Dolet

AA251

1000

B747

15000

UX112

4000

A320

7000

CC222

11000

DC9

3000

Mogucnost = Linija >< Avion


Dolet Udaljenost
Let

Udaljenost

Tip

Dolet

AA251

1000

B747

15000

AA251

1000

A320

7000

AA251

1000

DC9

3000

UX112

4000

B747

15000

UX112

4000

A320

7000

CC222

11000

B747

15000

SQL

48

spajanje
SELECT *
FROM Linija, Avion
WHERE Dolet Udaljenost;
Drugaija sintaksa:
SELECT *
FROM Linija JOIN Avion
ON Dolet Udaljenost;
spajanje nad 3 relacije (r1, r2, r3):
SELECT *
FROM r1
JOIN r2 ON JoinCondition
JOIN r3 ON Join Condition;
SQL

49

spajanje
Kako pronai linije i avione koji na tim linijama mogu leteti,
ali samo za one linije na kojima je udaljenost vea od
3000km
Dolet Udaljenost

SELECT *
FROM Linija, Avion
WHERE Dolet Udaljenost
AND Udaljenost 3000;
Drugaija sintaksa:
SELECT *
FROM Linija JOIN Avion ON Dolet Udaljenost
WHERE Udaljenost 3000;
SQL

50

Spoljanje spajanje
Zapis <105/2008, Nikola> nee se pojaviti u rezultatu zato
to ne postoji ni jedan zapis koji zadovoljava uslov prirodnog
spajanja sa tim zapisom
UpisaniPredmet

Student
BrInd

Ime

BrInd

Predmet

100/2009

Marko

100/2009

Baze podataka

101/2009

Petar

101/2009

Baze podataka

105/2008

Nikola

100/2009

Internet tehnologije

Upis = Student >< UpisaniPredmet


BrInd

Ime

Predmet

100/2009

Marko

Baze podataka

100/2009

Marko

Internet tehnologije

101/2009

Petar

Baze podataka
SQL

51

Levo spoljanje spajanje


Svi zapisi relacije Student e se pojaviti u rezultatu
UpisaniPredmet

Student
BrInd

Ime

BrIndSt

Predmet

100/2009

Marko

100/2009

Baze podataka

101/2009

Petar

101/2009

Baze podataka

105/2008

Nikola

100/2009

Internet tehnologije

Upis = Student *>< UpisaniPredmet


BrInd = BrIndSt
BrInd

Ime

BrIndSt

100/2009

Marko

100/2009 Baze podataka

100/2009

Marko

100/2009 Internet tehnologije

101/2009

Petar

101/2009 Baze podataka

105/2008

Nikola

NULL
SQL

Predmet

NULL
52

Levo spoljanje spajanje


SELECT Student.*, UpisaniPredmet.*,
FROM Student LEFT OUTER JOIN UpisaniPredmet
ON BrInd = BrIndSt;
UpisaniPredmet

Student
BrInd

Ime

BrIndSt

Predmet

100/2009

Marko

100/2009

Baze podataka

101/2009

Petar

101/2009

Baze podataka

105/2008

Nikola

100/2009

Internet tehnologije

Upis = Student >< UpisaniPredmet


MatBr = MatBrSt
BrInd

Ime

BrIndSt

100/2009

Marko

100/2009 Baze podataka

100/2009

Marko

100/2009 Internet tehnologije

101/2009

Petar

101/2009 Baze podataka

105/2008

Nikola

NULL
SQL

Predmet

NULL
53

Desno spoljanje spajanje


Svi zapisi relacije ProfesorPredmet e se pojaviti u rezultatu
StudentPredmet

ProfesorPredmet

BrInd

Ime

Predmet

IdProf

PredmetProf

100/2009

Marko

Baze podatka

MV

Baze podataka

101/2009

Petar

Programiranje

DZ

Programiranje

AJ

Baze podataka

AJ

Internet tehnologije

MogucMentor = StudentPredmet >< *ProfesorPredmet


Predmet = PredmetProf
BrInd

Ime

Predmet

IdProf

PredmetProf

100/2009

Marko

Baze podataka

MV

Baze podataka

100/2009

Marko

Baze podataka

AJ

Baze podataka

101/2009

Petar

Programiranje

DZ

Programiranje

NULL

NULL

NULL

AJ

InternetTehnologije

SQL

54

Desno spoljanje spajanje


SELECT StudentPredmet.*, ProfesorPredmet.*,
FROM StudentPredmet RIGHT OUTER JOIN PredmetProf
ON Predmet = PredmetProf;
StudentPredmet

ProfesorPredmet

BrInd

Ime

Predmet

IdProf

PredmetProf

100/2009

Marko

Baze podatka

MV

Baze podataka

101/2009

Petar

Programiranje

DZ

Programiranje

AJ

Baze podataka

AJ

Internet tehnologije

MogucMentor = StudentPredmet >< *ProfesorPredmet


Predmet = PredmetProf
BrInd

Ime

Predmet

IdProf

PredmetProf

100/2009

Marko

Baze podataka

MV

Baze podataka

100/2009

Marko

Baze podataka

AJ

Baze podataka

101/2009

Petar

Programiranje

DZ

Programiranje

NULL

NULL

NULL

AJ

InternetTehnologije

55

Puno spoljanje spajanje


Svi zapisi iz obe relacije e se pojaviti u rezultatu
StudentPredmet

ProfesorPredmet

BrInd

Ime

Predmet

IdProf

PredmetProf

100/2009

Marko

Baze podatka

MV

Baze podataka

101/2009

Petar

Programiranje

DZ

Programiranje

105/2008

Nikola

Zatita IS

AJ

Baze podataka

AJ

Internet tehnologije

MogucMentor = StudentPredmet * >< *ProfesorPredmet


Predmet = PredmetProf
Ili SELECT *

SELECT StudentPredmet.*, ProfesorPredmet.*,


FROM StudentPredmet FULL OUTER JOIN PredmetProf
ON Predmet = PredmetProf;
SQL

56

Puno spoljanje spajanje


Svi zapisi iz obe relacije e se pojaviti u rezultatu
StudentPredmet

ProfesorPredmet

BrInd

Ime

Predmet

IdProf

PredmetProf

100/2009

Marko

Baze podatka

MV

Baze podataka

101/2009

Petar

Programiranje

DZ

Programiranje

105/2008

Nikola

Zatita IS

AJ

Baze podataka

AJ

Internet tehnologije

MogucMentor = StudentPredmet * >< *ProfesorPredmet


Predmet = PredmetProf
BrInd

Ime

Predmet

IdProf

PredmetProf

100/2009

Marko

Baze podataka

MV

Baze podataka

100/2009

Marko

Baze podataka

AJ

Baze podataka

101/2009

Petar

Programiranje

DZ

Programiranje

NULL

NULL

NULL

AJ

InternetTehnologije

105/2008

Nikola

Zatita IS

NULL

NULL

SQL

57

Upiti nad vie tabela

Podrazumevaju spajanje tabela po nekom uslovu


Iza FROM klauzule SELECT naredbe navodi se vie tabela
odvojenih zarezima
Sintaksa:
SELECT * {[ALL DISTINCT] R-Lista}
FROM ImeTabele [NadimakTabele] {,}
[WHERE R-Predikat]
[ORDER BY ImeKolone [DESC]
{, ImeKolone [DESC]} ];

SQL

58

Upiti nad vie tabela

Za kolone koje se nalaze u vie tabele obavezno je


navoenje
ImeTabele.ImeKolone
NadimakTabele.ImeKolone
R-Predikat- navodi se uslov spajanja u formi uslova
jednakosti vrednosti odgovarajuih kolona u tabelama
Upit nad vie tabela bez uslova spajanja daje kao rezultat
Dekartov proizvod tih tabela

SQL

59

Upiti nad vie tabela

Primeri: Upit koji daje nazive naslova i nazive njihovih


oblasti (spajaju se tabele Naslov i Oblast po uslovu
jednakosti kolona SifO)
SELECT N.Naziv, O.Naziv
FROM Naslov N, Oblast O
WHERE N.SifO=O.SifO
ORDER BY N.Naziv ;

SQL

60

Upiti nad vie tabela

Upit koji daje ifre i nazive naslova knjiga koje lanovi dre
kod sebe (spajaju se tabele Drzi, Knjiga i Naslov po dva
uslova jednakosti kolona koja se kombinuju sa AND)
SELECT DISTINCT N.SifN, Naziv
FROM Drzi D, Knjiga K, Naslov N
WHERE D.SifK=K.SifK AND K.SifN=N.SifN;

SQL

61

Klauzule WHERE i HAVING

Predikati to su relacioni izrazi, koji se mogu kombinovati


Predikati: prosti i sloeni
Prost predikat: elementarni logiki izraz izraunljiv nad
svakim redom neke tabele
Sloen predikat: formira se od prostih, primenom logikih
operatora AND, OR i NOT
Forme prostih predikata:
Izraz1 {<|<=|=|<>|>=|>} Izraz2
ispituje da li su vrednosti navedenih izraza u zadatom
odnosu

SQL

62

Klauzule WHERE i HAVING

Izraz [NOT] BETWEEN Izraz1 AND Izraz2


ispituje da li je (ili nije) vrednost izraza u zadatim granicama.
Ekvivalentno bi bilo:
[NOT] Izraz>=Izraz1 AND Izraz<=Izraz2
Kolona IS [NOT] NULL
ispituje da li je (ili nije) vrednost kolone NULL
ZnakovniIzraz [NOT] LIKE ZnakovnaMaska
Znakovna vrednost tipa CHARACTER
Dva specijalna znaka (dokeri):
_ bilo koji znak (moe ih biti vie),
% bilo koji broj znakova
SQL

63

Klauzule WHERE i HAVING

Izraz [NOT] IN (Konstanta {, Konstanta})


ispituje da li je (ili nije) vrednost izraza jednaka nekoj od
navedenih konstanti (isti tip)
Izraz {<|<=|=|<>|>=|>} ANY (Konstanta {, Konstanta})
ispituje da li je (ili nije) vrednost izraza u navedenom odnosu
sa bar jednom konstantom
Izraz {<|<=|=|<>|>=|>} ALL (Konstanta {, Konstanta})
ispituje da li je (ili nije) vrednost izraza u navedenom odnosu
sa svim navedenim konstantama (zahteva se isti tip)

SQL

64

Klauzule WHERE i HAVING

Primeri upotrebe: Upiti za RBP BIBLIOTEKA sa dobijenim


rezultatima
Upit koji daje ifre lanova i ukupna trajanja pozajmica od 5
do 10 dana:
SELECT SifC,SUM(Dana)
FROM Pozajmica
GROUP BY SifC
HAVING SUM(Dana) BETWEEN 5 AND 10;
Upit koji daje nazive svih naslova u kojima se nalazi re
jezik
SELECT Naziv
FROM Naslov
WHERE Naziv LIKE %jezik% ;
SQL

65

Klauzule WHERE i HAVING

Upit koji daje ifre knjiga koje odgovaraju naslovima ifara


RBP0 i RK00
SELECT SifK
FROM Knjiga
WHERE SifN IN (RBP0,RK00);
Prethodni upit, uz upotrebu ANY forme
SELECT SifK
FROM Knjiga
WHERE SifN ANY (RBP0,RK00);
Upit koji daje ifre naslova za sve knjige osim za one sa
iframa 001, 002, 003
SELECT DISTINCT SifN
FROM Knjiga
WHERE SifK <> ALL (001,002, 003);
SQL

66

Upiti sa podupitima

Podupit (ugnjedeni upit) je SELECT-FROM-WHERE izraz


zadat unutar drugog izraza.
Definicija podupita:
SELECT naredba koja se nalazi u sklopu WHERE i
HAVING klauzula
Izvravanje podupita prethodi vrednovanju predikata u
datim klauzulama

SQL

67

Upiti sa podupitima

Klasifikacija podupita po nainu izvravanja:


Nekorelisani podupit njegovo izvravanje ne zavisi od
izvravanja spoljnog upita; Izvrava se samo jednom na
poetku.
Korelisani podupit njegovo izvravanje zavisi od
spoljnog upita; Izvrava se za svaki red tabele koju
obrauje spoljni upit
Posebna forma prostog predikata:
[NOT] EXISTS (R-Upit)
Utvruje se ishod podupita. Ako R-Upit kao rezultat daje bar
jedan red, EXISTS daje vrednost istina. U suprotnom je
nije istina.
SQL

68

Upiti sa podupitima

Primer 1:
Sastaviti upit koji daje podatke o pozajmicama
natprosenog trajanja.
1) Odreuje se prosek trajanja svih pozajmica
2) Trajanje svake pozajmice poredimo sa dobijenom
srednjom vrednosti
SELECT *
FROM Pozajmica
WHERE Dana > (SELECT AVG (Dana)
FROM Pozajmica);
Radi se o nekorelisanom podupitu
SQL

69

Upiti sa podupitima

Primer 2:
Sastaviti upit koji daje imena lanova ije je ukupno
trajanje pozajmica vee od 10 dana. Za svakog lana iz
tabele Clan treba prema njegovoj ifri utvrditi da li je
njegovo ukupno trajanje pozajmica iznad 10
SELECT Ime
FROM Clan C
WHERE 10 < (SELECT SUM (Dana)
FROM Pozajmica
WHERE SifC=C.SifC);
Podupit je korelisan i izvrava se za svakog lana
Spoljni SELECT odreuje kolonu koja se koristi u
podupitu
SQL

70

Upiti sa podupitima

Primer 3:
Sastaviti upit koji daje imena lanova koji dre knjige.
Ovo je primer za korienje IN forme predikata. ifre
lanova koji dre knjige daje nekorelisani podupit
SELECT Ime
FROM Clan
WHERE SifC IN (SELECT SifC
FROM Drzi);

SQL

71

Upiti sa podupitima

Primer 4:
Sastaviti upit koji daje podatke o pozajmicama koje su
trajale due od svih pozajmica lana ifre PP0.
Reenje primenom ALL konstrukcije
SELECT *
FROM Pozajmica
WHERE Dana > ALL (SELECT Dana
FROM Pozajmica
WHERE SifC=PP0);

SQL

72

Unija, razlika i presek upita

Primena skupovnih operatora na skupove redova koje daju


pojedini upiti
Upiti koji se kombinuju moraju zadovoljavati uslov unijske
kompatibilnosti
Definicija klauzula:
UNION [ALL] unija dva upita sa eliminacijom identinih,
ako se ne naglasi ALL
INTERSECT presek dva upita, ostaju samo oni redovi
koji se nalaze u rezultatima oba upita
EXCEPT razlika dva upita, od redova upita ispred
except klauzule ostaju samo oni koji se ne nalaze u
rezultatu upita iza te klauzule (MINUS)
SQL

73

Unija, razlika i presek upita

Primer 1:
Sastaviti upit koji daje ifre knjiga koje su bile u prometu
lanovi ih dre kod sebe ili su ranije pozajmljivane.
SELECT SifK
FROM Drzi
UNION
SELECT DISTINCT SifK
FROM Pozajmica;

SQL

74

Unija, razlika i presek upita

Primer 2:
Sastaviti upit koji daje naslove knjiga koje su kod lanova, a
ranije nisu pozajmljivane
SELECT DISTINCT Naziv
FROM Naslov N, Knjiga K
WHERE N.SifN=K.SifN
AND SifK IN (SELECT SifK
FROM Drzi
EXCEPT
SELECT DISTINCT SifK
FROM Pozajmica);
SQL

75

You might also like