0% found this document useful (0 votes)
35 views

SQL 4

The document contains multiple SQL queries that are selecting, joining, filtering, grouping, and aggregating data from various tables in an employees database. The queries are retrieving employee data like names, titles, departments, locations, and calculating values like counts, sums, averages, rankings. Some queries are using window functions, CTEs, and hierarchical queries to analyze and summarize the employee data in different ways.

Uploaded by

Rafał Maniera
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
35 views

SQL 4

The document contains multiple SQL queries that are selecting, joining, filtering, grouping, and aggregating data from various tables in an employees database. The queries are retrieving employee data like names, titles, departments, locations, and calculating values like counts, sums, averages, rankings. Some queries are using window functions, CTEs, and hierarchical queries to analyze and summarize the employee data in different ways.

Uploaded by

Rafał Maniera
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 17

SELECT last_name,job_title,department_name,city,country_name,region_name

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 ;

SELECT count(employee_id) liczba_pracownikow,department_id


FROM employees
GROUP BY department_id;

SELECT count(employee_id) liczba_pracownikow,manager_id,department_id


FROM employees
GROUP BY manager_id,department_id;

SELECT count(employee_id) liczba_pracownikow,manager_id,department_id


FROM employees
WHERE manager_id=100
GROUP BY manager_id,department_id;

SELECT count(employee_id) liczba_pracownikow,manager_id,department_id


FROM employees
WHERE department_id=50
GROUP BY manager_id,department_id;

SELECT count(employee_id) liczba_pracownikow,manager_id,department_id


FROM employees
GROUP BY ROLLUP(manager_id,department_id)
ORDER BY manager_id ;

SELECT count(employee_id) liczba_pracownikow,manager_id,department_id


FROM employees
GROUP BY ROLLUP(department_id,manager_id)
ORDER BY department_id ;

SELECT count(employee_id) liczba_pracownikow,manager_id,department_id


FROM employees
GROUP BY CUBE(department_id,manager_id)
ORDER BY department_id ;

SELECT count(employee_id) liczba_pracownikow,manager_id,department_id,


grouping(manager_id) podsumowanie_dep,
grouping(department_id) podsumowanie_man
FROM employees
GROUP BY CUBE(department_id,manager_id)
ORDER BY department_id ;

SELECT extract(year from hire_date) rok,


to_char(hire_Date,'YYYY') ROK
FROM employees;

/*
Wyswietl liczbe pracownikow, rok zatrudnienia, nazwe departmantu.
Wyswietl podsumowania zarowno dla lat, jak i departamentow.
*/

SELECT count(employee_id),extract(year from hire_date) rok,department_name


FROM employees
JOIN departments using(department_id)
GROUP BY CUBE(extract(year from hire_date),department_name)
ORDER BY 2,3;

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 ;

SELECT sum(salary) suma_zarobkow,level


FROM employees
START WITH manager_id is null
CONNECT BY prior employee_id = manager_id
GROUP BY level
ORDER BY level ;

SELECT lpad(last_name,10,' ')


FROM employees;

SELECT lpad(' ',(level-1)*4)||last_name,first_name,employee_id,manager_id,level


FROM employees e
START WITH e.manager_id is null
CONNECT BY prior employee_id = e.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 sum(salary) suma, round(avg(salary)) srednia, level, city


FROM employees e
JOIN departments USING(department_id)
JOIN locations USING(location_id)
WHERE hire_date<to_Date('01-01-2007','dd-mm-yyyy')
START WITH e.manager_id is null
CONNECT BY prior employee_id = e.manager_id
GROUP BY level, city ;

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)-(SELECT sum(salary)


FROM employees
START WITH manager_id =102
CONNECT BY prior employee_id = manager_id )
FROM employees
GROUP BY 2 ;

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;

SELECT employee_id, salary,


(SELECT round(avg(salary)) FROM employees )
FROM employees;

SELECT employee_id, salary,


(SELECT round(avg(salary)) FROM employees )
FROM employees;

SELECT employee_id, salary,


(SELECT round(avg(salary)) FROM employees ) srednia ,
(SELECT sum(salary) FROM employees ) suma
FROM employees;

SELECT employee_id, salary,


round(avg(salary) over ()) srednia,
sum(salary) over () suma
FROM employees;

SELECT employee_id, salary,


(SELECT round(avg(salary)) FROM employees ) srednia_w_calej_firmie
FROM employees
WHERE department_id=60;

SELECT employee_id, salary,


round(avg(salary) over ()) srednia_w_dep60
FROM employees
WHERE department_id=60;

/*
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;

CREATE TABLE employees2 AS


SELECT *
FROM employees;

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

/*Napisz update, ktory da podwyzke o 1000 2 najwczesniej zatrudnionym pracownikom


z kazdego regionu */

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).
*/

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');

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);

SELECT count(employee_id) liczba_pracownikow,manager_id,department_id


FROM employees
GROUP BY CUBE(department_id,manager_id)
ORDER BY department_id ;

SELECT count(employee_id) liczba_pracownikow,manager_id,department_id


FROM employees
GROUP BY GROUPING SETS(department_id,manager_id)
ORDER BY department_id ;

SELECT count(employee_id) liczba_pracownikow,null manager_id,department_id


FROM employees
GROUP BY department_id
UNION ALL
SELECT count(employee_id) liczba_pracownikow,manager_id,null
FROM employees
GROUP BY manager_id;

SELECT count(employee_id) liczba_pracownikow,manager_id,department_id


FROM employees
GROUP BY GROUPING SETS(
(department_id,manager_id),
(department_id),
(manager_id),
()
)
ORDER BY department_id,manager_id;

CREATE TABLE test1(x NUMBER);

insert into test1 values (1);

SELECT * FROM test1;

COMMIT;

insert into test1 values (1);

SELECT * FROM test1;

ROLLBACK;

--create,alter,drop,truncate zawieraja commit

insert into test1 values (2);

CREATE TABLE test2(x NUMBER);

rollback;

insert into test1 values (3);

savepoint a;

insert into test1 values (4);

SELECT * FROM test1;

ROLLBACK TO a;

SELECT * FROM test1;

COMMIT;

SELECT * FROM employees2;

UPDATE hr.employees2
SET salary=salary+100;

ROLLBACK;
UPDATE departments
SET department_name='X';
COMMIT;

ROLLBACK;

SELECT * FROM departments;

SELECT *
FROM departments AS OF TIMESTAMP to_timestamp('11-09-2023 15:00:00','dd-mm-yyyy
hh24:mi:ss');

UPDATE departments zew


SET department_name = (
SELECT department_name
FROM departments AS OF TIMESTAMP to_timestamp('11-09-
2023 15:00:00','dd-mm-yyyy hh24:mi:ss')
WHERE department_id = zew.department_id
);

COMMIT;

/*
Zmien wszystkie nazy miast na 'xyz', nastepnie odtworz dane z przed zmiany
uzywajac as of timestamp
*/

create table countries1 as (select * from countries);

update countries1 set country_name = 'xys'

select * from countries1

commit;

UPDATE countries zew


SET country_name='Polska';

COMMIT;

SELECT *
FROM countries AS OF TIMESTAMP to_timestamp('11-09-2023 15:48:00','dd-mm-yyyy
hh24:mi:ss');

UPDATE countries zew


SET country_name = (
SELECT country_name
FROM countries AS OF TIMESTAMP to_timestamp('11-09-2023
15:48:00','dd-mm-yyyy hh24:mi:ss')
WHERE country_id = zew.country_id
);
SELECT *
FROM countries ;
COMMIT;

SELECT * FROM employees2;

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
);

INSERT INTO employees2


SELECT *
FROM employees2
AS OF TIMESTAMP sysdate -1/48
WHERE employee_id not in (
SELECT employee_id
FROM employees2
);
COMMIT;

--11g EP
--18c EX

DELETE employees2
WHERE department_id =60;

COMMIT;

ALTER TABLE employees2 ENABLE ROW MOVEMENT ;

FLASHBACK TABLE employees2 to timestamp sysdate -1/24;

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 xid, operation, start_scn,commit_scn, logon_user, undo_sql


FROM flashback_transaction_query
WHERE xid = HEXTORAW('0600030021000000');

SELECT *
FROM employees AS OF SCN '4120315';

UPDATE employees zew


SET salary = (
SELECT salary
FROM employees AS OF SCN '4120315'
WHERE employee_id = zew.employee_id
);

SELECT *
FROM employees;

COMMIT;

drop table test1;

SELECT *
FROM user_recyclebin;

FLASHBACK TABLE test1 TO BEFORE DROP;

SELECT * FROM test1;

DROP TABLE test1;

CREATE TABLE test1 AS SELECT * FROM employees;

DROP TABLE test1;

SELECT *
FROM user_recyclebin;

FLASHBACK TABLE "BIN$hitYCXr9Qn6TUdaQ/q5zdA==$0" TO BEFORE DROP;

SELECT * FROM test1;

FLASHBACK TABLE test1 TO BEFORE DROP RENAME TO test3;

SELECT * FROM test3;

DROP TABLE test1 PURGE;

DROP TABLE test2;

PURGE TABLE test2;

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.
*/

You might also like