You are on page 1of 41

RFP470 Program prekvalifikacija u IT sektoru

JAVA Obuka

SQL (2.deo)
Structured Query Language

Predavači: Igor Mijajlović, softver inženjer, BREZA


Dragana Nikić, softver inženjer, BREZA
Biljana Nedić, softver inženjer, BREZA
Srđa Bjeladinović, asistent, FON
Sadržaj
JOIN - spajanje dve ili više tabela ................................................................................................................ 4
Tipovi spajanja (join uslovi) ......................................................................................................................... 4
Prirodno spajanje ...................................................................................................................................... 5
Spajanje korišćenjem USING klauzule..................................................................................................... 6
Korišćenje alijasa sa USING klauzulom ............................................................................................... 6
Spajanje korišćenjem ON klauzule ........................................................................................................... 6
Spajanje tri tabele .................................................................................................................................. 7
Dodatni uslovi za spajanje .................................................................................................................... 7
Spajanje tabele sa samom sobom SELF JOIN .......................................................................................... 8
Vraćanje redova i bez direktnog poklapanja: OUTER JOIN .................................................................... 9
INNER vs OUTER spajanje ................................................................................................................. 9
LEFT OUTER JOIN ............................................................................................................................. 9
RIGHT OUTER JOIN .......................................................................................................................... 9
FULL OUTER JOIN............................................................................................................................... 10
Dekartov proizvod .................................................................................................................................. 10
Eksplicitni Cross Join ......................................................................................................................... 11
Podupiti (subquery) ..................................................................................................................................... 11
Pravila za korišćenje podupita ................................................................................................................ 11
Tipovi podupita ....................................................................................................................................... 12
Podupit koji vraća jedan red................................................................................................................ 12
Podupit koji vraća više redova ............................................................................................................ 12
SET operatori (MINUS, UNION, INTERSECT, UNION ALL) ................................................................ 14
Pravila set operatora ................................................................................................................................ 14
Oracle Server i set operatori.................................................................................................................... 14
UNION operator ..................................................................................................................................... 15
UNION ALL ........................................................................................................................................... 15
INTERSECT operator ............................................................................................................................. 15
MINUS operator ..................................................................................................................................... 16
ORDER BY klauzula i set operatori ....................................................................................................... 16
DML (Data Manipulation Language) ......................................................................................................... 17
INSERT – dodavanje novih redova ........................................................................................................ 17
Set operatori ................................................................................................................................................ 17
Pravila set operatora ................................................................................................................................ 17
UNION operator ..................................................................................................................................... 18
UNION ALL ........................................................................................................................................... 18
INTERSECT operator ............................................................................................................................. 18
MINUS operator ..................................................................................................................................... 19
Novostvorene kolone u SELECT iskazu .............................................................................................. 19
ORDER BY klauzula i set operatori ....................................................................................................... 19
Data Manipulation Language ...................................................................................................................... 19
Dodavanje novog reda u tabelu............................................................................................................... 20
Ubacivanje null vrednosti ................................................................................................................... 20
Ubacivanje specijalnih vrednosti ........................................................................................................ 20
Kopiranje redova iz druge tabele ........................................................................................................ 20
Izmena podataka u tabeli ........................................................................................................................ 21
Izmena sadržaja dve kolone korišćenjem podupita ............................................................................. 21
Brisanje reda iz tabele ............................................................................................................................. 21
Brisanje redova baziranih na drugoj tabeli.......................................................................................... 21
Transakcije baze podataka .......................................................................................................................... 22
DDL-Data Definition Language ................................................................................................................. 22
CREATE TABLE naredba ..................................................................................................................... 22
Tipovi podataka ...................................................................................................................................... 23
Tekstualni tipovi podataka: ..................................................................................................................... 23
Datumski tipovi podataka: ...................................................................................................................... 23
Intervalni tipovi podataka ....................................................................................................................... 24
Ograničenja ............................................................................................................................................. 24
Ograničenje kolone ............................................................................................................................. 24
Ograničenja tabele .............................................................................................................................. 25
Ograničenje spoljnog ključa................................................................................................................ 25
ALTER TABLE – izmena definicije tabele ................................................................................................ 25
View / Pogled.............................................................................................................................................. 26
Indeksi / Optimizacija ................................................................................................................................. 27
Sinonimi ...................................................................................................................................................... 27
Privilegije .................................................................................................................................................... 27
Zadaci: ........................................................................................................................................................ 29
REŠENJA: .................................................................................................................................................. 32
JOIN - spajanje dve ili više tabela
Povezivanje tabela dinamičkom zamenom rezultata jednog upita u WHERE klauzuli drugog ima
jedno značajno ograničenje primene. Iako se referencira više tabela na taj način se može
primenjivati jedino ukoliko se prikazuju podaci samo jedne tabele. Za prikazivanje podataka iz
više tabela mora se koristiti JOIN. JOIN povezuje n-torke različitih tabela koristeći zajedničke
atribute, odnosno atribute definisane nad istim domenima. To je uobičajeni način povezivanja
tabela relacione baze podataka.

Tipovi spajanja (join uslovi)


Prirodno spajanje korišćenjem NATURAL JOIN klauzule
Spajanje korišćenjem USING klauzule
Spajanjem korišćenjem ON klauzule
Spajanje sa samim sobom SELF JOIN
Spoljno: OUTER spajanje :
 Levo: LEFT OUTER JOIN
 Desno: RIGHT OUTER JOIN
 Potpuno: FULL OUTER JOIN
Dekartov proizvod: Cross join

Spajanje tabela: SQL:1999 sintaksa

SELECT table1.column, table2.column


FROM table1
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |
[JOIN table2 ON (table1.column_name = table2.column_name)]|
[LEFT|RIGHT|FULL OUTER JOIN table2
ON (table1.column_name = table2.column_name)]|
[CROSS JOIN table2];
Prirodno spajanje
Prirodno spajanje: NATURAL JOIN se bazira na spajanju po istim imenima kolona iz dve tabele.
Svaki red rezultujuće tabele sadrži kolone obe tabele Vraćaju se spojene kolone iz obe tabele u
kojima su se vrednosti poklopile.
Ukoliko dve kolone imaju isto ime ali različite tipove podataka, vraća se greška.
SELECT * FROM table1 NATURAL JOIN table2;

SELECT employee_id, first_name, job_id, job_title


from employees NATURAL JOIN jobs;

Deo tabele employees:

Tabela jobs:

Rezultat upita:
Spajanje korišćenjem USING klauzule
Ako u tabelama postoji više identičnih naziva kolona koristi se USING klauzula kako bi se
definisala tačna kolona po kojoj se vrši spajanje.

SELECT employee_id, last_name,


location_id, department_id
FROM employees JOIN departments
USING (department_id) ;


Korišćenje alijasa sa USING klauzulom
Kolona koja se koristi za spajanje sa USING klauzulom ne može koristiti alijas.

SELECT l.city, d.department_name


FROM locations l JOIN departments d
USING (d.location_id)
WHERE d.location_id = 1400;

Spajanje korišćenjem ON klauzule


ON klauzula se koristi da se tačno definiše uslov ili kolone za spajanje.
Uslov spajanja je odvojen od ostalih uslova.
Ovakvi izrazi su lakši za razumevanje.

SELECT e.employee_id, e.last_name, e.department_id,


d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id);
Spajanje tri tabele

SELECT employee_id, city, department_name


FROM employees e
JOIN departments d
ON d.department_id = e.department_id
JOIN locations l
ON d.location_id = l.location_id;

Dodatni uslovi za spajanje


Koristiti AND ili WHERE klauzulu da bi se primenili dodatni uslovi:

SELECT e.employee_id, e.last_name, e.department_id,


d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
AND e.manager_id = 149 ;

ILI:

SELECT e.employee_id, e.last_name, e.department_id,


d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
WHERE e.manager_id = 149 ;
Spajanje tabele sa samom sobom SELF JOIN

SELECT worker.last_name emp, manager.last_name mgr


FROM employees worker JOIN employees manager
ON (worker.manager_id = manager.employee_id);
Vraćanje redova i bez direktnog poklapanja: OUTER JOIN

INNER vs OUTER spajanje


 Spajanje tabela može biti unutrašnje (INNER) ili spoljno (OUTER).
 Ukoliko se vrsta spajanja ne navede eksplicitno podrazumeva se unutrašnje spajanje.
 Prilikom unutrašnjeg spajanja svi redovi koji se ne poklapaju se ne prikazuju u rezultatu.
 Spoljno spajanje prikazuje sve kao i unutrašnje sa dodatkom redova iz jedne ili obe
tabele koje se spajaju.

LEFT OUTER JOIN

Upit vraća sve redove iz EMPLOYEES tabele, koja je tabela sa leve strane, čak i kada nema
preklapanja sa DEPARTMENTS tabelom.

SELECT e.last_name, e.department_id, d.department_name


FROM employees e LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

RIGHT OUTER JOIN


Upit vraća sve redove iz DEPARTMENTS tabele, koja je tabela sa desne strane, čak i kada nema
preklapanja sa EMPLOYEES tabelom.

SELECT e.last_name, d.department_id, d.department_name


FROM employees e RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

FULL OUTER JOIN


Upit vraća sve redove iz EMPLOYEES tabele, koja je tabela sa leve strane, čak i kada nema
preklapanja sa DEPARTMENTS tabelom.
Upit vraća sve redove iz DEPARTMENTS tabele, koja je tabela sa desne strane, čak i kada nema
preklapanja sa EMPLOYEES tabelom.

SELECT e.last_name, d.department_id, d.department_name


FROM employees e FULL OUTER JOIN departments d
ON (e.department_id = d.department_id) ;

Dekartov proizvod
 Dekartov proizvod (CROSS JOIN) je spajanje svakog reda jedne tabele sa svim redovima
druge tabele.
 Vraća veliki broj redova i retko daje korisnu informaciju.
 Ukoliko se uslov spajanja ne navede, dobija se Dekartov proizvod

SELECT first_name, city


FROM employees, departments;
Eksplicitni Cross Join

SELECT last_name, department_name


FROM employees
CROSS JOIN departments ;

Podupiti (subquery)
Osim operacije spajanja – JOIN, još jedan način realizacije uputa nad više tabela je ulaganje
upita nad jednom relacijom u upit nad drugom. Upit koje se ulaže, odnosno upit koji je deo
drugog upita, naziva se podupit ili unutrašnji upit. Upit u koga se podupit (unutrašnji upit) ulaže
naziva se spoljni upit.
Syntax-a podupita:

Primer:

Pravila za korišćenje podupita


 Podupiti se pišu unutar malih zagrada.
 Pozicionirajte podupit sa desne strane operatora zbog čitljivosti.
 Podupit se može naći sa obe strane operatora (ne mora sa desne strane)

Tipovi podupita

Podupit koji vraća jedan red


Koristimo operatore za obradu jednog reda <,>,<=,>= ...

Podupit koji vraća više redova


Koristi operatore za poređenje više redova
IN - Jednak bilo kom članu u listi
ANY - Vraća TRUE ako najmanje jedan element postoji u rezultujućem setu podupita koji ispunjava
uslov. Operatoru prethodi =, !=, >, <, <=, >=.
ALL - Vraća TRUE ako svi elementi rezultujućem setu podupita ispunjavaju uslov. Operatoru prethodi =,
!=, >, <, <=, >=.
IN operator u podupitima koji vraćaju više redova
Prikazati ime zaposlenih, plate i id odeljenja zaposlenih koji imaju minimalne plate po odeljenjima
Primer 2: (podupit vraća više kolona)
Prikazati sve zaposlene koje imaju najnižu platu u svakom odeljenju.

ANY operator u podupitima koji vraćaju više redova


Prikazati sve ulice iz baze koje se nalaze u zemljama čije slovo počinje na slovo A.
ALL operator u podupitima koji vraćaju više redova
Ko od zaposlenih ima manju platu od bilo koje plate programera?

SET operatori (MINUS, UNION, INTERSECT, UNION ALL)


Da bi skupovne operacije mogle da se primene SELECT blokovi (upiti) na koje se operacije
odnose moraju imati isti broj rezultujućih kolona i rezultujuće kolone moraju odgovarati po
tipu.

Pravila set operatora


Redosled set operatora se izvršava sa leva na desno.
Zagrade menjaju redosled izvršenja.
Sortiranje se vrši klauzulom ORDER BY i ona se pojavljuje na samom kraju upita.

Oracle Server i set operatori


Duplikati se automatski eliminišu izuzev kod set operatora UNION ALL.
Nazivi kolona prvog upita se prikazuju u rezultatu.
Izlaz se sortira u rastućem redosledu izuzev kod set operatora UNION ALL.
TABELE:
EMPLOYEES: Obezbeđuje detalje o trenutno zaposlenim radnicima.
RETIRED_EMPLOYEES: Obezbeđuje detalje o penzionisanim radnicima.

UNION operator
UNION operator vraća redove obe tabele eliminišući duplikate. Redovi su sortirani po defaultu
rastuće po prvoj koloni.
Primer:
Prikažite id zaposlenog, ime i id posla za trenutne i penzionisane zaposlene.
SELECT employee_id,first_name,job_id
FROM employees
UNION
SELECT employee_id,first_name,job_id
FROM retired_employees;

UNION ALL
UNION ALL operator vraća redove obe tabele sa svim duplikatima. Redovi nisu sortirani.
Primer:
Prikazuju se i duplikati. Sortiranje se ostvaruje klauzulom ORDER BY.
SELECT job_id, department_id
FROM employees
UNION ALL
SELECT job_id, department_id
FROM retired_employees
ORDER BY job_id;

INTERSECT operator
INTERSECT operator vraća redove koji su isti u obe tabele.
Primer:
Prikaži zajednički manager ID i ID odeljenja trenutno zaposlenih i penzionisanih radnika.
SELECT manager_id,department_id
FROM employees
INTERSECT
SELECT manager_id,department_id
FROM retired_employees

MINUS operator
MINUS operator vraća različite redove prvog upita koji nisu prisutni u drugom.

Primer:
Prikaži ID zaposlenog i job id onih zaposlenih koji rade ili su radili u odeljenju: prodaja.
SELECT employee_id, job_id
FROM employees
WHERE department_id = 80
MINUS
SELECT employee_id, job_id
FROM retired_employees
WHERE department_id = 90;

Novostvorene kolone u SELECT iskazu


Da bi se osnovni uslov za koršćenje set operatora ispunio možemo koristiti TO_CHAR funkciju
ukoliko kolona u nekoj tabeli ne postoji.
SELECT first_name, TO_CHAR('Nije u penziji')
AS "Datum penzionisanja"
FROM employees
UNION
SELECT first_name, TO_CHAR(retired_date)
FROM retired_employees;

ORDER BY klauzula i set operatori


ORDER BY klauzula se pojavljuje samo jednom na kraju kompleksnog upita.
Zasebni SELECT upiti ne mogu imati svoje ORDER BY klauzule.
ORDER BY klauzula prepoznaje samo kolone prvog upita.
Po default-u, prva kolona prvog SELECT upita se koristi za sortiranje u rastućem redosledu.
DML (Data Manipulation Language)
Naredbe za manipulisanje (rukovanje) podacima omogućavaju ažuriranje i prikaz podataka
baze:
 SELECT (prikaz sadržaja relacione baze podataka)
 UPDATE (izmena vrednosti kolona tabele)
 DELETE (izbacivanje redova tabele)
 INSERT (dodavanje redova postojećoj tabeli)

INSERT – dodavanje novih redova


Ovom sintaksom samo jedan red se dodaje u jednom trenutku:

INSERT INTO table [(column [, column...])]


VALUES (value [, value...]);

Set operatori

Pravila set operatora


Da bi skupovne operacije mogle da se primene SELECT blokovi (upiti) na koje se operacije
odnose moraju imati isti broj rezultujućih kolona i rezultujuće kolone moraju odgovarati po
tipu.
 Redosled set operatora se izvršava sa leva na desno.
 Zagrade menjaju redosled izvršenja.
 Sortiranje se vrši klauzulom ORDER BY i ona se pojavljuje na samom kraju upita.
Oracle Server i set operatori
 Duplikati se automatski eliminišu izuzev kod set operatora UNION ALL.
 Nazivi kolona prvog upita se prikazuju u rezultatu.
 Izlaz se sortira u rastućem redosledu izuzev kod set operatora UNION ALL.
UNION operator
UNION operator vraća redove obe tabele eliminišući duplikate. Redovi su sortirani po defaultu
rastuće po prvoj koloni.
Primer:
Prikažite id zaposlenog, ime i id posla za trenutne i penzionisane zaposlene.
SELECT employee_id,first_name,job_id
FROM employees
UNION
SELECT employee_id,first_name,job_id
FROM retired_employees;

UNION ALL
UNION ALL operator vraća redove obe tabele sa svim duplikatima. Redovi nisu sortirani.
Primer:
Prikazuju se i duplikati. Sortiranje se ostvaruje klauzulom ORDER BY.
SELECT job_id, department_id
FROM employees
UNION ALL
SELECT job_id, department_id
FROM retired_employees
ORDER BY job_id;

INTERSECT operator
INTERSECT operator vraća redove koji su isti u obe tabele.
Primer:
Prikaži zajednički manager ID i ID odeljenja trenutno zaposlenih i penzionisanih radnika.
SELECT manager_id,department_id
FROM employees
INTERSECT
SELECT manager_id,department_id
FROM retired_employees

MINUS operator
MINUS operator vraća različite redove prvog upita koji nisu prisutni u drugom.
Primer:
Prikaži ID zaposlenog i job id onih zaposlenih koji rade ili su radili u odeljenju: prodaja.
SELECT employee_id, job_id
FROM employees
WHERE department_id = 80
MINUS
SELECT employee_id, job_id
FROM retired_employees
WHERE department_id = 90;

Novostvorene kolone u SELECT iskazu


Da bi se osnovni uslov za koršćenje set operatora ispunio možemo koristiti TO_CHAR funkciju
ukoliko kolona u nekoj tabeli ne postoji.
SELECT first_name, TO_CHAR('Nije u penziji')
AS "Datum penzionisanja"
FROM employees
UNION
SELECT first_name, TO_CHAR(retired_date)
FROM retired_employees;

ORDER BY klauzula i set operatori


ORDER BY klauzula se pojavljuje samo jednom na kraju kompleksnog upita.
Zasebni SELECT upiti ne mogu imati svoje ORDER BY klauzule.
ORDER BY klauzula prepoznaje samo kolone prvog upita.
Po default-u, prva kolona prvog SELECT upita se koristi za sortiranje u rastućem redosledu.

Data Manipulation Language


Naredbe za manipulisanje (rukovanje) podacima omogućavaju ažuriranje i prikaz podataka
baze:
SELECT (prikaz sadržaja relacione baze podataka)
UPDATE (izmena vrednosti kolona tabele)
DELETE (izbacivanje redova tabele)
INSERT (dodavanje redova postojećoj tabeli)

Dodavanje novog reda u tabelu


INSERT INTO table [(column [, column...])]
VALUES (value [, value...]);

INSERT INTO departments


VALUES (70, 'Public Relations', 100, 1700);

 Mogu se upisati nazivi kolona


 Vrednost se upisuje za svaki red.
 Tekst i datume stavljamo pod apostrofe.

INSERT INTO departments(department_id,
department_name, manager_id, location_id)
VALUES (70, 'Public Relations', 100, 1700);

Ubacivanje null vrednosti


Implicitni metod: Izostaviti naziv kolone iz liste

INSERT INTO departments (department_id,


department_name)
VALUES (30, 'Purchasing');

Eksplicitni metod: Koristiti NULL u delu VALUES klauzule.

INSERT INTO departments


VALUES (100, 'Finance', NULL, NULL);

Ubacivanje specijalnih vrednosti

INSERT INTO employees (employee_id,


first_name, last_name,
email, phone_number,
hire_date, job_id, salary,
commission_pct, manager_id,
department_id)
VALUES (113,
'Louis', 'Popp',
'LPOPP', '515.124.4567',
CURRENT_DATE, 'AC_ACCOUNT', 6900,
NULL, 205, 110);

Kopiranje redova iz druge tabele


Ubaciti sve redove iz zaposlenih koji sadrže termin REP u tabelu sales_reps
Naredba INSERT koristi podupit:

INSERT INTO sales_reps(id, name, salary, commission_pct)


SELECT employee_id, last_name, salary, commission_pct
FROM employees
WHERE job_id LIKE '%REP%';

Ne koristi se VALUES klauzula.


Potrebno je da se poklopi broj kolona u INSERT klauzuli i broj kolona u podupitu.
Izmena podataka u tabeli
UPDATE table
SET column = value [, column = value, ...]
[WHERE condition];

Zaposleni sa šifrom 113 se prebacuje u odeljenje 50:

UPDATE employees
SET department_id = 50
WHERE employee_id = 113;

Ukoliko se izostavi uslov u WHERE klauzuli svi redovi će biti izmenjeni:


UPDATE copy_emp
SET department_id = 110;

Izmena sadržaja dve kolone korišćenjem podupita


Zaposleni sa šifrom 103 dobija šifru posla i platu istu kao i zaposleni sa šifrom 205.
UPDATE employees
SET (job_id,salary) = (SELECT job_id,salary
FROM employees
WHERE employee_id = 205)
WHERE employee_id = 103;

Brisanje reda iz tabele


DELETE [FROM] table
[WHERE condition];

nje određenih redova koji se specificiraju u WHERE klauzuli:

DELETE FROM departments


WHERE department_name = 'Finance';

Ukoliko se izostavi uslov u WHERE klauzuli, brišu se svi redovi:


DELETE FROM copy_emp;

Brisanje redova baziranih na drugoj tabeli


Podupit: Vrati id odeljenja ukoliko je u nazivu odeljenja reč Public.
Obrisati sve redove u tabeli zaposleni koji imaju id odeljenja koja se poklapaju sa vrednostima koje vraća
podupit:

DELETE FROM employees


WHERE department_id IN
(SELECT department_id
FROM departments
WHERE department_name
LIKE '%Public%');
Transakcije baze podataka
Skup DML naredbi koji formira logičku jedinicu posla naziva se transakcija.
Početak transakcije: kada se izvrši prva DML SQL naredba.
Transakcija se završava jednim od nabrojanih događaja:
 COMMIT ili ROLLBACK naredba.
 Izvršavanjem DDL ili DCL naredbi (automatski commit).
 Izlazak iz SQL Developer-a
 Pad sistema
Primer COMMIT:

Kreiranje izmena:
DELETE FROM EMPLOYEES
WHERE employee_id=113;
INSERT INTO departments
VALUES (290, 'Corporate Tax', NULL, 1700);

Potvrda izmena:
COMMIT;

Primer ROLLBACK:
DELETE FROM test;
4 rows deleted.
ROLLBACK;
Rollback complete.
DELETE FROM test WHERE id = 100;
1 row deleted.
SELECT * FROM test WHERE id = 100;
No rows selected.
COMMIT;
Commit complete.

DDL-Data Definition Language


SQL DDL naredbe se koriste za kreiranje, izmenu i brisanje same relacione baze podataka kao i objekata
koji čine relacionu baze podataka.

CREATE TABLE naredba


CREATE TABLE [šema].<ime_tabele>
(<lista_deklaracija_kolona>
[,<lista_deklaracija_organičenja_tabele>]);

Za deklaraciju kolona se koristi format:


<ime_kolone><tip_podatka>[(<dužina>)] [<ograničenje_kolone>],

Nakon deklaracije svih kolona navode se ograničenja koja važe za celu tabelu.

Tipovi podataka

Tekstualni tipovi podataka:

Datumski tipovi podataka:


Intervalni tipovi podataka

Ograničenja

Osiguravaju konzistentnost (postojanost) i integritet (nepovrenjeno stanje baze) baze podataka.


Sprovode pravila na nivou kolone ili na nivou tabele kako bi se sprečio pogrešan upis u tabelu
Ograničenja se kreiraju:
 U isto vreme kada i tabela
 Nakon što kreirate tabelu
Ograničenje kolone

Ograničenja koja možete da definišete za kolonu kod kreiranja tabela su:


 NULL ili NOT NULL
 UNIQUE
 PRIMARY KEY
 CHECK
 DEFAULT
 FOREIGN KEY

NOT NULL ograničenje

NULL ili NOT NULL -definiše da kolona može ili ne može imatu NULL vrednosti.
Za kolonu podrazumevano ograničenje je NULL vrednost. To znači da navodimo samo ograničenje NOT
NULL, ako je definisano za konkretnu kolonu.

UNIQUE ograničenje
UNIQUE - definiše da kolona ima jedinstvene vrednosti (kandidati za ključeve). Strože ograničenje od
NOT NULL je UNIQUE, koje ne dozvoljava ponavljanje vrednosti u koloni.

PRIMARY KEY ograničenje


PRIMARY KEY - definiše da kolona predstavlja primarni ključ tabele.
Kod navođenja PRIMARY KEY podrazumeva se NOT NULL ograničenje za tu kolonu, tako da ga ne treba
posebno navoditi.

CHECK ograničenje
Definiše uslov koji svaki red mora da zadovolji.
Ne može da referencira kolone drugih tabela.
..., salary NUMBER(2)
CONSTRAINT emp_salary_min
CHECK (salary > 0),...
DEFAULT ograničenje
definiše podrazumevanu vrednost za kolonu (kolona uzima ovu vrednost, ako vrednost kolone nije
navedena).

FOREIGN KEY ograničenje


definiše da kolona predstavlja spoljni ključ tabele.

Ograničenja tabele

Za definisanje ograničenja koja važe za tabelu u celini možete koristiti:


 PRIMARY KEY - definiše koja kolona ili koje kolone čine primarni ključ tabele.
 FOREIGN KEY - definiše koja kolona ili koje kolone čine spoljni ključ tabele.
 UNIQUE - definiše koja kolona ili koje kolone imaju jedinstvene vrednosti (kandidati za ključeve).
 CHECK -definiše ograničenja vrednosti kolone ili kolona koje DBMS proverava kod upisa ili
ažuriranja vrednosti te ili tih kolona.

Ograničenje spoljnog ključa

U deklaraciji kolone ili tabele, nakon klauzule REFERENCES, mogu se navesti klauzule ON DELETE ili ON
UPDATE koje specificiraju aktivnosti u slučaju narušavanja integriteta.
ON DELETE omogućava specifikaciju aktivnosti nad torkama relacije, odnosno vrstama tabele, na koju se
referencirate u REFERENCES klauzuli u slučaju brisanja torki u tabeli u kojoj je navedeno ovo
ograničenje.
ON UPDATE omogućava specifikaciju aktivnosti nad torkama referencirane tabele u slučaju ažuriranja
(promene vrednosti) podataka u tabeli gde je REFERENCES ograničenje specificirano.

U oba slučaja, iza ovih klauzula se navodi jedna od klauzula koja definiše aktivnost koja će se izvršiti nad
torkama u slučaju brisanja ili ažuriranja vrednosti n-torke u tabeli u kojoj je ograničenje navedeno:
 NO ACTION - nema akcije (ovo je predefinisana vrednost).
 CASCADE - kaskadno izvršenje aktivnosti brisanja (brišu se torke u tabeli na koju se
referencirate) kod ON DELETE ili aktivnosti ažuriranja (ažuriraju se vrednosti referenciranih
atributa) kod ON UPDATE.
 SET DEFAULT - promena vrednosti atributa u tabeli na koju se referencirate na predefinisanu
vrednost.
 SET NULL - promena vrednosti atributa spoljnog kjuča na NULL.

CREATE TABLE <naziv_tabele>


(
FOREIGN KEY (<lista_atributa_koji_čine_spoljni_ključ>)
REFERENCES (<lista_referenciranih_atributa>)
[ON DELETE { NO ACTION | CASCADE | SET DEFAULT |SET NULL}]
[ON UPDATE { NO ACTION | CASCADE | SET DEFAULT |SET NULL}]
CHECK (<uslovni_izraz>)
);

ALTER TABLE – izmena definicije tabele


Koristimo ALTER TABLE izraz za:
 Dodavanje nove kolone
 Promenu definicije postojeće kolone
 Definisanje default vrednosti za novu kolonu
 Drop / uklanjanje kolone
 Rename / promena imena kolone
 Promena tabele na read-only status

ALTER TABLE table


ADD(column datatype [DEFAULT expr]
[constraint_name][constraint _type][constraint _condition];);

ALTER TABLE table


MODIFY (column datatype [DEFAULT expr]
[, column datatype]...);

ALTER TABLE table


DROP (column [, column] …);

View / Pogled
Prikaz podataka iz jedne ili više tabela

Prednosti:
 Ograničava pristup podacima
 Komplikovane upite pretvara u laке
 Obezbeđuje nezavisnost podataka
 Različiti pogledi na iste podatke

CREATE [OR REPLACE][FORCE|NOFORCE]VIEW view


[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];
Indeksi / Optimizacija
Indeksi su objekti šeme i služe za optimizacju (povećanje performansi) kompleksnih upita i rada baze
Indeksi su nezavisni od tabele koju indeksiraju
Kreiranje indeksa:
automatsko (Oracle server ih definše za PRIMARY KEY ili UNIQUE konstrainte)
ručno (korisnici baze mogu da kreiraju indekse nad kolonama koje nisu PK ili unique)

Kreiranje indeksa nad jednom ili više kolona:


CREATE [UNIQUE]INDEX index
ON table (column[, column]...);

Primer za povećanje brzine pristupa upitom nad kolonom LAST_NAME u tabeli EMPLOYEES :
CREATE INDEX emp_last_name_idx
ON employees(last_name);

Sinonimi
Predstavljaju alternativno ime za objekte
Najčešće za drugog usera (koji nije kreirao tabelu)
Sintaksa:
CREATE [PUBLIC] SYNONYM synonym
FOR object;

Privilegije
Primer kreiranja usera:
CREATE USER user
IDENTIFIED BY password;

Primer dodele sistem privilegija za kreiranog usera:


GRANT privilege [, privilege...]
TO user [, user| role, PUBLIC...];
Primer privilegija za developera:
 CREATE SESSION
 CREATE TABLE
 CREATE SEQUENCE
 CREATE VIEW
 CREATE PROCEDURE

Privilegije nad objektima


Privilegije nad objektima baze:
ALTER
DELETE
INDEX
INSERT
REFERENCES
SELECT
UPDATE

Primer davanja prava nad objektima baze:


GRANT object_priv [(columns)]
ON object
TO {user|role|PUBLIC}
[WITH GRANT OPTION];

Primer privilegija / grant


Davanje privilegije selekta nad tabelom
GRANT select
ON employees
TO demo;

Davanje privilegije ažuriranje specifičnih kolona userima


GRANT update (department_name, location_id)
ON departments
TO demo, manager;

Oduzimanje privilegija / revoke

Povlačenje / ukidanje privilegija userima


REVOKE {privilege [, privilege...]|ALL}
ON object
FROM {user[, user...]|role|PUBLIC}
[CASCADE CONSTRAINTS];

Primer ukidanja select-a i insert-a nad tabelom departments user-u demo :


REVOKE select, insert
ON departments
FROM demo;
Zadaci:
JOIN:

1. Prikazati job_title, ime i prezime zaposlenog i razliku maksimalne plate i plate (koristiti natural
join).

2. Prikazati job_title, ime i prezime zaposlenih koji rade i razliku maksimalne plate i plate (koristiti
natural join) u odeljenju 80.

3. Prikazati job title i prosečnu platu zaposlenih. (koristiti natural join)

4. Napisati upit koji će prikazati naziv odeljenja i broj zaposlenih u svakom odeljenju.

5. Prikazati ime odeljenja, prosečnu platu i broj zaposlenih koji rade u tom odeljenju a dobijaju
proviziju. (spajanje izvršiti korišćenjem klauzule USING)

6. Prikazati ime zemlje, grad i odeljenja koja posluju u tom gradu. (spajanje izvršiti korišćenjem
klauzule USING)

7. Prikazati ime i prezime, platu onih zaposlenih koji rade u bilo kom odeljenju smeštenom u
Londonu. (spajanje izvršiti korišćenjem klauzule USING)

8. Napisati upit koji će prikazati ime, prezime, id odeljenja, ime odeljenja za svakog zaposlenog.
(koristiti konstrukciju JOIN ON)

9. Napisati upit koji će vratiti ime, prezime, platu, naziv posla, maksimalnu i minimalnu platu za sve
zaposlene.

10. Prikazati ime, prezime, broj odeljenja i ime odeljenja za sve zaposlene u odeljenju 80 i u
odeljenju 40. (koristiti konstrukciju JOIN ON)

11. Napisati upit koji će prikazati ime prezime, id odeljenja, ime odeljenja uključujući i ona odeljenja
koja nemaju nijednog zaposlenog.

12. Napisati upit koji će prikazati ime, prezime, id odeljenja i ime odeljenja za sve zaposlene, bez
obzira što su možda trenutno neraspoređeni (ne pripadaju ni jednom odeljenju).

PODUPITI:

1. Prikazati ime i prezime onih zaposlenih kojima je plata veća od zaposlenog čiji je id 163.

2. Prikazati ime, prezime, platu, id odeljenja, id posla za one zaposlene koji imaju istu poziciju u firmi
(job_id) kao i zaposleni sa id-om 169.

3. Prikazati ime, prezime, platu, id odeljenja za onog zaposlenog koji ima najnižu platu u firmi.

4. Prikazati id, ime i prezime zaposlenih koji zarađuju više od proseka u firmi.

5. Prikazati ime i prezime, id zaposlenog i job id za sve zaposlene koji rade u Torontu. Problem rešiti
korišćenjem podupita. Koristiti tabele: locations, departments, employees.

6. Prikazati prezime onog zaposlenog koji zarađuje više od proseka i koji radi u bilo kom odeljenju
čiji naziv počinje sa IT.

7. Prikazati id odljenja i ime svih odeljenja koji se nalaze u Londonu.


8. Prikazati ime i prezime, datum zaposlenja onih zaposlenih koji su zaposleni nakon što se zaposlio
zaposleni sa id-om 165.

9. Prikazati id zaposlenog koji je u firmi imao više od jednog radnog mesta (tabela job history)

10. Nadograditi prethodni upit koji će prikazati sve podatke o zaposlenima koji su u firmi imali više od
jednog radnog mesta.

SET OPERATORI:

1. Prikazati id i job_id za zaposlene koji su trenutno na radnom mestu na kome su bili i nekad u
proslosti (a u međuvremenu se desila neka promena)

2. Prikazati podatke o sadašnjem i prethodnim radnim mestima zaposlenog (employee_id, job_id) u


okviru firme.

Ukoliko se zaposleni u više navrata našao na istom radnom mestu, podatak treba da se pojavi
samo jednom.

3. Prikazati podatke o sadašnjem i prethodnim radnim mestima zaposlenog (employee_id, job_id)


u okviru firme.

Ukoliko se zaposleni u više navrata našao na istom radnom mestu podatak treba da se pojavi za
svaku promenu (dupliranje istih redova)

Uporediti broj redova rezultata ovog i prethodnog zadatka.

4. Prikazati zaposlene (employee_id, department_id) koji su trenutno u odeljenju u kome su bili i


nekad u proslosti (a u međuvremenu se desila neka promena)

5. Prikazati zaposlene (employee_id, job_id, department_id) koji su trenutno na radnom mestu i u


odeljenju u kome su bili i nekad u proslosti (a u međuvremenu se desila neka promena)

Uporediti rezultat sa rezultatom prethodnog zadatka.

6. Prikazati zaposlene izodeljenja 80 koji nijednom nisu menjali radno mesto unutar firme

7. Prikazati listu radnih mesta za odeljenja 10, 80 i 50 upotrebom skupovnih operatora.

8. Prikazati listu odeljenja koja ne sadrže zanimanje 'SA_REP'

9.Prikazati sadasnje radno mesto i id zaposlenog kao i podatke o njegovim prethodnim pozicijama u
firmi. Prikazati i podatak o plati na trenutnom radnom mestu, a za prethodne pozicije prikazati 0. Ne
treba ponavljati duple redove.

DML:

Potrebno je izvršiti sledeći upit kako bi se kreirala pomoćna tabela koju ćemo koristiti za naredne
vežbe:

CREATE TABLE my_employee

(id NUMBER(4) CONSTRAINT my_employee_id_nn NOT NULL,


last_name VARCHAR2(25),

first_name VARCHAR2(25),

userid VARCHAR2(20),

salary NUMBER(9,2));

Kad se naredba izvrši osvežite prikaz tabela HR šeme i uverite se da je kreirana nova tabela
my_employee

1. Unesite sledeće redove u tabely my_employee:

ID LAST_NAME FIRST_NAME USERID SALARY


1 Bing Meg megmeg 1000
2 Biri Monika monika1 1200
3 Feedman Fibi smalycat 1500
4 Geler Ros ros111 1100

2. Komitujte prethodne promene.

3. Uverite se da su podaci dodati u tabelu.

4. Promeniti prezime zaposlenog čiji je id 3 u 'Bronx'.

5. Povećajte iznos plate svim zaposlenim čija plata je manja od 1200.

6.Uverite se da su podaci izmenjeni

7. Poništite poslednje promene i ponovo selektujte podatke iz tabele my_employee

8. Obrišite iz tabele my_employee zaposlenog koji se preziva Geler

9. Obrišite sve podatke iz table my_employee i komitujte promene.

10. Insertujete u tabelu my_employee podatke o radnicima iz odeljenja 80. Userid kolona u tabeli
my_employee je mail radnika.

11. Iz tabele my_employee obrišite radnike čiji je mendžer radnik sa id-jem 148.

12. Dopisite '123' na userid svih radnika u tabeli my_employee.

13. Prikažite sve zaposlene iz tabele my_employee koji su menjali radno mesto unutar firme
REŠENJA:
JOIN:
1.

SELECT job_title, first_name || ' ' || last_name AS Employee_name,

max_salary-salary AS razlika_plate

FROM employees

NATURAL JOIN jobs;

2.

SELECT job_title, first_name || ' ' || last_name AS Employee_name,

max_salary-salary AS salary_difference

FROM employees

NATURAL JOIN jobs

WHERE department_id = 80;

3.

SELECT job_title, AVG(salary)

FROM employees

NATURAL JOIN jobs

GROUP BY job_title;

4.

SELECT DEPARTMENT_ID, department_name, COUNT(*)


FROM employees
JOIN departments using (department_id)
GROUP BY DEPARTMENT_ID,department_name;

5.

SELECT department_name, AVG(salary), COUNT(commission_pct)

FROM departments

JOIN employees USING (department_id)

GROUP BY department_name;

6.

SELECT country_name,city, department_name

FROM countries
JOIN locations USING (country_id)

JOIN departments USING (location_id);

7.

SELECT first_name || ' ' || last_name AS Employee_name, salary

FROM employees

JOIN departments USING (department_id)

JOIN locations USING (location_id)

WHERE city = 'London';

8.

SELECT E.first_name , E.last_name ,

E.department_id , D.department_name

FROM employees E

JOIN departments D

ON E.department_id = D.department_id;

9.

SELECT E.first_name, E.last_name, E.salary, J.job_title,J.max_salary,J.min_salary

FROM employees E

JOIN jobs J

ON E.job_id=J.job_id ;

10.

SELECT E.first_name , E.last_name ,

E.department_id , D.department_name

FROM employees E

JOIN departments D

ON E.department_id = D.department_id

AND E.department_id IN (80 , 40)

ORDER BY E.last_name;
11.

SELECT E.first_name, E.last_name, D.department_id, D.department_name

FROM employees E

RIGHT OUTER JOIN departments D

ON E.department_id = D.department_id;

12.

SELECT E.first_name, E.last_name, E.department_id, D.department_name

FROM employees E

LEFT OUTER JOIN departments D

ON E.department_id = D.department_id;

PODUPITI:

1.

SELECT first_name, last_name

FROM employees

WHERE salary >

( SELECT salary

FROM employees

WHERE employee_id=163

);

2.

SELECT first_name, last_name, salary, department_id, job_id

FROM employees

WHERE job_id =

( SELECT job_id

FROM employees

WHERE employee_id=169);
3.

FROM employees

WHERE salary =

(SELECT MIN(salary)

FROM employees );

4.

FROM employees

WHERE salary >

( SELECT AVG(salary)

FROM employees

);

5.

SELECT first_name, last_name, employee_id, job_id

FROM employees

WHERE department_id =

(SELECT department_id

FROM departments

WHERE location_id =

(SELECT location_id

FROM locations

WHERE city ='Toronto'));

6.

SELECT last_name

FROM employees

WHERE department_id IN

(SELECT department_id

FROM departments

WHERE department_name LIKE 'IT%')


AND salary >

(SELECT avg(salary)

FROM employees);

REŠENJE preko spajanja tabela:

SELECT *

FROM hr.employees e JOIN hr.departments d ON e.department_id=d.department_id

WHERE department_name LIKE 'IT%'

AND salary >

(SELECT avg(salary)

FROM hr.employees);

7.

SELECT department_id, department_name

FROM departments

WHERE location_id =

SELECT location_id

FROM locations

WHERE city = 'London'

);

8.

SELECT first_name ||' '|| last_name AS Ime_prezime , hire_date

FROM employees

WHERE hire_date > (

SELECT hire_date

FROM employees

WHERE employee_id = 165);


9.

SELECT EMPLOYEE_ID

FROM job_history

GROUP BY EMPLOYEE_ID

HAVING COUNT(EMPLOYEE_ID) > 1

10.

SELECT *

FROM employees

WHERE EMPLOYEE_ID IN

(SELECT EMPLOYEE_ID

FROM job_history

GROUP BY EMPLOYEE_ID

HAVING COUNT(EMPLOYEE_ID) > 1)

SET OPERATORI:

1.

SELECT employee_id, job_id

FROM employees

INTERSECT

SELECT employee_id, job_id

FROM job_history;

2.

SELECT employee_id, job_id

FROM employees

UNION

SELECT employee_id, job_id

FROM job_history;
3.

SELECT employee_id, job_id

FROM employees

UNION ALL

SELECT employee_id, job_id

FROM job_history;

4.

SELECT employee_id, department_id

FROM employees

INTERSECT

SELECT employee_id, department_id

FROM job_history;

5.

SELECT employee_id, job_id, department_id

FROM employees

INTERSECT

SELECT employee_id, job_id, department_id

FROM job_history;

6.

SELECT employee_id

FROM employees

where department_id = 80

MINUS

SELECT employee_id

FROM job_history;

7.

SELECT distinct job_id, department_id

FROM employees
WHERE department_id = 10

UNION ALL

SELECT DISTINCT job_id, department_id

FROM employees

WHERE department_id = 80

UNION ALL

SELECT DISTINCT job_id, department_id

FROM employees

WHERE department_id = 20;

8.

SELECT department_id

FROM departments

MINUS

SELECT department_id

FROM employees

WHERE job_id = 'SA_REP';

9.

SELECT employee_id, job_id, salary

FROM employees

UNION

SELECT employee_id, job_id, 0

FROM job_history;

DML:

1.

INSERT INTO my_employee

VALUES (1, 'Bing', 'Meg', 'megmeg', 1000);


2.

COMMIT;

3.

SELECT *

FROM my_employee;

4.

UPDATE my_employee

SET last_name = 'Bronx'

WHERE id = 3;

5.

UPDATE my_employee

SET salary = salary + 100

WHERE salary < 1200;

6.

SELECT *

FROM my_employee;

7.

ROLLBACK;

SELECT *

FROM my_employee;

8.

DELETE

FROM my_employee

WHERE last_name = 'Geler';

9.

DELETE

FROM my_employee;
7.

INSERT INTO my_employee

SELECT employee_id, last_name, first_name, email, salary

FROM employees

WHERE department_id = 80;

8.

DELETE FROM my_employee

WHERE id in (SELECT employee_id

FROM employees

WHERE manager_id = 148);

9.

UPDATE my_employee set userid = userid||'123';

10.

SELECT *

FROM my_employee

WHERE id in (SELECT employee_id FROM job_history);

You might also like