Professional Documents
Culture Documents
SQL Skripta 2-Deo I Resenja
SQL Skripta 2-Deo I Resenja
JAVA Obuka
SQL (2.deo)
Structured Query Language
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.
…
Korišćenje alijasa sa USING klauzulom
Kolona koja se koristi za spajanje sa USING klauzulom ne može koristiti alijas.
ILI:
Upit vraća sve redove iz EMPLOYEES tabele, koja je tabela sa leve strane, čak i kada nema
preklapanja sa DEPARTMENTS tabelom.
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
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:
Tipovi podupita
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;
Set operatori
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;
UPDATE employees
SET department_id = 50
WHERE employee_id = 113;
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.
Nakon deklaracije svih kolona navode se ograničenja koja važe za celu tabelu.
Tipovi podataka
Ograničenja
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.
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).
Ograničenja tabele
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.
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
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;
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.
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.
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)
Ukoliko se zaposleni u više navrata našao na istom radnom mestu, podatak treba da se pojavi
samo jednom.
Ukoliko se zaposleni u više navrata našao na istom radnom mestu podatak treba da se pojavi za
svaku promenu (dupliranje istih redova)
6. Prikazati zaposlene izodeljenja 80 koji nijednom nisu menjali radno mesto unutar firme
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:
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
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.
13. Prikažite sve zaposlene iz tabele my_employee koji su menjali radno mesto unutar firme
REŠENJA:
JOIN:
1.
max_salary-salary AS razlika_plate
FROM employees
2.
max_salary-salary AS salary_difference
FROM employees
3.
FROM employees
GROUP BY job_title;
4.
5.
FROM departments
GROUP BY department_name;
6.
FROM countries
JOIN locations USING (country_id)
7.
FROM employees
8.
E.department_id , D.department_name
FROM employees E
JOIN departments D
ON E.department_id = D.department_id;
9.
FROM employees E
JOIN jobs J
ON E.job_id=J.job_id ;
10.
E.department_id , D.department_name
FROM employees E
JOIN departments D
ON E.department_id = D.department_id
ORDER BY E.last_name;
11.
FROM employees E
ON E.department_id = D.department_id;
12.
FROM employees E
ON E.department_id = D.department_id;
PODUPITI:
1.
FROM employees
( SELECT salary
FROM employees
WHERE employee_id=163
);
2.
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
( SELECT AVG(salary)
FROM employees
);
5.
FROM employees
WHERE department_id =
(SELECT department_id
FROM departments
WHERE location_id =
(SELECT location_id
FROM locations
6.
SELECT last_name
FROM employees
WHERE department_id IN
(SELECT department_id
FROM departments
(SELECT avg(salary)
FROM employees);
SELECT *
(SELECT avg(salary)
FROM hr.employees);
7.
FROM departments
WHERE location_id =
SELECT location_id
FROM locations
);
8.
FROM employees
SELECT hire_date
FROM employees
SELECT EMPLOYEE_ID
FROM job_history
GROUP BY EMPLOYEE_ID
10.
SELECT *
FROM employees
WHERE EMPLOYEE_ID IN
(SELECT EMPLOYEE_ID
FROM job_history
GROUP BY EMPLOYEE_ID
SET OPERATORI:
1.
FROM employees
INTERSECT
FROM job_history;
2.
FROM employees
UNION
FROM job_history;
3.
FROM employees
UNION ALL
FROM job_history;
4.
FROM employees
INTERSECT
FROM job_history;
5.
FROM employees
INTERSECT
FROM job_history;
6.
SELECT employee_id
FROM employees
where department_id = 80
MINUS
SELECT employee_id
FROM job_history;
7.
FROM employees
WHERE department_id = 10
UNION ALL
FROM employees
WHERE department_id = 80
UNION ALL
FROM employees
8.
SELECT department_id
FROM departments
MINUS
SELECT department_id
FROM employees
9.
FROM employees
UNION
FROM job_history;
DML:
1.
COMMIT;
3.
SELECT *
FROM my_employee;
4.
UPDATE my_employee
WHERE id = 3;
5.
UPDATE my_employee
6.
SELECT *
FROM my_employee;
7.
ROLLBACK;
SELECT *
FROM my_employee;
8.
DELETE
FROM my_employee
9.
DELETE
FROM my_employee;
7.
FROM employees
8.
FROM employees
9.
10.
SELECT *
FROM my_employee