SQL 5
SQL 5
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN locations l ON d.location_id = l.location_id
JOIN countries c ON l.country_id = c.country_id
JOIN regions r ON c.region_id = r.region_id
JOIN jobs j ON e.job_id = j.job_id;
SELECT last_name,job_title,department_name,city,country_name,region_name
FROM employees e
JOIN departments d using(department_id)
JOIN locations l using(location_id)
JOIN countries c using(country_id)
JOIN regions r using(region_id)
JOIN jobs j using(job_id);
SELECT last_name,department_name
FROM employees e
JOIN departments d using(department_id,manager_id);
SELECT last_name,department_name
FROM employees e
JOIN departments d using(department_id)
WHERE phone_number is not null ;
/*
Wyswietl liczbe pracownikow, rok zatrudnienia, nazwe departmantu.
Wyswietl podsumowania zarowno dla lat, jak i departamentow.
*/
SELECT *
FROM employees WHERE manager_id is null;
SELECT *
FROM employees WHERE manager_id=100;
SELECT *
FROM employees WHERE manager_id=101;
SELECT employee_id,first_name,last_name,manager_id,level
FROM employees
START WITH manager_id is null
CONNECT BY prior employee_id = manager_id ;
--10:25
SELECT employee_id,first_name,last_name,manager_id,level
FROM employees
WHERE level=4
START WITH manager_id is null
CONNECT BY prior employee_id = manager_id ;
/*
Wyswietl sume zarobkow,srednie zarobki, level, miasta.
Uwzglednij pracownikow zatrudnionych przed 01-01-2007.
*/
select to_Date('01-01-2007','dd-mm-yyyy') from dual;
SELECT *
FROM employees
WHERE salary>(
SELECT avg(salary)
FROM employees
WHERE level=3
START WITH manager_id is null
CONNECT BY prior employee_id = manager_id
);
SELECT *
FROM employees
WHERE manager_id=100;
SELECT employee_id,first_name,last_name,manager_id,level
FROM employees
START WITH employee_id =101
CONNECT BY prior employee_id = manager_id ;
SELECT employee_id,first_name,last_name,manager_id,level
FROM employees
START WITH manager_id=101
CONNECT BY prior employee_id = manager_id ;
/*
Wyswietl sume zarobkow w calej firmie.
Nie uwzglednij wszystkich podwladnych posrednich i bezposrednich Lex De Haan
*/
SELECT employee_id
FROM employees
START WITH manager_id =102
CONNECT BY prior employee_id = manager_id ;
SELECT sum(salary)
FROM employees
WHERE employee_id not in (
SELECT employee_id
FROM employees
START WITH manager_id =102
CONNECT BY prior employee_id = manager_id
);
select sum(salary)
from employees
start with manager_id is null
connect by prior employee_id = manager_id and manager_id <> 102
order by manager_id;
/*
Wyswielt numery pracownikow, imiona, nazwiska,zarobki,
sume zarobkow. Uwzglednij tylko pracownikow z panstwa United States of America.
*/
SELECT employee_id,first_name,last_name,salary,
sum(salary) over () suma
FROM employees
JOIN departments USING(department_id)
JOIN locations USING(location_id)
JOIN countries USING(country_id)
WHERE country_name='United States of America';
--11:49
WITH dane AS (
SELECT employee_id,department_id,salary,
round(avg(salary) over ()) srednia_w_firmie
FROM employees )
SELECT *
FROM dane
WHERE department_id=60;
SELECT employee_id,department_id,salary,
(SELECT avg(salary) FROM employees WHERE department_id =
zew.department_id ) srednia_w_dep
FROM employees zew
ORDER BY 2 ;
SELECT employee_id,department_id,salary,
avg(salary) over (partition by department_id) srednia_w_dep
FROM employees;
/*
Wyswietl numery pracownikow,miasto,maksymlane zarobki w miescie,
zarobki pracownika, roznice pomiedzy maksymlane zarobki w miescie,
a zarobkami pracownika
*/
WITH dane as (
SELECT employee_id,city,max(salary) over (partition by city)
maks_w_miescie,salary
FROM employees
JOIN departments USING(department_id)
JOIN locations USING(location_id)
)
SELECT employee_id,
city,
maks_w_miescie,
salary,
maks_w_miescie-salary
FROM dane;
SELECT employee_id,salary,
dense_rank() over (order by salary ) ranking_po_zarobkach
FROM employees;
SELECT employee_id,salary,
dense_rank() over (order by salary desc) ranking_po_zarobkach_malejaco
FROM employees;
SELECT employee_id,hire_date,
dense_rank() over (order by hire_date desc) ranking_po_datach_malejaco
FROM employees;
SELECT avg(salary),department_id,
dense_rank() over (order by avg(salary) desc) ranking_po_sredniej_malejaco
FROM employees
GROUP BY department_id ;
SELECT employee_id,salary,
rank() over (order by salary ) ranking_po_zarobkach
FROM employees;
/*
Wyswietl liczbe pracownikow, nazwy panstw, ranking po liczbie pracownikow malejaco.
*/
SELECT count(employee_id) liczba_pracownikow,
country_name,
dense_rank() over (order by count(employee_id) desc) ranking
FROM employees
JOIN departments USING(department_id)
JOIN locations USING(location_id)
JOIN countries USING(country_id)
GROUP BY country_name;
SELECT employee_id,salary,
row_number() over (order by salary ) ranking_po_zarobkach
FROM employees;
SELECT *
FROM (
SELECT employee_id,salary,
row_number() over (order by salary ) ranking_po_zarobkach
FROM employees
)
WHERE ranking_po_zarobkach<=10;
SELECT *
FROM (
SELECT employee_id,salary,
dense_rank() over (order by salary ) ranking_po_zarobkach
FROM employees
)
WHERE ranking_po_zarobkach<=3;
--row_number
--dense_rank
--rank
SELECT *
FROM (
SELECT employee_id,salary
FROM employees
ORDER BY salary
)
WHERE rownum<=10;
SELECT *
FROM (
SELECT employee_id,salary
FROM employees
ORDER BY salary
)
WHERE rownum<=20;
SELECT *
FROM (
SELECT employee_id,salary
FROM employees
ORDER BY salary
)
WHERE rownum between 20 and 30;
SELECT *
FROM (
SELECT employee_id,salary
FROM employees
ORDER BY salary
)
WHERE rownum>30;
SELECT *
FROM (
SELECT employee_id,salary,
row_number() over (order by salary ) ranking_po_zarobkach
FROM employees
)
WHERE ranking_po_zarobkach between 20 and 30;
/*
Wyswietl pracownikow o 4 najnizszych datach zatrudnienia z miasta Seattle
*/
SELECT *
FROM (
SELECT employee_id,
hire_date,
dense_rank() over (order by hire_date ) ranking
FROM employees
JOIN departments USING(department_id)
JOIN locations USING(location_id)
WHERE city='Seattle'
)
WHERE ranking<=4;
UPDATE employees2
SET salary = salary+100
WHERE employee_id=(
SELECT employee_id
FROM (
SELECT employee_id,salary,
row_number() over (order by salary ) ranking
FROM employees2
JOIN departments USING(department_id)
WHERE department_name='IT'
)
WHERE ranking=1
);
COMMIT;
SELECT employee_id,salary,department_id,
row_number() over (partition by department_id order by salary desc )
ranking_part_dep
FROM employees;
SELECT *
FROM (
SELECT employee_id,salary,department_id,
row_number() over (partition by department_id order by salary desc )
ranking_part_dep
FROM employees
)
WHERE ranking_part_dep=1;
--13:40
UPDATE employees2
SET salary = salary +1000
WHERE employee_id in (
SELECT employee_id
FROM (
SELECT employee_id,row_number() over (partition by region_name order by
hire_date) ranking
FROM employees2 e
JOIN departments d using(department_id)
JOIN locations l using(location_id)
JOIN countries c using(country_id)
JOIN regions r using(region_id)
)
WHERE ranking<=2
);
rollback;
SELECT employee_id,salary,
ratio_to_report(salary) over ()*100
FROM employees ;
SELECT employee_id,salary/(select sum(salary) from employees)
FROM employees ;
SELECT employee_id,salary,
round(ratio_to_report(salary) over ()*100,2)
FROM employees ;
SELECT employee_id,salary,
to_char(ratio_to_report(salary) over ()*100,'90.99')||'%'
FROM employees ;
SELECT employee_id,department_id,salary,
round(ratio_to_report(salary) over (partition by department_id)*100,2)
FROM employees ;
SELECT employee_id,salary,
lead(salary) over (order by salary desc ) oczko_nizej
FROM employees;
SELECT employee_id,salary,
lead(last_name) over (order by salary desc ) oczko_nizej
FROM employees;
SELECT employee_id,salary,
lead(salary,2) over (order by salary desc ) "2_oczka_nizej"
FROM employees;
SELECT employee_id,salary,
lag(salary) over (order by salary desc ) oczko_wyzej
FROM employees;
WITH dane AS
(
SELECT employee_id,salary,
lead(salary) over (order by salary desc ) oczko_nizej
FROM employees
)
SELECT employee_id,
salary,
oczko_nizej,
salary-oczko_nizej roznica
FROM dane;
WITH dane AS (
SELECT salary,lead(salary) over (order by salary desc) oczko_nizej
FROM (
SELECT distinct salary
FROM employees
)
)
SELECT salary,
oczko_nizej,
salary-oczko_nizej roznica
FROM dane;
/*
Wyswietl numery pracownikow, daty zatrudnienia, date zatrudnienia pracownika
zatrudnionego wczesniej,
liczbe dni pomiedzy tymi datami.
*/
with cte as (
SELECT
employee_id
,hire_date
,lag(hire_date) over (order by hire_date) hire_min_1
from employees
order by hire_date )
select
employee_id,
hire_date,
hire_min_1,
hire_date - hire_min_1 roznica
from cte;
with cte as (
SELECT
employee_id
,hire_date
,lead(hire_date) over (order by hire_date desc ) hire_min_1
from employees
)
select
employee_id,
hire_date,
hire_min_1,
hire_date - hire_min_1 roznica
from cte;
/***
Wyswietl dynamike zatrudnienai w calej firmie rok do roku.
(o ile mniej/wiecej zatrudniono pracownikow w stosunku do poprzedniego roku).
*/
WITH dane as (
SELECT to_char(hire_Date,'yyyy') year,
count(employee_id) count_this_year,
lag(count(employee_id)) over (order by
to_char(hire_Date,'yyyy')) count_last_year
FROM employees
GROUP BY to_char(hire_Date,'yyyy')
)
SELECT year,
count_this_year,
count_last_year,
count_this_year-count_last_year diff_year2year
FROM dane ;
SELECT employee_id,salary,
sum(salary) over (order by salary desc rows between 1 preceding and 1
following ) suma_kroczaca
FROM employees;
SELECT employee_id,salary,
sum(salary) over (order by salary desc rows between 1 preceding and current
row ) suma_kroczaca
FROM employees;
SELECT employee_id,salary,
sum(salary) over (order by salary desc rows between current row and 1
following ) suma_kroczaca
FROM employees;
SELECT employee_id,salary,
avg(salary) over (order by salary desc rows between 1 preceding and 1
following ) suma_kroczaca
FROM employees;
--15:00
SELECT employee_id,salary,
sum(salary) over (order by salary desc rows between unbounded preceding and
current row ) suma_kumulatywna
FROM employees;
SELECT employee_id,salary,
sum(salary) over (order by salary desc rows between current row and
unbounded following ) suma_kumulatywna
FROM employees;
SELECT employee_id,city,salary,
sum(salary) over (partition by city order by salary desc rows between
unbounded preceding and current row ) suma_kumulatywna
FROM employees
JOIN departments USING(department_id)
JOIN locations USING(location_id);
COMMIT;
ROLLBACK;
rollback;
savepoint a;
ROLLBACK TO a;
COMMIT;
UPDATE hr.employees2
SET salary=salary+100;
ROLLBACK;
UPDATE departments
SET department_name='X';
COMMIT;
ROLLBACK;
SELECT *
FROM departments AS OF TIMESTAMP to_timestamp('11-09-2023 15:00:00','dd-mm-yyyy
hh24:mi:ss');
COMMIT;
/*
Zmien wszystkie nazy miast na 'xyz', nastepnie odtworz dane z przed zmiany
uzywajac as of timestamp
*/
commit;
COMMIT;
SELECT *
FROM countries AS OF TIMESTAMP to_timestamp('11-09-2023 15:48:00','dd-mm-yyyy
hh24:mi:ss');
DELETE employees2
WHERE department_id =60;
COMMIT;
SELECT *
FROM employees2
AS OF TIMESTAMP sysdate -1/48;
SELECT *
FROM employees2
AS OF TIMESTAMP sysdate -1/48
MINUS
SELECT *
FROM employees2;
SELECT *
FROM employees2
AS OF TIMESTAMP sysdate -1/48
WHERE employee_id not in (
SELECT employee_id
FROM employees2
);
--11g EP
--18c EX
DELETE employees2
WHERE department_id =60;
COMMIT;
UPDATE employees
SET salary =1
WHERE employee_id =100;
commit;
UPDATE employees
SET salary =24000
WHERE employee_id =100;
commit;
UPDATE employees
SET salary =2
WHERE employee_id =100;
commit;
SELECT employee_id,salary,versions_starttime,versions_endtime
FROM employees
VERSIONS BETWEEN TIMESTAMP to_timestamp('12-09-2023 09:10:00','dd-mm-yyyy
hh24:mi:ss')
AND systimestamp
WHERE employee_id = 100;
SELECT *
FROM employees AS OF TIMESTAMP to_timestamp('12-09-2023 09:15:45','dd-mm-yyyy
hh24:mi:ss');
SELECT employee_id,salary,versions_starttime,versions_endtime,
versions_startscn,versions_endscn
FROM employees
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
WHERE employee_id = 100;
UPDATE employees
SET salary =3
WHERE employee_id =100;
commit;
UPDATE employees
SET salary =24000
WHERE employee_id =100;
commit;
UPDATE employees
SET salary =4
WHERE employee_id =100;
commit;
SELECT employee_id,salary,versions_starttime,versions_endtime,
versions_startscn,versions_endscn,versions_xid
FROM employees
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
WHERE employee_id = 100;
SELECT *
FROM employees AS OF SCN '4120315';
SELECT *
FROM employees;
COMMIT;
SELECT *
FROM user_recyclebin;
SELECT *
FROM user_recyclebin;
PURGE user_recyclebin;
SELECT *
FROM user_views;
/*
Utworz kopie tabeli departments.
Usun.
Utworz tabele o takiej samej nazwie jak 1, ale o innych kolumnach.
Usun.
Odzyskaj tabele, ktora zostala usunieta jako pierwsza.
Odzyskaj tabele, ktora zostala usunieta jako druga i zmien jej nazwe.
Ponownie usun obie tabele, ale tak aby nie trafily do kosza.
*/
--10:22
COMMIT;
DELETE regions2 ;
SELECT *
FROM user_views;
SELECT *
FROM all_views;
/*
Utworz widok ktory bedzie zawieral sume zarobkow, liczbe pracownikow, miasta.
Uwzglednij pracownikow zatrudnionych po 01-01-2002.
Uwzglednij rowniez miasta w ktorych nikt nie pracuje
*/
SELECT *
FROM employees
JOIN departments using(department_id);
SELECT last_name,department_name
FROM employees
JOIN departments using(department_id);
SELECT last_name,department_name
FROM employees LEFT JOIN departments using(department_id);
SELECT last_name,department_name
FROM employees RIGHT JOIN departments using(department_id);
SELECT *
FROM widok2;
SELECT *
FROM widok2;
SELECT *
FROM user_objects
WHERE status='INVALID';
SELECT *
FROM widok2;
SELECT *
FROM user_objects
WHERE status='INVALID';
UPDATE widok
SET salary = salary+1
WHERE employee_id=100;
SELECT *
FROM employees
WHERE employee_id=100;
ROLLBACK;
UPDATE EMPLOYEES
SET salary = 25000
WHERE employee_id=100;
COMMIT;
EXECUTE dbms_mview.refresh('zmat');
BEGIN
FOR x IN 1..15 LOOP
INSERT INTO big SELECT * FROM big;
commit;
END LOOP;
END;
/
SELECT *
FROM user_tab_statistics
WHERE table_name='BIG';
SELECT COUNT(*)
FROM BIG;
EXECUTE dbms_stats.gather_table_stats('HR','BIG');
SELECT sum(salary),department_name
FROM big
JOIN departments USING(department_id)
GROUP BY department_name;
SELECT *
FROM zmat2;
-- cost 3
--11:51
/*
Wyswietl srednie zarobki , roznice pomiedzy maxymalnymi, a minimalnymi zarobkami,
nazwe departamentu, nazwe regionu.
Sprawdz jaki jest koszt wykonania zapytania.
(employees,departments,locations,countries,regions)
Nastepnie napisz widok zmaterializowany ktory jest oparty o wyzej napisane
zapytanie
i sprawdz jaki jest koszt select na tym widoku.
*/
SELECT Regions2_region_id_seq.currval
FROM dual;
SELECT *
FROM user_sequences;
-- 12c
SELECT *
FROM user_sequences;
SELECT *
FROM regions3;
SELECT *
FROM regions5;
/*
Utworz kopie tabeli departments bez danych.
Utworz sekwencje ktora wystartuje od 10 i bedzie zwiekszala sie o 10.
Wstaw do tabeli kilka wierszy, kolumna department_id ma byc uzupelniana przez
sekwenecje.
*/