You are on page 1of 143

Baze podataka

SQL
Jezik relacione BP
Kreiranja

SQL 1
SQL - Structured Query Language

• Strukturni upitni jezik za RBP - modifikovana rel. algebra


• Razvio ga je IBM u okviru projekta System R
• Danas je SQL ugrađen u sve vodeće SUBP
• ANSI standard American National Standards Institute
• Standardizacija:
– Zaštita programa od zastarevanja
– Vertikalna kompatibilnost
– Prenosivost programa na druge računare
• Standardizacija za relacione BP
– Prvi standard 1986, dopunjen 1989
– Značajnije dopune 1992. (ANSI SQL), 1995., 1999., 2003.
– Razvoj SQL-a traje i danas

SQL 2
SQL

• Neproceduralan, deklarativan jezik:


– Govori o tome ŠTA, a ne KAKO će biti urađeno
• Šta SQL može da uradi?
– SQL can execute queries against a database
– SQL can retrieve data from a database
– SQL can insert records in a database
– SQL can update records in a database
– SQL can delete records from a database
– SQL can create new databases
– SQL can create new tables in a database
– SQL can create stored procedures in a database
– SQL can create views in a database
– SQL can set permissions on tables, procedures, and views

SQL 3
SQL

• Svaki programski jezik obuhvata podatke i manipulacije nad


tim podacima
• SQL-jezik:
– Objekti manipulacije su relacije
– Rezultati manipulacija su relacije
• Terminologija:
– relacija  tabela
– n-torka  red (vrsta)
– Vrednosti u n-torkama za jedan atribut  kolona
• SQL se zasniva na relacionom računu n-torki

SQL 4
SQL

• SQL sadrži naredbe za:


– definisanje relacija (shema)
– ažuriranje podataka (unos, izmena, brisanje)
– postavljanje upita
– sortiranje i formatiranje ispisa
– aritmetičke operacije nad podacima
– definisanje pogleda (view)
– kontrolu sigurnosti
– itd....
• SQL podržava 3 osnovne funkcije BP:
definicije, manipulacije i kontrolu

SQL 5
SQL
- definicije -

• Definicija BP: struktura, koje tabele, koji atributi, koji tipovi,


koja ograničenja, pomoćni indeksi za direktan pristup
(DDL – Data Definition Language)
• CREATE TABLE – kreiranje tabele u BP
DROP TABLE – uklanjanje tabele iz BP
ALTER TABLE – izmena definicije tabele
CREATE INDEX – kreiranje indeksa
DROP INDEX – uklanjanje indeksa
CREATE VIEW – kreiranje pogleda
DROP VIEW – uklanjanje pogleda

SQL 6
SQL
- manipulacije -

• Manipulacija BP:
– upit nad bazom podataka (izveštavanje),
– ažuriranje (unos, izmena, brisanje)
• (DML – Data manipulation Language)
• SELECT – prikaz željenog sadržaja RBP
UPDATE – izmena vrednosti kolona tabele
DELETE – izbacivanje redova tabele
INSERT – dodavanje redova u tabelu

SQL 7
SQL
- kontrola -

• Kontrola pristupa podacima:


– koji korisnici imaju pristup,
– kojim podacima,
– šta mogu da rade sa tim podacima
• (DCL – Data Control Language)
• GRANT (dodeljivanje ovlašćenja nad objektima baze
drugim korisnicima od strane vlasnika)
• REVOKE (ukidanje ovalašćenja dodeljenih pomoću
GRANT)

SQL 8
SQL

• SQL – neodgovarajući naziv - nije samo upitni jezik


• SQL podržava oba režima rada sa BP:
– Interaktivni: korisnik zadaje jednu po jednu SQL
naredbu, preko tastature, ishod se prikazuje na monitoru,
pristup BP je ograničen jedino pravima korisnika
– Programski: korisnik pokreće program u kome su
ugrađene SQL naredbe, pristup BP je ograničen pravima
korisnika i sadržajem programa
• SQL blokovi ugrađeni u klasični viši programski jezik

SQL 9
SQL

• Logičke operacije: AND, OR i NOT


• Operacije poređenja:
– =, <, >, , , 
– IN, ANY, ALL, BETWEEN, IS NULL, LIKE, …
• Skupovne operacije:
– UNION, INTERSECT, EXCEPT
• Funkcije nad skupovima podataka:
– COUNT, SUM, MIN, MAX, AVG
• Izrazi se mogu grupisati pomoću zagrada

SQL 10
SQL
tipovi podataka

• INTEGER: (INT), ceo broj sa ili bez predznaka čiji broj cifara
zavisi od konkretne implement.
• SMALLINT: ceo broj sa brojem cifara manjim u odnosu na
INTEGER
• REAL: realni broj sa ili bez predznaka, preciznost zavisi od
konkreten implement.
• DOUBLE PRECISION: (DOUBLE), proširena preciznost u
odnosu na REAL
• DECIMAL(m,n): (DEC(m,n)), decimalni broj sa ili bez
predznaka, m-cifara, a n-decimalnih

SQL 11
SQL
tipovi podataka

• CHARACTER(n): (CHAR(n)), niz znakova fiksne dužine n


– Konstanta tipa CHAR se piše između jednostrukih
navodnika
• VARCHAR(n) - niz znakova dužine najviše n
• TEXT – tekst proizvoljne dužine
• Praktično sve implementacije SQL-a podržavaju dodatne
tipove podataka kao što su:
– BOOLEAN – TRUE/FALSE (tačno/netačno)
– DATE – datum (‘2004-12-01’)
– TIME – vreme (’16:50:07’)

SQL 12
SQL
- sintaksa -

• SQL ne pravi razliku između velikih i malih slova (case


insensitive). Sledeće dve naredbe su jednake:
– select prezime from osoba where
ime = ‘Marko’;
– SELECT prezime FROM osoba WHERE ime = ‘Marko’;
• Komentari:
– -- ovo je komentar
– /* ovo je komentar
koji se proteže
u više redova */
• Za nazive (imena) se ne smeju koristiti rezervisane reči

SQL 13
SQL
- sintaksa -

• Separator naredbi:
naredba1;
naredba2;
• FORMAT naredbi: Sledeće naredbe su ispravno napisane
– SELECT *
FROM student
WHERE BrInd ≤ 100;
– SELECT * FROM student WHERE BrInd ≤ 100;
– SELECT *
FROM student
WHERE
BrInd ≤ 100;
SQL 14
Kreiranje baze

• Jedan DBMS može da upravlja sa više baza podataka


DBMS
CREATE DATABASE moja_baza; moja_baza

CREATE DATABASE prodaja; prodaja

CREATE DATABASE biblioteka; biblioteka

-----------

USE DATABASE prodaja; Korišćenje baze podataka

DROP DATABASE prodaja; Uklanjanje baze podataka


SQL 15
Kreiranje tabela

• Prilikom kreiranja tabele (definicija njene strukture i osobina)


neophodno je navesti:
– Ime tabele, mora biti unikatno u BP
– Ime svake kolone, mora biti unikatno unutar tabele
– Tip svake kolone
– Jedno ili više ograničenja za kolone, koje ih imaju
– Jedno ili više ograničenja za svaku tabelu, ako postoje

SQL 16
Kreiranje tabela

• Sintaksa naredbe kreiranja tabele:


CREATE TABLE ImeTabele (
ImeKolone TipKolone OgraničenjeKolone ...
{, ImeKolone TipKolone OgraničenjeKolone ...}
[OgraničenjeTabele {, OgraničenjeTabele}]);
• ImeTabele i ImeKolone – pravila koja važe za većinu
varijabli: prvi znak je slovo, ostali znaci su slova, cifre,
posebni znaci itd.)
• TipKolone – SQL tip podataka
• Uz svaku kolonu mogu se navesti jedno ili više
ograničenja za tu kolonu

SQL 17
Kreiranje tabela

• Osnovne klauzule OgraničenjeKolone


(ograničenje integriteta):
– NOT NULL – u koloni nije dozvoljena NULL
– UNIQUE – u koloni nije dozvoljeno ponavljanje iste
vrednosti
– PRIMARY KEY – kolona je primarni ključ, nije
dozvoljena NULL vrednost niti ponavljanje vrednosti
– CHECK (Predikat) – svaka vrednost u koloni mora da
zadovolji uslov zadat logičkim izrazom Predikat. U izrazu
se ne mogu navoditi druge kolone

SQL 18
Kreiranje tabela

– DEFAULT=Konstanta – ako se prilikom unošenja jednog


reda podataka u tabelu za kolonu ne zada vrednost,
podrazumeva se Konstanta
– REFERENCES ImeTabele - specifikacija referencijalnog
integriteta za jednu kolonu
• kolona je strani ključ u odnosu na tabelu ImeTabele,
• mora imati ili vrednost primarnog ključa u toj tabeli ili
NULL (ako nema NOT NULL ograničenja)

SQL 19
Kreiranje tabela

• Za celu tabelu se mogu zadati:


– ni jedno,
– jedno ili
– više ograničenja.
• Ograničenja mogu da važe za jednu ili više kolona
• UNIQUE(ListaKolona) – nije dozvoljeno ponavljanje istih
vrednosti kombinacija
• PRIMARY KEY(ListaKolona) – navedene kolone su primarni
ključ,...
• Konstrukcija ListaKolona označava:
ImeKolone {, ImeKolone}
SQL 20
Kreiranje tabela

• Klauzule za dinamičku specifikaciju referencijalnog


integriteta,
– Šta se dešava u slučaju pokušaja brisanja reda u ciljnoj
tabeli ImeTabele,
– Šta se dešava u slučaju pokušaja izmene vrednosti
primarnog ključa u ciljnoj tabeli ImeTabele
• DELETE OF ImeTabele
{RESTRICTED CASCADES NULLS}
• UPDATE OF ImeTabele
{RESTRICTED CASCADES NULLS}

SQL 21
Kreiranje tabela

• Sva ograničenja navedena u CREATE TABLE su aktivna u


svakom trenutku postojanja tabele
• SUBP će odbiti svaki pokušaj sa tabelom, koji je u
suprotnosti sa ograničenjima
• Olakšica za projektante i programere BP
• Provere se ne moraju ugrađivati u aplikativne programe
• Deklarativna moć naredbe CREATE TABLE je od velikog
značaja, naročito kod dinamičke specifikacije referencijalnog
integriteta

SQL 22
Primer

Datum

Prezime Sala
Vreme
Ime Ocena Ime Prezime
BrInd
Student Ispit Profesor
Adresa
Email IdProf
NaucnoZvanje
Telefon
Predmet

IdPredmeta Naziv

SQL 23
Primer

• Primer:
• Student(BrInd, Ime, Prezime, Adresa, Telefon, Email)
• Profesor(IdProf, Ime Prezime, NaucnoZvanje)
• Predmet(IdPredmet, Naziv)
• Ispit(Brind, IdPredmet, IdProf, Ocena, Sala, Datum, Vreme)

SQL 24
Primer

• Kreiranje tabele Studenti


• CREATE TABLE Studenti (
BrInd INT PRIMARY KEY CHECK(0<BrInd≤300),
Ime VARCHAR(20) NOT NULL,
Prezime VARCHAR(20) NOT NULL,
Adresa VARCHAR(50) NOT NULL,
Telefon VARCHAR(15),
Email VARCHAR(30));

SQL 25
Primer

• Kreiranje tabele Predmet


• CREATE TABLE Predmet (
IdPredmet VARCHAR(20) PRIMARY KEY,
Naziv VARCHAR(20) NOT NULL UNIQUE);

SQL 26
Primer

• CREATE TABLE Ispit (


BrInd INT REFERENCES Student,
IdPredmet INT REFERENCES Predmet,
IdProf INT REFERENCES Profesor,
Ocena INT NOT NULL CHECK (5≤Ocena≤10),
Sala CHAR(5),
Datum DATE,
Vreme TIME,
UNIQUE (Sala, Datum, Vreme),
PRIMARY KEY (BrInd,IdPredmeta,IdProf),
UPDATE OF Student CASCADES,
DELETE OF Student RESTRICTED,
UPDATE OF Predmet CASCADES,
DELETE OF Predmet RESTRICTED,
UPDATE OF Profesor CASCADES,
DELETE OF Profesor RESTRICTED);

SQL 27
Uklanjanje tabela

• Izbor dinamičke specifikacije referencijalnih integriteta, kod


uklanjanja predstavlja delikatnu operaciju
• Ako se nepromišljeno koristi RESTRICTED, nameće se krut
režim, npr. ne mogu se ukloniti pogrešno uneti podaci iz
tabele
• Naredba uklanjanja tabele iz BP
DROP TABLE ImeTabele ;
• Brišu se u BP sve informacije o tabeli ImeTabele
• Zavisno od SUBP-a:
– tabela koja se uklanja mora biti prazna (u suprotnom SUBP neće
izvršiti tu naredbu) ili
– ne mora biti prazna (SUBP će obavezno izvršiti naredbu)

SQL 28
Kreiranje indeksa

• Indeks – pomoćna datoteka za ubrzanje pristupa podacima


u osnovnoj datoteci
– Povećanje brzine obrade podataka u osnovnim tabelama
– Analogija sa knjigom i indeksima
• U osnovnoj datoteci zapisi se nalaze u nekom fizičkom
redosledu (redosled unošenja)
• Indeks – može se preuređivati u rastućoj ili opadajućoj
vrednosti indeksnog niza
• Sintaksa naredbe kreiranja indeksa:
CREATE [UNIQUE] INDEX ImeIndeksa
ON ImeTabele (ListaKolona)

SQL 29
Kreiranje indeksa

• UNIQUE – opcija da indeks mora biti unikatan. U tabeli na


koju se indeks odnosi ne sme se više puta ponoviti
vrednost ListaKolona
– ImeIndeksa – unikatni naziv indeksa u BP
– Ime Tabele – tabela na koju se indeks odnosi
– ListaKolona – navođenje jedne ili više kolona, po kojima
se formira INDEKS
• Nad istom tabelom se može definisati više indeksa (za
različite pristupe podacima)
• Indeks se može kreirati odmah (dok je tabela prazna) ili
naknadno

SQL 30
Kreiranje i uklanjanje indeksa

• Klauzula UNIQUE u definiciji indeksa ima efekat na klauzulu


UNIQUE kod tabele:
– SUBP odbija svaku izmenu podataka u tabeli koja
narušava unikatnost indeksa
– SUBP odbija kreiranje unikatnog indeksa za tabelu čiji
zatečeni sadržaj narušava tu unikatnost
• Indeks se može bilo kada i bez obzira na sadržaj svoje
tabele ukloniti naredbom:
DROP INDEX ImeIndeksa

SQL 31
Indeksi

• Primer: Ako se želi brz pristup podacima u tabeli Ispit po dva


osnova, po BrInd i IdPredmeta, kreiraju se dva indeksa:
CREATE INDEX Ispit_i1 ON Ispit(BrInd);
CREATE INDEX Ispit_i2 ON Ispit(IdPredmeta);

Ispit_i1 (BrInd) Ispit (BrInd, IdPredmeta, ...) Ispit_i2 (IdPredmeta)


AAA01 AAA01 PJ BP
AAA10 BBD56 PJ BP
ABC23 ABC23 RM IT
ABC23 HHH11 IT IT
BBB04 ABC23 IT IT
BBD56 AAA10 BP PJ
HHH11 BBB04 IT PJ
HHH11 HHH11 BP RM
SQL 32
Indeksi

• Napomene:
• Svaka indeksna datoteka ima dva dela:
– ListaKolona, po kojima se vrši pretraživanje i po kojima
se vrši uređivanje indeksa
– Indeks - služi za vezu sa osnovnom datot.
• Indeks za vezu sa osnovnom datotekom je redni broj
unosa

SQL 33
Indeksi

Ispit Ispit_i1
ind BrInd IdPredme IdProf Ocena ... ind BrInd
ta
1 AAA01 PJ DZ 1 AAA01

2 BBD56 PJ DZ 6 AAA10

3 ABC23 RM MV 3 ABC23

4 HHH11 IT RP 5 ABC23

5 ABC23 IT RP 7 BBB04

6 AAA10 BP MV 2 BBD56

7 BBB04 IT RP 4 HHH11

8 HHH11 BP MV 8 HHH11

SQL 34
Indeksi

• Nisu svi atributi dobri kandidati za indeks. Npr. bit-map, text


ili slika
• Po pravilu su strani ključevi kandidati za indeks
• Indeksiranje ima i svojih nedostataka: Prilikom ažuriranja
osnovne tabele (brisanje, unošenje), mora se vršiti
reindeksiranje, pa se gubi na vremenu.
• Tabele sa malim brojem podataka u zapisu se ne
indeksiraju, jer se pretraga može efikasno izvršiti brzim
računarima.

SQL 35
Izmena postojeće tabele

• Naredba ALTER
• Sintaksa:
ALTER TABLE ImeTabele
ADD (ImeKolone Tip, [ImeKolone Tip]...);
• Primer: U tabelu Odeljenje dodati kolone Sef_Od i Br_Zap
ALTER TABLE Odeljenje
ADD (Šef_Od INTEGER, Br_Zap NUMBER(2));
• Primer: U istoj tabeli povećati dužinu za Br_Zap
ALTER TABLE Odeljenje
MODIFY (Br_Zap NUMBER(6));

SQL 36
Kreiranje i uklanjanje
pogleda

• Osnovne tabele – fizički postoje na disku


• Pogled – virtuelna (izvedena) tabela
• Nastaje kao rezultat upita
• Sintaksa naredbe kreiranja pogleda:
CREATE VIEW ImePogleda
[ListaKolona] AS Upit;
• ImePogleda - unikatno ime u BP
• Upit – naredba upita SELECT
• Pogled nasleđuje tipove kolona iz osnovnih tabela
• Uklanjanje – DROP VIEW ImePogleda;

SQL 37
Prednosti pogleda

– Jednostavnost korišćenja, uprošćavaju se upiti


– Tajnost, mehanizam za kontrolu pristupa podacima
(korisnik vidi samo neke podatke)
– Performanse, definicija pogleda se čuva u
kompajliranom, prevedenom obliku
– Nezavisnost podataka, menjaju se definicije pogleda, a
ne aplikacije koji koriste podatke iz BP preko pogleda
– Vrsta potprograma u SQL-u
– Jednom kreiran može da se koristi u podupitima, u
WHERE i HAVING klauzulama
– Zamenjuje komplikovane upite

SQL 38
Baze podataka
SQL
Jezik relacione BP
Upiti

SQL 39
UPIT
- SELECT -

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


– Programer izbegava korišćenje 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 izvršavaju

SQL 40
UPIT
- SELECT -

• Najznačajnija i najčešće korišćena SQL naredba za


manipulaciju podacima
• Kod svakog upita zadajemo (u principu):
– Koje podatke tražimo kao rezultat,
– Iz kojih tabela to tražimo,
– Koji uslov treba da zadovolje podaci, da bi bili uključeni u
rezultat
– U kom redosledu želimo prikaz podataka

SQL 41
UPIT
- SELECT -

• Principska šema za postavljanje upita je:


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

SQL 42
UPIT
- SELECT -

• Tipičan 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 sledećem upitu relacione
algebre
A1, A2, ..., An(P(r1r2  ...  rn))
• Rezultat SQL upita je opet relacija

SQL 43
Prost upit nad jednom tabelom

• Podrazumeva se naredba upita SELECT, nad jednom


tabelom
• Kao rezultat daje niz redova (ili jedan ili nijedan) koji
zadovoljavaju eventualno zadati uslov
• SELECT lista – podrazumeva se specifikacija podataka u
rezultatu upita
• Specifikacija – zadata jednim ili sa više izraza odvojenih
zarezima (R-lista)
• Rezultat upita ne mora biti relacija (unikatnost)

SQL 44
Prost upit nad jednom tabelom

• Sintaksa
• SELECT * {[ALL  DISTINCT] R-Lista}
FROM ImeTabele
[WHERE R-Predikat]
[ORDER BY ImeKolone [DESC]
{, ImeKolone [DESC]} …];
• * - Specijalni slučaj R-liste, kada u rezultat želimo da
uključimo sve kolone tabele
• ALL – iz rezultata neuklanja istovetne redove,
DISTINCT – suprotno. Podrazumeva se ALL.
• R-Lista se zadaje kao jedan ili više R-Izraza, pored naziva
kolone javljaju se i konstante
SQL 45
Prost upit nad jednom tabelom

• Klauzula FROM (“odakle”), specificira se ImeTabele. To je


ime osnovne tabele ili pogleda nad kojim se vrši upit. Ovo je
obavezna klauzula.
• R_Predikat , uslov prikazivanja rezultata,
– to je logički izraz izračunljiv nad svakim pojedinim redom
tabele.
– Rezultat upita se dobija samo za one vrednosti
R_Predikata koje daju istinitosnu vrednost.
– Najčešće je to relacioni izraz (>,<,=,…) sa kolonama, a
sa desne strane može se javiti i konstanta
• ORDER BY – daje željeni redosled prikaza rezultata.
Podrazumeva se rastući redosled (ASC). U suprotnom se
navodi DESC uz odgovarajuću kolonu. Uvek je poslednja
klauzula u SELECT bloku.
SQL 46
Prost upit nad jednom tabelom

• Najjednostavniji mogući 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 obično traži prikaz samo određenih kolona, ili
prikaz svih kolona u redosledu koji je drugačije određen.
• Ovo odgovara operaciji projekcije, ali se ne eliminišu
višestruka ponavljanja istih vrednosti

SQL 47
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
1 Marko Marković 1 Marko Marković
2 Petar Petrović SELECT 2 Petar Petrović
3 Aleksa Perić 3 Aleksa Perić

SQL 48
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
1 Marko Marković 1 Marko Marković
2 Petar Petrović SELECT 2 Petar Petrović
3 Aleksa Perić 3 Aleksa Perić

SQL 49
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
1 Marko Marković 3 Aleksa Perić
2 Petar Petrović SELECT
1 Marko Marković
3 Aleksa Perić 2 Petar Petrović
Predavanja 50
SQL 50
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
1 Marko Marković PFB PFB
2 Petar Petrović FIM FIM
3 Aleksa Perić FIM SELECT FIM
4 Marko Marić FTHM FTHM
5 Petar Lazić PFB PFB
6 Jovan Marić PFB PFB
SQL 51
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
1 Marko Marković PFB
Fakultet
2 Petar Petrović FIM
PFB
3 Aleksa Perić FIM SELECT
FIM
4 Marko Marić FTHM
FTHM
5 Petar Lazić PFB
6 Jovan Marić PFB
28.11.2006. Predavanja
SQL 52
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
1 Marko Marković PFB
Fakultet
2 Petar Petrović FIM
FIM
3 Aleksa Perić FIM SELECT
FTHM
4 Marko Marić FTHM
PFB
5 Petar Lazić PFB
6 Jovan Marić PFB
Predavanja
SQL 53
Prost upit nad jednom tabelom

• Upit za prikaz više kolona sa zadavanjem uslova:


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

Student
BrInd Ime Prezime Fakultet
1 Marko Marković PFB
2 Petar Petrović FIM BrInd Ime Prezime
3 Aleksa Perić FIM 2 Petar Petrović
SELECT
4 Marko Marić FTHM 3 Aleksa Perić
5 Petar Lazić PFB
6 Jovan Marić PFB

SQL 54
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
1 Marko Marković PFB
2 Petar Petrović FIM BrInd Ime Prezime
3 Aleksa Perić FIM 3 Aleksa Perić
SELECT
4 Marko Marić FTHM 2 Petar Petrović
5 Petar Lazić PFB
6 Jovan Marić PFB

SQL 55
Prost upit nad jednom tabelom

• U WHERE klauzuli se mogu koristiti logičke i aritmetičke


operacije:
SELECT BrInd, Ime, Prezime
FROM Student
WHERE Fakultet=‘FIM’ OR Fakultet=‘FTHM’
ORDER BY Ime;
Student
BrInd Ime Prezime Fakultet
1 Marko Marković PFB
2 Petar Petrović FIM BrInd Ime Prezime
3 Aleksa Perić FIM 3 Aleksa Perić
SELECT
4 Marko Marić FTHM 4 Marko Marić
5 Petar Lazić PFB 2 Petar Petrović
6 Jovan Marić PFB

SQL 56
Prost upit nad jednom tabelom

• Komanda SELECT može da sadrži aritmetičke izraze koji


uključuju operacije, +, –, , /, na konstantama ili atributima:

SELECT SifP, NazivP, Cena 100


FROM Racun;

Racun
SifP NazivP Kolicina Cena SifP NazivP Cena
005 P1 1 1800,00 005 P1 180000,00
010 P2 6 300,00 010 P2 30000,00
020 P3 5 250,00 020 P3 25000,00
SELECT
001 P3 2 1100,00 001 P3 110000,00
003 P3 4 600,00 003 P3 60000,00
011 P1 3 700,00 011 P1 70000,00

SQL 57
Prost upit nad jednom tabelom

• Pojedine vrednosti atributa mogu imati NULL vrednost


• Predikat IS NULL se koristi za proveru null vrednosti
• Npr: Naći sve šifre prouzvoda kod kojih je cena NULL
SELECT SifP
FROM Racun
WHERE Cena IS NULL ;
Racun
SifP NazivP Kolicina Cena
005 P1 1 1800,00
010 P2 6 NULL SifP
020 P3 5 250,00 010
SELECT
001 P3 2 1100,00 003
003 P3 4 NULL 011
011 P1 3 NULL

SQL 58
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 više izraza
• Zadavanje redosleda redova u rezultatu nema smisla
(dobija se samo jedan red)

SQL 59
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: najčešće ih čine posebne SQL funkcije
(svodne ili agregatne funkcije)
• Svodne funkcije:
– SUM (ImeKolone) Nalazi sumu svih ne-NULL
vrednosti zadate kolone
– AVG (ImeKolone) Nalazi prosečnu vrednost svih ne-
NULL vrednosti zadate kolone
SQL 60
Prost upit nad jednom tabelom
sa izvedenim rezultatom

– MIN (ImeKolone) Nalazi minimalnu vrednost svih ne-


NULL vrednosti zadate kolone
– MAX (ImeKolone) Nalazi maksimalnu vrednost svih
ne-NULL vrednosti zadate kolone
– COUNT(*) Nalazi ukupan broj redova u tabeli
– COUNT([ALLDISTINCT] ListaKolona)
Bez DISTINCT nalazi ukupan broj ne-NULL vrednosti
zadate kombinacije kolona
Sa DISTINCT nalazi ukupan broj različitih ne-NULL
vrednosti zadate kombinacije kolona

SQL 61
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
1 Marko Marković PFB
2 Petar Petrović FIM
3 Aleksa Perić FIM
SELECT 6
4 Marko Marić FTHM
5 Petar Lazić PFB
6 Jovan Marić PFB

SQL 62
Prost upit nad jednom tabelom sa
izvedenim rezultatom

• Upit za prikaz broja fakulteta na koje su upisani studenati


(odgovara broju različitih vrednosti kolone Fakultet u
tabeli Student)
SELECT COUNT(DISTINCT Fakultet)
FROM Student ;
Student
BrInd Ime Prezime Fakultet
1 Marko Marković PFB
2 Petar Petrović FIM
3 Aleksa Perić FIM
SELECT 3
4 Marko Marić FTHM
5 Petar Lazić PFB
6 Jovan Marić PFB

SQL 63
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
1 Marko Marković PFB
2 Petar Petrović FIM
3 Aleksa Perić FIM
SELECT 1
4 Marko Marić FTHM
5 Petar Lazić PFB
6 Jovan Marić PFB

SQL 64
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 1 1800,00
010 P2 6 300,00
020 P3 5 250,00
SELECT 1800+300+250+1100 ....
001 P3 2 1100,00
003 P3 4 600,00
011 P1 3 700,00

SQL 65
Prost upit nad jednom tabelom
sa izvedenim rezultatom

• Upit za prikaz minimalne i maksimalne cene iz računa:


SELECT MIN(Cena), MAX(Cena)
FROM Racun;

Racun
SifP NazivP Kolicina Cena
005 P1 1 1800,00
010 P2 6 300,00
020 P3 5 250,00
SELECT 250 1800
001 P3 2 1100,00
003 P3 4 600,00
011 P1 3 700,00

SQL 66
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’;
– Primedba: rezultat AVG funkcije preuzima tip podataka od
Racun argumenta (tip kolone)
SifP NazivP Kolicina Cena
005 P1 1 1800,00
010 P2 6 300,00
020 P3 5 250,00
SELECT 2500 1250
001 P3 2 1100,00
003 P3 4 600,00
011 P1 3 700,00

SQL 67
Prost upit nad jednom tabelom
sa izvedenim rezultatom

• Rezultat bilo kog aritemitičkog izraza sa NULL je NULL


• Na primer: 10+NULL daje NULL
• Agregatne funkcije ignorišu NULL vrednosti
(izuzev COUNT(*)
• Poređenje sa NULL daje unknown
– Npr: 10<NULL, NULL<>NULL, NULL=NULL

SQL 68
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 69
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 više redova

Pozajmica (SifP,SifC,SifK,Dana)

SQL 70
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 sledeći:
– Od tabele Pozajmica formira se međurezultat sa
kolonama (SifC i Dana) grupisane po SifC
– Formira se nova tabela sa jednom vrednošću za SifC i
izračunate SUM (Dana) po SifC
– Prikazati redove koji zadovoljavaju traženi uslov

SQL 71
Svodni upit nad jednom tabelom

SifP SifC SifK Dana SifC Dana SifC Dana Rezultat


1 JJ0 004 5 JJ0 5 JJ0 12 JJ0 12
2 PP0 007 2 JJ0 7 PP0 6
3 JJ1 005 6 PP0 2 JJ1 9
4 JJ0 008 7 PP0 4
5 PP0 002 4 JJ1 6
6 JJ1 009 3 JJ1 3
Uslov:
SUM(Dana)>10
• Potrebno je dodatno precizirati:
– Po kojim kolonama se vrši grupisanje, i koje svodne
funkcije se traže unutar grupe
– Koji uslov se zadaje za uključenje svodnih redova u
rezultat
SQL 72
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 73
Svodni upit nad jednom tabelom

– WHERE, zadaje se uslov koji svaki red u tabeli


ImeTabele mora da zadovolji
– GROUP BY, navodi se jedna ili više kolona po kojima se
vrši grupisanje
Kolone koje se navode ne moraju biti uz SELECT
Kolene koje su uz SELECT moraju se naći uz GRUP BY
– HAVING, formira se uslov koji svaki red formiran
svođenjem mora da zadovolji da bi bio uključen 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 74
Svodni upit nad jednom tabelom

SifP SifC SifK Dana SifC Dana SifC Dana Rezultat


1 JJ0 004 5 JJ0 5 JJ0 12 JJ0 12
2 PP0 007 2 JJ0 7 PP0 6
3 JJ1 005 6 PP0 2 JJ1 9
4 JJ0 008 7 PP0 4
5 PP0 002 4 JJ1 6
6 JJ1 009 3 JJ1 3
HEAVING
SUM(Dana)>10

GROUP BY
SifC, Dana
SQL 75
Svodni upit nad jednom tabelom

• Primeri:
• Upit za prikaz šifara autora i broja naslova koje su napisali

SELECT SifA, COUNT(*) AP0 1


FROM Je_Autor JN0 1
GROUP BY SifA ; DM0 2
ZP0 2
AP1 1
IT0 1

SQL 76
Svodni upit nad jednom tabelom

• Upit za prikaz šifara članova čija je suma trajanja pozajmice


veća od 10
SELECT SifC JJ0
FROM Pozajmica
GROUP BY SifC
HAVING SUM(Dana)>10;
• Upit za prikaz šifara članova i njihovog ukupnog broja i
trajanja pozajmica, ali samo za pozajmice duže od 2 dana
SELECT SifC,COUNT(*), SUM(Dana)
FROM Pozajmica JJ0 2 12
WHERE Dana>2 PP0 1 4
GROUP BY SifC; JJ1 2 9
SQL 77
Svodni upit nad jednom tabelom
• Primer
BrInd IdPred IdProf Ocena Sala Datum Vreme
100/2007 BP03 MV01 8
200/2007 BP03 MV01 7
100/2007 OOP02 RP00 6
150/2008 BP03 MV01 7
250/2008 OOP02 RP00 8
300/2006 RM03 MV01 7
100/2007 RM03 MV01 9
300/2006 RM03 MV01 8

SQL 78
Svodni upit nad jednom tabelom
• SELECT BrInd,AVG(Ocena)
FROM Ispit
GROUP BY BrInd;
Ispit
BrInd IdPred IdProf Ocena Sala Datum Vreme
100/2007 BP03 MV01 8
200/2007 BP03 MV01 7
100/2007 OOP02 RP00 6
150/2008 BP03 MV01 7
250/2008 OOP02 RP00 8
300/2006 RM03 MV01 7
100/2007 RM03 MV01 9
300/2006 RM03 MV01 8

SQL 79
Svodni upit nad jednom tabelom
• SELECT IdPred,AVG(Ocena)
FROM Ispit
GROUP BY IdPred;
Ispit
BrInd IdPred IdProf Ocena Sala Datum Vreme
100/2007 BP03 MV01 8
200/2007 BP03 MV01 7
100/2007 OOP02 RP00 6
150/2008 BP03 MV01 7
250/2008 OOP02 RP00 8
300/2006 RM03 MV01 7
100/2007 RM03 MV01 9
300/2006 RM03 MV01 8

SQL 80
Svodni upit nad jednom tabelom
• SELECT IdProf,AVG(Ocena)
FROM Ispit
GROUP BY IdProf;
Ispit
BrInd IdPred IdProf Ocena Sala Datum Vreme
100/2007 BP03 MV01 8
200/2007 BP03 MV01 7
100/2007 OOP02 RP00 6
150/2008 BP03 MV01 7
250/2008 OOP02 RP00 8
300/2006 RM03 MV01 7
100/2007 RM03 MV01 9
300/2006 RM03 MV01 8

SQL 81
Svodni upit nad jednom tabelom
• SELECT IdProf,IdPred,AVG(Ocena)
FROM Ispit
GROUP BY IdProf, IdPred;
Ispit
BrInd IdPred IdProf Ocena Sala Datum Vreme
100/2007 BP03 MV01 8
200/2007 BP03 MV01 7
100/2007 OOP02 RP00 6
150/2008 BP03 MV01 7
250/2008 OOP02 RP00 8
300/2006 RM03 MV01 7
100/2007 RM03 MV01 9
300/2006 RM03 MV01 8

SQL 82
Svodni upit nad jednom tabelom
• SELECT IdProf,IdPred,BrInd,AVG(Ocena)
FROM Ispit
GROUP BY IdProf, IdPred; neispravno

Ispit
BrInd IdPred IdProf Ocena Sala Datum Vreme
100/2007 BP03 MV01 8
200/2007 BP03 MV01 7
100/2007 OOP02 RP00 6
150/2008 BP03 MV01 7
250/2008 OOP02 RP00 8
300/2006 RM03 MV01 7
100/2007 RM03 MV01 9
300/2006 RM03 MV01 8

SQL 83
Dekartov (Kartezijanov) proizvod

• Neka je zadata relacija r(R) i s(S), pri čemu je RS=


• Nakon Dekartovog proizvoda
p=r×s
dobija se relacija p(P), gde je P=RS
• deg(p)=deg(r)+deg(s)
• card(p)=card(r)card(s)

SQL 84
Dekartov (Kartezijanov) proizvod
Student Predmet
BrInd Ime Prezime Sifra Naziv
100/2010 Marko Marković SPRI01 Informatika
200/2011 Petar Petrović SPRI02 Matematika
SPRI03 Engleski jezik 1
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 85
Upiti nad više tabela

• Ako se u SELECT naredbi navedu dve tabele obavezno se


dešava Dekartov proizvod
SELECT * FROM Student, Predmet;

• Drugačija 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 86
 spajanje

• Neka je zadata relacija r(R) i s(S), pri čemu je RS=


• Neka postoji atribut A iz R i atribut B iz S nad kojima je
moguće izvršiti
AB
•  je operator poređenja; <,,= ,>,

SQL 87
 spajanje
Linija Avion
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 88
 spajanje

• SELECT *
FROM Linija, Avion
WHERE Dolet Udaljenost;

• Drugačija 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 89
 spajanje

• Kako pronaći linije i avione koji na tim linijama mogu leteti,


ali samo za one linije na kojima je udaljenost veća od
3000km

Dolet  Udaljenost
• SELECT *
FROM Linija, Avion
WHERE Dolet Udaljenost
AND Udaljenost  3000;
• Drugačija sintaksa:
SELECT *
FROM Linija JOIN Avion ON Dolet Udaljenost
WHERE Udaljenost  3000;
SQL 90
Spoljašnje spajanje

• Zapis <105/2008, Nikola> neće se pojaviti u rezultatu zato


što ne postoji ni jedan zapis koji zadovoljava uslov prirodnog
spajanja sa tim zapisom

Student UpisaniPredmet
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 91
Levo spoljašnje spajanje

• Svi zapisi relacije Student će se pojaviti u rezultatu

Student UpisaniPredmet
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 Predmet
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 NULL
SQL 92
Levo spoljašnje spajanje
SELECT Student.*, UpisaniPredmet.*,
FROM Student LEFT OUTER JOIN UpisaniPredmet
ON BrInd = BrIndSt;
Student UpisaniPredmet
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 Predmet
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 NULL
SQL 93
Desno spoljašnje 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 94
Desno spoljašnje 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
95
Puno spoljašnje 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 Zaštita 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 96
Puno spoljašnje 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 Zaštita 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 Zaštita IS NULL NULL
SQL 97
Upiti nad više tabela

• Podrazumevaju spajanje tabela po nekom uslovu


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

SQL 98
Upiti nad više tabela

• Za kolone koje se nalaze u više tabele obavezno je


navođenje
– ImeTabele.ImeKolone
– NadimakTabele.ImeKolone
• R-Predikat- navodi se uslov spajanja u formi uslova
jednakosti vrednosti odgovarajućih kolona u tabelama
• Upit nad više tabela bez uslova spajanja daje kao rezultat
Dekartov proizvod tih tabela

SQL 99
Upiti nad više 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 100
Upiti nad više tabela

• Upit koji daje šifre i nazive naslova knjiga koje članovi drže
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 101
Upiti nad više tabela

• Upit koji daje imena članova koji su pozajmljivali knjige


(spajaju se tabele Pozajmica i Clan po uslovu jednakosti
kolona SifC, svako ime treba da se javi samo jednom u
rezultatu)

SELECT DISTINCT C.SifC, Ime


FROM Clan C, Pozajmica P
WHERE C.SifC=P.SifC;

SQL 102
Prost upit sa svodnim rezultatom
nad više tabela

• Sintaksa:
SELECT G-Lista
FROM ImeTabele [NadimakTabele] {,…}
[WHERE R-Predikat]
• Primer: Upit koji daje ukupno trajanje pozajmica svih knjiga
sa šifrom naslova ‘PP00’

SELECT SUM(Dana)
FROM Pozajmica P, Knjiga K
WHERE P.SifK=K.SifK AND SifN=‘PP00’

SQL 103
Klauzule WHERE i HAVING

• Predikati – to su relacioni izrazi, koji se mogu kombinovati


• Predikati: prosti i složeni
• Prost predikat: elementarni logički izraz izračunljiv nad
svakim redom neke tabele
• Složen predikat: formira se od prostih, primenom logičkih
operatora AND, OR i NOT
• Forme prostih predikata:
Izraz1 {<|<=|=|<>|>=|>} Izraz2
ispituje da li su vrednosti navedenih izraza u zadatom
odnosu

SQL 104
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 (džokeri):
‘_’ bilo koji znak (može ih biti više),
‘%’ bilo koji broj znakova

SQL 105
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 106
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 107
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 108
Upiti sa podupitima

• Podupit (ugnježdeni upit) je SELECT-FROM-WHERE izraz


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

SQL 109
Upiti sa podupitima

• Klasifikacija podupita po načinu izvršavanja:


– Nekorelisani podupit – njegovo izvršavanje ne zavisi od
izvršavanja spoljnog upita; Izvršava se samo jednom – na
početku.
– Korelisani podupit – njegovo izvršavanje zavisi od
spoljnog upita; Izvršava se za svaki red tabele koju
obrađuje spoljni upit
• Posebna forma prostog predikata:
[NOT] EXISTS (R-Upit)
Utvrđuje se ishod podupita. Ako R-Upit kao rezultat daje bar
jedan red, EXISTS daje vrednost “istina”. U suprotnom je
“nije istina”.
SQL 110
Upiti sa podupitima

• Primer 1:
Sastaviti upit koji daje podatke o pozajmicama
natprosečnog trajanja.
1) Određuje 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 111
Upiti sa podupitima

• Primer 2:
Sastaviti upit koji daje imena članova čije je ukupno
trajanje pozajmica veće 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 izvršava se za svakog člana
• Spoljni SELECT određuje kolonu koja se koristi u
podupitu

SQL 112
Upiti sa podupitima

• Primer 3:
Sastaviti upit koji daje imena članova koji drže knjige.
Ovo je primer za korišćenje IN forme predikata. Šifre
članova koji drže knjige daje nekorelisani podupit

SELECT Ime
FROM Clan
WHERE SifC IN (SELECT SifC
FROM Drzi);

SQL 113
Upiti sa podupitima

• Primer 4:
Sastaviti upit koji daje podatke o pozajmicama koje su
trajale duže od svih pozajmica člana šifre ‘PP0’.

Rešenje primenom ALL konstrukcije

SELECT *
FROM Pozajmica
WHERE Dana > ALL (SELECT Dana
FROM Pozajmica
WHERE SifC=‘PP0’);

SQL 114
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 identičnih,
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 115
Unija, razlika i presek upita

• Primer 1:
Sastaviti upit koji daje šifre knjiga koje su bile u prometu
Članovi ih drže kod sebe ili su ranije pozajmljivane.

SELECT SifK
FROM Drzi
UNION
SELECT DISTINCT SifK
FROM Pozajmica;

SQL 116
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 117
Baze podataka
SQL
- Ažuriranja i kontrole -
SQL naredbe
ažuriranja

• Deo SQL jezika kojim se vrši izmena u tabelama čine tri


naredbe:
– INSERT: naredba za unošenje novih redova u tabelu
– UPDATE: naredba za izmene redova u tabeli
– DELETE: naredba za uklanjanje redova iz tabele
• Naredbe ažuriranja se uvek odnose na jednu tabelu
• Kod ovih naredbi nema svođenja; svaka od naredbi vrši
promene na nivou redova tabele

06-May-20 Predavanja 119


INSERT

• Uz ovu naredbu mora se navesti:


– u koju tabelu ubacujemo,
– za koje kolone dajemo vrednosti,
– vrednosti koje ubacujemo.
• Sintaksa naredbe:
INSERT INTO ImeTabele [(ListaKolona)]
{VALUES (ListaKonstanti)}| R-Upit
• Ako nije navedena ListaKolona iza ImeTabele ubacuju se
vrednosti za sve kolone

06-May-20 Predavanja 120


INSERT

• Primer 1:
Ubacivanje podatka o novom naslovu
INSERT INTO Naslov
VALUES(‘PJC#’,
’Programski jezik C#’,’C#’);
• Primer 2:
Neka je kreirana nova tabela NaslovPJ(SifN,Naziv).
Ubacujemo u tu tabelu podatke za naslove iz oblasti ‘PJ’ na
osnovu sadržaja tabele Naslov
INSERT INTO NaslovPJ
SELECT SifN, Naziv
FROM Naslov
WHERE SifO=‘PJ’;

06-May-20 Predavanja 121


UPDATE

• Uz ovu naredbu mora se navesti:


– u kojoj tabeli se vrše izmene,
– za koje kolone u redu menjamo vrednosti,
– pod kojim uslovima menjamo vrednosti.
• Sintaksa naredbe UPDATE koja sadrži sve navedene
elemente:
UPDATE ImeTabele
SET ImeKolone={R-Izraz | S-Upit}{,…}
WHERE R-Predikat

06-May-20 Predavanja 122


UPDATE

• Primer 1:
Neka je u tabeli Naslov za naslov šifre SifN=‘RBP0’
greškom uneta šifra oblasti ‘PJ’, sledi izmena:

UPDATE Naslov
SET SifO=‘BP’
WHERE SifN=‘RBP0’;

06-May-20 Predavanja 123


UPDATE

• Primer 2:
Neka je jedan broj članova brisan iz evidencije. Pri tome za
tabelu Pozajmica nije specificiran referencijalni integritet.
Usled toga šifre članova u Pozajmica treba ručno postaviti
na NULL vrednost.

UPDATE Pozajmica
SET SifC=NULL
WHERE SifC NOT IN (SELECT SifC
FROM Clan);

06-May-20 Predavanja 124


UPDATE

• Primer 3:
Upis kamata od 6% za račune sa iznosom većim od
800.000,00 dinara i kamate od 5% za račune sa iznosom
manjim od 800.000,00 dinara:

UPDATE Depozit
SET Stanje=Stanje*1.06
WHERE Stanje > 800.000,00;
UPDATE Depozit
SET Stanje=Stanje*1.05
WHERE Stanje <= 800.000,00;
• U ovom primeru je bitan redosled ažuriranja

06-May-20 Predavanja 125


DELETE

• Uz ovu naredbu mora se navesti:


– iz koje tabele se vrši uklanjanje,
– pod kojim uslovima se uklanja neki red.
• Sintaksa naredbe:
DELETE FROM ImeTabele
WHERE R-Predikat
• U WHERE klauzuli se mogu primenjivati sve do sada
obrađene forme uključujući i podupite
• SUBP odbija uklanjanja, ako je to u suprotnosti sa
dinamičkom specifikacijom ref. integriteta.

06-May-20 Predavanja 126


DELETE

• Primer 1:
Uklanjanje podataka o članu šifre ‘MM0’ koji niti drži neku
knjigu niti je imao pozajmice:

DELETE FROM Clan


WHERE SifC=‘MM0’;

06-May-20 Predavanja 127


DELETE

• Primer 2:
Za uklanjanje svih neaktivnih članova, onih koji nisu uzeli ni
jednu knjigu, povremeno treba zadavati:

DELETE FROM Clan


WHERE SifC NOT IN (SELECT SifC
FROM Drzi
UNION
SELECT DISTINCT SifC
FROM Pozajmica);

06-May-20 Predavanja 128


POGLEDI (VIEW)

• Izvedene tabele
• Dobija se izvršavanjem upita kojim je definisan pogled
• Kreiranje:
CREATE VIEW ImePogleda [ListaKolona]
AS R-Upit;
• ImePogleda mora biti novo (ne sme da postoji)
• ListaKolona – ili se nasleđuje iz upita koji ga definiše ili se
mora navesti (npr. spajanje)
• Jednom kreiran pogled, može se koristiti za druge upite, i
ponekad i kod ažuriranja.

06-May-20 Predavanja 129


POGLEDI (VIEW)

• Prednosti koje imaju pogledi u radu sa RBP:


– Pogled predstavlja jednu vrstu potprograma u SQL-u.
Može se koristiti u podupitima u WHERE i HAVING
klauzulama.
– Komplikovani i često korišćeni upiti se mogu formulisati u
vidu pogleda (poziv tipa SELECT * FROM ImePogleda;)
– Pogled olakšava kontrolu pristupa BP

06-May-20 Predavanja 130


POGLEDI (VIEW)

• Primer 1: Pogled koji ograničava pristup tabeli Naslov na


redove sa šifrom ‘PJ’
CREATE VIEW NaslovPJ
AS SELECT *
FROM Naslov
WHERE SifO=‘PJ’;
• Primer 2: Pogled koji ograničava pristup tabeli Naslov na
kolone SifN i Naziv
CREATE VIEW Naslov1
AS SELECT SifN, Naziv
FROM Naslov;

06-May-20 Predavanja 131


Kontrola pristupa
podacima

• Vrste kontrole:
– Ko može da pristupa BP
– Čemu može da pristupa u BP
– Šta može da radi sa onim čemu može da pristupi
• Kontrola pristupa se obezbeđuje sa funkcijama:
– Kreiranje i uklanjanje korisnika – naloga za rad sa BP
– Dodela i uklanjanje opštih prava za rad sa BP
– Dodela i uklanjanje posebnih prava

06-May-20 Predavanja 132


Kontrola pristupa
podacima

• Naredbe za kontrolu pristupa:


– GRANT: naredba dodele
– REVOKE: naredba uklanjanja
• Kreiranje korisnika se obavlja istovremeno sa dodelom
jednog od opštih prava:
GRANT OpštePravo TO Korisnik
IDENTIFIED BY Lozinka;
• Korisnik: javni podatak za najavu korisnika sistemu za
upravljanje BP
• Lozinka: tajni naziv, kojom korisnik kompletira postupak
najave

06-May-20 Predavanja 133


Kontrola pristupa
podacima

• OpštePravo: može biti jedno od sledećih:


– CONNECT: sva dodeljena posebna prava nad tabelama,
plus kreiranja pogleda nad tim tabelama
– RESOURCE: prethodna prava plus prava kreiranja
osnovnih tabela
– DBA (Data Base Administrator): neograničena prava nad
BP, koja ima korisnik koji je administrator BP

06-May-20 Predavanja 134


Opšte pravo

• Korisnik se najčešće kreira sa CONNECT pravom


• Opšte pravo iznad CONNECT može se dodeliti sa
naredbom u formi:
GRANT OpštePravo TO Korisnik;
• Administrator BP može ukloniti neko opšte pravo nekom
korisniku naredbom:
REVOKE OpštePravo FROM Korisnik;
• Ako se uklone RESOURCE i DBA pravo, korisniku ostaje
CONNECT pravo.
• Uklanjanjem CONNECT prava, uklanja se i korisnik i on se
više ne može najavljivati za rad sa BP.

06-May-20 Predavanja 135


Posebna prava

• Posebna prava se odnose na tabele i poglede u BP, kao i na


dozvoljene radnje nad njima
• Sintaksa naredbe dodele posebnog prava:
GRANT {Pravo,…} ALL
ON ImeTabele  ImePogleda
TO {Korisnik,…}  PUBLIC
[WITH GRANT OPTION];
• Jedno ili više prava mogu se dodeliti jednom ili više korisnika
• WITH GRANT OPTION: navedeni korisnici mogu dalje
dodeljivati sva navedena prava
• PUBLIC - obuhvata sve postojeće korisnike
• ALL - obuhvata sva prava
06-May-20 Predavanja 136
Posebna prava

• Posebno pravo nad tabelom ili pogledom:


– SELECT: pravo upita
– INSERT: pravo ubacivanja novih redova
– UPDATE [ListaKolona]: Pravo izmene svih kolona ili
samo navedenih
– DELETE: pravo uklanjanja redova
– REFERENCES [ListaKolona]: pravo referisanja kolona
preko stranih ključeva

06-May-20 Predavanja 137


Posebna prava

• Posebna prava se uklanjaju naredbom:

REVOKE {Pravo,…} ALL


ON ImeTabele  ImePogleda
FROM {Korisnik,…}  PUBLIC;

06-May-20 Predavanja 138


Posebna prava

• Primer: Neka u RBP Biblioteka imamo tri korisnika koji


treba da imaju sledeća prava:
– Sef: prava ažuriranja podataka o oblastima, naslovima,
autorima, autorstvu i knjigama, plus prava upita nad svim
podacima
– Radnik: prava ažuriranja podataka o članovima, držanju
knjiga, pozajmicama i rezervacijama, plus prava upita
nad svim podacima
– Clan: prava upita nad podacima o oblastima, naslovima,
autorima i autorstvu

06-May-20 Predavanja 139


Posebna prava

• Kreiranje korisnika

GRANT CONNECT TO Sef IDENTIFIED BY LozinkaSefa;

GRANT CONNECT TO Radnik IDENTIFIED BY


LozinkaRadnika;

GRANT CONNECT TO Clan IDENTIFIED BY


LozinkaClana;

06-May-20 Predavanja 140


Posebna prava

• Davanje prava upita

GRANT SELECT ON Oblast, Naslov, Autor, Je_Autor TO


PUBLIC;
GRANT SELECT ON Knjiga, Clan, Drzi, Pozajmica,
Rezervacija TO Sef, Radnik;
• Davanje prava ažuriranja

GRANT INSERT, UPDATE, DELETE ON Clan, Drzi,


Pozajmica, Rezervacija TO Radnik;

GRANT INSERT, UPDATE, DELETE ON Oblast, Naslov,


Autor, Je_Autor, Knjiga TO Sef;
06-May-20 Predavanja 141
Pitanja ?

06-May-20 Predavanja 142


Važno!
Ova prezentacija je nekomercijalna.
Slajdovi mogu da sadrže materijale preuzete sa Interneta, stručne i naučne
građe, koji su zaštićeni Zakonom o autorskim i srodnim pravima. Ova
prezentacija se može koristiti samo privremeno tokom usmenog izlaganja
nastavnika u cilju informisanja i upućivanja studenata na dalji stručni,
istraživački i naučni rad i u druge svrhe se ne sme koristiti –
Član 44 - Dozvoljeno je bez dozvole autora i bez plaćanja autorske naknade za nekomercijalne svrhe nastave:
(1) javno izvođenje ili predstavljanje objavljenih dela u obliku neposrednog poučavanja na nastavi;
- ZAKON O AUTORSKOM I SRODNIM PRAVIMA ("Sl. glasnik RS", br. 104/2009 i 99/2011)
.................................................................................................................................................................................
Mladen Veinović
mveinovic@singidunum.ac.rs

143

You might also like