Kolokwium Bazy danych 1 – Jackowski
GRUPA A
Zasady
1. Jako odpowiedzi podajemy polecenia SQL realizujące zadanie zawarte w pytaniu
2. Polecenia SQL należy sformatować zgodnie z załączonym przykładem
SELECT
e
.
employee_id
,
id_pracownika
FROM
employees e
JOIN
--tabela ON
--warunki złączenia
WHERE
--warunek 1 AND
--warunek 2
3. Poprawna odpowiedź będzie oceniana punktowo
a) 2 punkty – odpowiedź poprawna, sformatowana zgodnie ze wzorcem
b) 1 punkt – odpowiedź poprawna, sformatowana niezgodnie ze wzorcem
c) 0 – brak odpowiedzi
d) -1 – odpowiedź z błędem
Pytania
1. Wyświetl dane wszystkich pracowników (imię, nazwisko, wynagrodzenie) oraz propozycję premii w
wysokości 15% wynagrodzenia zasadniczego. Posortuj listę w kolejności malejącej wg wartości
zaproponowanej premii.
SELECT
first_name AS imie, last_name AS nazwisko, salary AS wynagrodzenie, (salary*0.15) AS propozycja_premii
ORDER BY
(salary*0.15) desc
2. Wyświetl listę pracowników (imię, nazwisko), którzy nie mają kierownika (manager_id).
SELECT
first_name, last_name
FROM
employees
WHERE
manager_id IS NULL
3. Wyświetl listę pracowników (imię, nazwisko, wynagrodzenie zasadnicze, współczynnik premii
COMMISION_PCT) oraz dodatkowo wartość wynagrodzenie + wynagrodzenie *premia. Uwaga, w
przypadku braku premii ostatnia kolumna powinna zawierać wartość samego wynagrodzenia.
SELECT
first_name, last_name, salary, commision_pct, NVL(salary + salary*commision_pct, salary)
FROM
employees
4. Wyświetl listę pracowników (imię, nazwisko) oraz informację czy pracownik posiada kierownika (możliwe
dwie wartości TAK lub NIE)
SELECT
first_name, last_name, DECODE(manager_id, NULL, 'NIE', 'TAK')
FROM
employees
5. Wyświetl id managera oraz średnie zarobki jego pracowników
SELECT
manager_id, AVG(salary)
FROM
employees
WHERE
manager_id IS NOT NULL
GROUP BY
manager_id
6. Wyświetl id działu oraz informację o średnim wynagrodzeniu (zaokrąglić do dwóch miejsc po przecinku) na
poszczególnych stanowiskach w tych działach. Posortować wg id departamentu oraz kodu stanowiska pracy
SELECT
department_id, job_id, ROUND(AVG(salary), 2)
FROM
employees
GROUP BY
department_id, job_id
ORDER BY
department_id, job_id
7. Wyświetl listę pracowników (imiona, nazwiska) wraz z krajem, w których znajduje się departament, w którym
są zatrudnieni
SELECT
e.first_name, e.last_name, c.country_name
FROM
employees e, departments d, locations l, countries c
WHERE
e.department_id = d.department_id AND
d.location_id = l.location_id AND
l.country_id = c.country_id
8. Wyświetl listę departamentów (pełne nazwy) wraz z ilością pracowników w nich zatrudnionych
SELECT
d.department_name, count(e.employee_id)
FROM
employees e, departments d
WHERE
e.department_id = d.department_id
GROUP BY
d.department_name
9. Wyświetl imiona, nazwiska oraz wynagrodzenia pracowników zarabiających mniej niż 'Davies'
SELECT
e.first_name, e.last_name, e.salary
FROM
employees e
WHERE
e.salary < (SELECT e2.salary FROM employees e2 WHERE e2.last_name LIKE 'Davies')
10. Wyświetl imiona, nazwiska oraz nazwy departamentów pracy pracowników na takim samym stanowisku co
pracownik o numerze 141
SELECT
e.first_name, e.last_name, d.department_name, e.job_id
FROM
employees e, departments d
WHERE
e.department_id = d.department_id AND
e.job_id = (SELECT e2.job_id FROM employees e2 WHERE e2.employee_id = 141)
11. Wyświetl listę pracowników (imię, nazwisko, nazwę regionu) pracowników zatrudnionych w dowolnym
departamencie, który znajduje się w lokalizacji o id = 1700
SELECT
e.first_name, e.last_name, r.region_name
FROM
employees e, departments d, locations l, countries c, regions r
WHERE
e.department_id = d.department_id AND
d.location_id = l.location_id AND
l.country_id = c.country_id AND
c.region_id = r.region_id AND
d.location_id = 1700
12. Wyświetl nazwiska pracowników oraz wynagrodzenia pracowników, których managerem jest 'King'
SELECT
e.last_name, e.salary
FROM
employees e
WHERE
e.manager_id IN (SELECT e2.employee_id FROM employees e2 WHERE e2.last_name LIKE 'King')
GRUPA B
Zasady
1. Jako odpowiedzi podajemy polecenia SQL realizujące zadanie zawarte w pytaniu
2. Polecenia SQL należy sformatować zgodnie z załączonym przykładem
SELECT
e
.
employee_id
,
id_pracownika
FROM
employees e
JOIN
--tabela ON
--warunki złączenia
WHERE
--warunek 1 AND
--warunek 2
3. Poprawna odpowiedź będzie oceniana punktowo
a) 2 punkty – odpowiedź poprawna, sformatowana zgodnie ze wzorcem
b) 1 punkt – odpowiedź poprawna, sformatowana niezgodnie ze wzorcem
c) 0 – brak odpowiedzi
d) -1 – odpowiedź z błędem
Pytania
1. Wyświetl listę pracowników (imię, nazwisko, wynagrodzenie) zatrudnionych w 1987 roku oraz zarabiających
poniżej 10000 oraz dodatkowo wszystkich zatrudnionych po roku 1993
SELECT
firs_name, last_name, salary
FROM
employees
WHERE
(hire_date BETWEEN '87/01/01' AND '87/12/31' AND salary < 10000) OR TO_CHAR(hire_date, 'YYYY')
> '1993'
2. Wyświetl pracowników (imię, nazwisko) oraz informacje o tym czy wynagrodzenie pracownika przekracza
6000 (możliwe dwie wartości TAK lub NIE)
SELECT
first_name, last_name, DECODE(salary > 6000, 'TAK', 'NIE')
FROM
employees
3. Wyświetl id działu oraz informacje o średnim wynagrodzeniu (zaokrąglić do dwóch miejsc po przecinku) na
poszczególnych stanowiskach w tych działach. Posortować wg id departamentu oraz kodu stanowiska pracy
SELECT
department_id, job_id, ROUND(AVG(salary), 2)
FROM
employees
GROUP BY
department_id, job_id
ORDER BY
department_id, job_id
4. Wyświetl minimalne i maksymalne wynagrodzenie (zaokrąglić do dwóch miejsc po przecinku) jakie jest
uzyskiwane na poszczególnych stanowiskach pracy w różnych działach. Posortować wg stanowiska pracy, id
departamentów
SELECT
ROUND(MIN(salary)), ROUND(MAX(salary))
FROM
employees
WHERE
department_id IS NOT NULL
GROUP BY
department_id, job_id
ORDER BY
department_id, job_id
5. Wyświetl nazwiska pracowników zatrudnionych później niż Aleksander Humold
SELECT
e.last_name
FROM
employees e
WHERE
hire_date > (SELECT e2.hire_date FROM employees e2 WHERE e2.last_name LIKE 'Humold' AND
first_name LIKE 'Aleksander')
6. Wyświetl nazwiska pracowników zatrudnionych na tym samym stanowisku co David Austin
SELECT
e.last_name
FROM
employees e
WHERE
job_id = (SELECT e2.job_id FROM employees e2 WHERE e2.first_name LIKE 'David' AND e2.last_name
LIKE 'Austin')
7. Wyświetl listę pracowników (nazwiska) wraz z nazwiskami wszystkich pracowników pracujących na tym
samym stanowisku
SELECT
e.last_name, e2.last_name
FROM
employees e, employees e2
WHERE
e.job_id = e2.job_id
8. Wyświetl listę pracowników (imię, nazwisko, data zatrudnienia, miasto oraz pełna nazwa kraju) pracowników
pracujących w tym samym dziale co dowolny z pracowników, który w nazwisku lub imieniu posiada literę 'k'
SELECT
e.first_name, e.last_name, e.hire_date, l.city, c.country_name
FROM
employees e, departments d, locations l, countries c
WHERE
e.department_id = d.department_id AND
d.location_id = l.location_id AND
l.country_id = c.country_id AND
e.department_id = (SELECT e2.department_id FROM employees e2 WHERE e2.first_name LIKE '%k%'
OR e2.last_name LIKE '%k%')
9. Wyświetl imiona, nazwiska oraz wynagrodzenia pracowników zarabiających mniej niż Davies
SELECT
first_name, last_name, salary
FROM
employees
WHERE
salary < (SELECT salary FROM employees WHERE last_name LIKE 'Davies')
10. Wyświetl imiona i nazwiska pracowników zarabiających najmniej w kraju, w którym są zatrudnieni
SELECT
first_name, last_name, salary
FROM
employees
WHERE
salary IN (SELECT MIN(e.salary) FROM employees e, departments d, locations l, countries c WHERE
e.department_id = d.department_id AND d.location_id = l.location_id AND l.country_id = c.country_id
GROUP BY country_id)
11. Nadaj 15% premię wszystkich pracownikom nie posiadającym jeszcze premii (COMMISION_PCT) i którzy
pracują w Kanadzie
UPDATE
employees
SET
commision_pct = 0,15
WHERE
last_name IN(SELECT e.last_name FROM employees e, departments d, locations l, countries c WHERE
e.department_id = d.department_id AND d.location_id = l.location_id AND l.country_id = c.country_id AND
e.comission_pct IS NULL AND c.country_name LIKE 'Canada')
12. Zrównaj wynagrodzenia wszystkich pracowników zatrudnionych w 'Seattle' na stanowisku 'IT_PROG' tak, by
wszyscy zarabiali najwyższe wynagrodzenie ze swojej grupy
UPDATE
employees
SET
salary = (SELECT MAX(e.salary) FROM employees e, departments d, locations l WHERE e.department_id
= d.department_id AND d.location_id = l.location_id AND e.job_id LIKE 'IT_PROG' AND c.city LIKE
'Seattle')
GRUPA C
Zasady
1. Jako odpowiedzi podajemy polecenia SQL realizujące zadanie zawarte w pytaniu
2. Polecenia SQL należy sformatować zgodnie z załączonym przykładem
SELECT
e
.
employee_id
,
id_pracownika
FROM
employees e
JOIN
--tabela ON
--warunki złączenia
WHERE
--warunek 1 AND
--warunek 2
3. Poprawna odpowiedź będzie oceniana punktowo
a) 2 punkty – odpowiedź poprawna, sformatowana zgodnie ze wzorcem
b) 1 punkt – odpowiedź poprawna, sformatowana niezgodnie ze wzorcem
c) 0 – brak odpowiedzi
d) -1 – odpowiedź z błędem
Pytania
1. Wyświetl listę pracowników (imię, nazwisko, id departamentu), którzy mają w nazwisku literę a lub k
(wielkość oraz położenie liter nie mają znaczenia)
SELECT
first_name, last_name, department_id
FROM
employees
WHERE
last_name LIKE '%a%' OR
last_name LIKE '%k%'
2. Wyświetl listę pracowników (imiona i nazwiska) oraz wynagrodzenie wyświetlane zawsze za pomocą 10
znaków. Brakujące cyfry powinny być zastąpione znakiem *. Przykład ******2400
SELECT
first_name, last_name, LPAD(salary, 10, '*')
FROM
employees
3. Wyświetl minimalne wynagrodzenie pracowników w firmie zaokrąglone w dół, do jednego złotego.
SELECT
FLOOR(MIN(salary))
FROM
employees
4. Wyświetl maksymalne wynagrodzenie pracowników w firmie zaokrąglone w górę, do jednego złotego.
SELECT
CEIL(MAX(salary))
FROM
employees
5. Wyświetl listę miast (pełne nazwy), w których mieszczą się oddziały firmy, wraz z ilością pracowników w nich
zatrudnionych.
SELECT
c.city, d.department_id, count(e.employee_id)
FROM
employees e, department d, locations l, countries c
WHERE
e.department_id = d.department_id AND
d.location_id = l.location_id AND
l.country_id = c.country_id
GROUP BY
c.city
6. Wyświetl średnie zarobki w departamentach (pełne nazwy) oraz na danych stanowiskach pracy (pełna nazwa).
Zarobki zaokrąglić w dół do jednego złotego. Wyniki posortować zgodnie z wysokością średnich
wynagrodzeń.
SELECT
d.department_name, e.job_id, AVG(e.salary)
FROM
employees e, departments d
WHERE
e.department_id = d.department_id
GROUP BY
e.department_id, e.job_id
ORDER BY
AVG(e.salary)
7. Wyświetl listę pracowników (nazwiska) wraz z nazwiskami wszystkich pracowników pracujących w tym
samym dziale.
SELECT
e.last_name, e2.last_name
FROM
employees e, employees e2
WHERE
e.department_id = e2.department_id
8. Wyświetl listę pracowników (imię, nazwisko, data zatrudnienia) pracowników pracujących w tym samym
dziale co pracownik o nazwisku Davies.
SELECT
e.first_name, e.last_name, e.hire_date
FROM
employees e
WHERE
e.department_id = (SELECT e2.department_id FROM employees e2 WHERE e2.last_name LIKE 'Davies')
9. Wyświetl nazwiska pracowników oraz wynagrodzenia pracowników, których managerem jest „King”
SELECT
e.last_name, e.salary
FROM
employees e
WHERE
e.manager_id IN (SELECT e2.employee_id FROM employees e2 WHERE e2.last_name LIKE 'King')
10. Wyświetl listę pracowników (imiona, nazwiska, nazwa departamentu, wynagrodzenie wraz z premią), których
wynagrodzenia wraz z premią przekraczają średnie wynagrodzenie wraz z premią w dziale, w którym
pracownik jest zatrudniony.
SELECT
e.first_name, e.last_name, d.department_name, (e.salary + (e.salary*e.comission_pct))
FROM
employees e, departments d
WHERE
e.department_id = d.department_id AND
(e.salary + (e.salary*e.comission_pct)) > (SELECT AVG(e2.salary + (e2.salary*e2.commision_pct)) FROM
employees e2 WHERE e.department_id = e2.department_id)
11. Zwiększ o 10% wynagrodzenia pracowników pracujących w mieście 'Southlake'
UPDATE
employees
SET
salary = 1.1*salary
WHERE
last_name IN (SELECT e.last_name FROM employees e, departments d, locations l WHERE
e.department_id = d.department_id AND d.location_id = l.location_id AND c.city LIKE 'Southlake')
12. Zrównaj wynagrodzenia wszystkich pracowników zatrudnionych w 'Seattle' na stanowisku 'IT_PROG' tak, aby
wszyscy zarabiali najwyższe wynagrodzenie ze swojej grupy.
UPDATE
employees
SET
salary = (SELECT MAX(e.salary) FROM employees e, departments d, locations l WHERE e.department_id
= d.department_id AND d.location_id = l.location_id AND c.city LIKE 'Seattle' AND e.job_id LIKE
'IT_PROG')
Rozwiązania list:
Podstawy
1. Wyświetl listę pracowników (imię, nazwisko, datę zatrudnienia) sortując zgodnie z nazwiskiem i imieniem
SELECT
first_name
AS
imie
,
last_name
AS
nazwisko
,
hire_date
AS
zatrudniony
FROM
employees
ORDER
BY
last_name
ASC
,
first_name
ASC
2. Wyświetl listę pracowników (id, imię, nazwisko, wynagrodzenie) wraz z wynagrodzeniem powiększonym o
15% premię.
SELECT
employee_id
AS
id
,
first_name
AS
imie
,
last_name
AS
nazwisko
,
salary
*
1
.
15
AS
wynagrodzenie_z_premia
FROM
employees
3. Wyświetl imiona i nazwiska pracowników z pierwszą dużą literą oraz wszystkimi pozostałymi małymi (np. Jan
Nowak)
SELECT
initcap
(
first_name
)
AS
imie
,
initcap
(
last_name
)
AS
nazwisko
FROM
employees
4. Wyświetl listę nazwisk pracowników z kolumną zawierającą ilość liter w nazwisku
SELECT
last_name
AS
nazwisko
,
length
(
last_name
)
AS
dlugosc_nazwiska
FROM
employees
5. Wyświetl imię, nazwisko oraz datę zatrudnienia pracownika oraz nazwę dnia tygodnia, w którym został
zatrudniony
SELECT
first_name
AS
imie
,
last_name
AS
nazwisko
,
hire_date
AS
zatrudniony
,
to_char
(
hire_date
,
'DAY'
)
AS
w_dniu
FROM
employees
6. Wyświetl nazwiska, imiona oraz pensję pracowników zarabiających powyżej 12000
SELECT
last_name
AS
nazwisko
,
first_name
AS
imie
,
salary
AS
wynagrodzenie
FROM
employees
WHERE
salary
>
12000
7. Podaj numer departamentu, w którym pracują pracownicy, których nazwiska zaczynają się od litery S
SELECT
distinct
department_id
AS
id_departamentu
FROM
employees
WHERE
last_name
LIKE
'S%'
8. Wyświetl listę pracowników zatrudnionych w trzecim kwartale 1998 roku lub w roku 1993
SELECT
first_name
AS
imie
,
last_name
AS
nazwisko
,
to_czar
(
hire_date
,
'RR.MM.DD'
)
as
ZATRUDNIONY
FROM
employees
WHERE
hire_date
BETWEEN
'93/00/01'
AND
'98/12/31'
OR
hire_date
BETWEEN
'93/01/01'
AND
'93/12/31'
9. Wyświetl listę pracowników tak, by wszystkie informacje (imię, nazwisko, data zatrudnienia oraz id
stanowiska) były umieszczone w jednej kolumnie (poszczególne elementy powinny zostać oddzielone
przecinkiem)
SELECT
(
first_name
||
','
||
last_name
||
','
||
hire_date
||
','
||
employee_id
)
AS
lista
FROM
employees
10. Wyświetl listę pracowników, którzy zostali zatrudnieni w 1987 roku i zarabiali powyżej 5000 lub takich,
którzy zostali zatrudnieni po roku 1993 i zarabiali powyżej 10000
SELECT
last_name
AS
nazwisko
,
hire_date
AS
zatrudniony
,
salary
AS
wynagrodzenie
FROM
employees
WHERE
hire_date
BETWEEN
'87/01/01'
AND
'87/12/31'
AND
salary
>
5000
)
OR
(
hire_date
>
'93/12/31'
AND
salary
>
10000
)
11. Wyświetl pracowników, którzy nie mają kierownika
SELECT
last_name AS nazwisko, manager_id AS manager
FROM
employees
WHERE
manager_id IS NULL
12. Wyświetl pracowników, którzy mają w nazwisku literę a lub e
SELECT
first_name AS imie, last_name AS nazwisko
FROM
employees
WHERE (lower(first_name) LIKE '%a%') OR (lower(last_name) LIKE '%e%')
13. Wyświetl pracowników, którzy otrzymują premie (COMMISSION_ PCT ), wraz z pensją, wysokością premii
(w PLN) oraz wynagrodzeniem całkowitym (pensja + premia)
SELECT
first_name AS imie, last_name AS nazwisko, salary AS wynagrodzenie, comission_pct*salary AS premia,
salary + (comission_pct*salary) AS w _sumie
FROM
employees
WHERE
commision_pct IS NOT NULL
14. Zmień zadanie powyższe tak, by przedstawić listę wszystkich pracowników. Dla tych, którzy nie otrzymują
premii, wartość w ostatnim polu powinna być równa pensji zasadniczej
SELECT
first_name AS imie, last_name AS nazwisko, salary AS wynagrodzenie, nvl(comission_pct*salary, 0) AS
premia, nvl(salary + (comission_pct*salary), salary) AS w _sumie
FROM
employees
WHERE
commision_pct IS NOT NULL
Funkcje agregujące
1. Wyświetl ilość pracowników firmy zatrudnionych po roku 1997.
SELECT
count(employee_id), hire_date
FROM
employees
WHERE
hire_date > '97/12/31'
2. Wyświetl ilość pracowników zatrudnionych w departamencie 50
SELECT
count(employee_id), department_id
FROM
employees
WHERE
department_id = 50
3. Wyświetl maksymalne i minimalne wynagrodzenie wszystkich pracowników w firmie.
SELECT
MIN(salary), MAX(salary)
FROM
employees
4. Podaj liczbę pracowników nie posiadających managera
SELECT
count(employee_id)
FROM
employees
WHERE
manager_id IS NULL
5. Wyświetl ilość pracowników oraz średnie wynagrodzenie w każdym z działów (średnie wynagrodzenie
powinno zostać podane z dokładnością do 2 miejsc po przecinku)
SELECT
department_id, count(employee_id), ROUND(AVG(salary),2)
FROM
employees
GROUP BY
department_id
6. Pokaż liczbę departamentów zatrudniających powyżej 5 osób
SELECT
count(department_id)
FROM
employees
HAVING
count(employee_id) > 5
7. Wyświetl następujące informacje odnośnie zarobków uzyskiwanych na poszczególnych stanowiskach
a) Minimalne wynagrodzenie zaokrąglone w dół do jednego dolara
SELECT
FLOOR(MIN(salary))
FROM
employees
GROUP BY
job_id
b) Średnie wynagrodzenie zaokrąglone do jednego dolara
SELECT
ROUND(AVG(salary))
FROM
employees
GROUP BY
job_id
c) Maksymalne wynagrodzenie zaokrąglone w górę do jednego dolara
SELECT
CEIL(MAX(salary))
FROM
employees
GROUP BY
job_id
8. Wyświetl ilość osób pełniących funkcję managera
SELECT
count(manager_id)
FROM
employees
WHERE
manager_id IS NOT NULL
GROUP BY
manager_id
9. Wyświetl różnicę w minimalnych i maksymalnych zarobkach w firmie
SELECT
MAX(salary) – MIN(salary) AS roznica
FROM
employees
10. Wyświetl id managera oraz minimalne zarobki osiągane przez któregokolwiek z jego pracowników. W
zestawieniu należy usunąć osoby nie posiadające kierownika.
SELECT
manager_id, MIN(salary)
FROM
employees
WHERE
manager_id IS NOT NULL
GROUP BY
manager_id
11. Wyświetl średnie zarobki pracowników na poszczególnych stanowiskach. Z zestawienia usuń osoby
zarabiające poniżej 6000.
SELECT
AVG(salary), job_id
FROM
employees
WHERE
salary > 6000
GROUP BY
job_id
12. Wyświetl minimalne zarobki pracowników w poszczególnych działach. Z zestawienia usuń działy, w których
wynagrodzenie maksymalne przekracza 10000.
SELECT
MIN(salary), department_id
FROM
employees
HAVING
MAX(salary) < 10000
GROUP BY
department_id
13. Wyświetl maksymalne średnie wynagrodzenie z wszystkich działów.
SELECT
MAX(AVG(salary))
FROM
employees
GROUP BY
department_id
14. Wyświetl średnie zarobki osiągane przez pracowników na poszczególnych stanowiskach w poszczególnych
latach. Posortuj latami i stanowiskami
SELECT
AVG(salary), TO_CHAR(hire_date, 'YYYY'), job_id
FROM
employees
GROUP BY
hire_date, job_id
ORDER BY
hire_date, job_id
15. Wyświetl listę pracowników zatrudnionych w poszczególnych latach (1995, 1996, 1997, 1998) Uwaga: ilość
zatrudnionych w poszczególnych latach powinna zostać podana w kolumnach a nie wierszach.
SELECT
SUM(SUM(DECODE(TO_CHAR(hire_date,'YYYY'),1995, 1,0))) AS zatrudniony_w_1995,
SUM(SUM(DECODE(TO_CHAR(hire_date,'YYYY'),1996, 1,0))) AS zatrudniony_w_1996,
SUM(SUM(DECODE(TO_CHAR(hire_date,'YYYY'),1997, 1,0))) AS zatrudniony_w_1997,
SUM(SUM(DECODE(TO_CHAR(hire_date,'YYYY'),1998, 1,0))) AS zatrudniony_w_1998,
FROM
employees
GROUP BY
TO_CHAR(hire_date,'YYYY')
Złączenia
1. Wyświetl listę przedstawicieli handlowych (Sales Representative) wraz z nazwami departamentów, w których
pracują.
SELECT
first_name, last_name, department_name
FROM
employees e, departments d
WHERE
e.department_id = d.department_id AND e.job_id = 'SA_REP'
2. Wyświetl ilość departamentów (pełna nazwa) w każdym z krajów
SELECT
country_name, count(department_name)
FROM
departments d, locations l, countries c
WHERE d.location_id = l.location_id AND l.country_id = c.country_id
GROUP BY
country_name
3. Wyświetl informacje o historii zatrudnienia zawierającą: imię i nazwisko pracownika, data zatrudnienia i
zwolnienia na danym stanowisku, stanowiska (pełna nazwa).
SELECT
e.first_name, e.last_name, j.start_date, j.end_date, jo.job_title
FROM
employees e, job_history j, jobs jo
WHERE e.employee_id = j.employee_id AND e.job_id = jo.job_id
4. Wyświetl pracowników (imię, nazwisko) oraz miasto oraz kraj (pełna nazwa) wszystkich pracowników
zatrudnionych w kraju, którego pełna nazwa zaczyna się na literę U
SELECT
e.first_name, e.last_name, c.country_name, l.city
FROM
employees e, departments d, locations l, countries c
WHERE
e.department_id = d.department_id AND d.location_id = l.location_id AND l.country_id = c.country_id
AND c.country_name LIKE 'U%'
5. Wyświetl tabelę z następującymi informacjami: imię i nazwisko pracownika, stanowisko pracy (pełna nazwa),
departament (pełna nazwa), miasto, kraj (pełna nazwa), region (pełna nazwa).
SELECT
e.first_name, e.last_name, jo.job_title, d.department_name, l.city, c.country_name, r.region_name
FROM
employees e, jobs jo, departments d, locations l, countries c, regions r
WHERE e.job_id = jo.job_id AND e.department_id = d.department_id AND d.location_id = l.location_id
AND l.country_id = c.country_id AND c.region_id = r.region_id
6. Wyświetl listę departamentów (nazwa) wraz z ilością pracowników w nich zatrudnionych
SELECT
d.department_name, count(e.employee_id)
FROM
employees e, departments d
WHERE
e.department_id = d.department_id
GROUP BY
department_name
7. Wyświetl listę pracowników (imiona i nazwiska) wraz z imieniem i nazwiskiem ich managera. Jeżeli
pracownik nie ma managera w miejscu jego imienia i nazwiska powinien się wyświetlić napis „brak"
SELECT
e.first_name, e.last_name, decode(e2.last_name, null, 'brak', e2.first_name || ' ' || e2.last_name)
FROM
employees e1 LEFT OUTER JOIN employees e2 ON e1.manager_id = e2.employee_id
8. Wyświetl średnie zarobki na każdym stanowisku pracy (stanowiska podane pełną nazwą)
SELECT
ROUND(AVG(e.salary)), jo.job_name
FROM
employees e, jobs jo
WHERE
e.job_id = jo.job_id
GROUP BY
job_name
9. Wyświetl najmniejsze i największe zarobki (zaokrąglone do dwóch miejsc po przecinku) w każdym kraju
(pełne nazwy)
SELECT
c.country_name, ROUND(MIN(e.salary), 2) ROUND(MAX(e.salary),2)
FROM
employees e, departments d, locations l, countries c
WHERE
e.department_id = d.department_id AND d.location_id = l.location_id AND l.country_id = c.country_id
GROUP BY c.country_name
10. Wyświetl następującą listę: lokalizacja (nazwa miasta), stanowisko pracy (pełna nazwa) ilość zatrudnionych
pracowników.
SELECT
l.city, jo.job_title, count(e.employee_id)
FROM
employees e, departments d, locations l, jobs jo
WHERE
e.job_id = jo.job_id AND e.department_id = d.department_id AND d.location_id = l.location_id
GROUP BY
city, job_title
11. Wyświetl imiona i nazwiska pracowników zatrudnionych później niż „Davies"
SELECT
e1.first_name, e1.last_name, e1.hire_date
FROM
employees e
WHERE
e1.hire_date > (SELECT e2.hire_date FROM employees e2 WHERE e2.last_name LIKE 'Davies')
12. Wyświetl parami wszystkich pracowników (podaj ich nazwiska) zatrudnionych w tym samym departamencie
wg. poniższego przykładu
SELECT
e1.department_id, e1.last_name, e2.last_name
FROM
employee e1, employee e2
WHERE
e1.department_id = e2.department_id AND e1.employee_id <> e2.department_id
ORDER BY e1.department_id
Podzapytania
1. Wyświetl listę pracowników (imię, nazwisko, data zatrudnienia) pracowników pracujących w tym samym
dziale co pracownik o nazwisku 'Davies'.
SELECT
first_name, last_name, hire_date
FROM
employees
WHERE department_id = (SELECT department_id FROM employees WHERE last_name = 'Davies')
2. Wyświetl listę pracowników (imię, nazwisko, pełna nazwa działu) pracowników, których wynagrodzenie
(salary) przekracza średnie wynagrodzenie wszystkich pracowników w firmie.
SELECT
e.first_name, e.last_name, d.department_name, e.salary
FROM
employees e, departments d
WHERE
e.department_id = d.department_id AND salary > (SELECT AVG(salary) FROM employees)
3. Wyświetl listę pracowników (imię, nazwisko, datę zatrudnienia, miasto oraz pełną nazwę kraju) pracowników
pracujących w tym samym dziale co dowolny z pracowników, który w nazwisku lub imieniu posiada liter ,,k".
SELECT
e.first_name, e.last_name, e.hire_date, c.country_name, c.city
FROM
employees e, departments d, locations l, countries c
WHERE
e.department_id = d.department_id AND d.location_id = l.location_id AND l.country_id = c.country_id AND
e.department_id IN (SELECT department_id FROM employees WHERE (first_name LIKE '%k%') OR
(last_name LIKE '%k%'))
4. Wyświetl listę pracowników (imię, nazwisko, nazwę regionu) pracowników zatrudnionych w dowolnym
departamencie, który znajduje się w lokalizacji o id=1700.
SELECT
e.first_name, e.last_name, r.region_name
FROM
employees e, departments d, locations l, coutries c, regions r
WHERE
e.department_id = d.department_id AND
d.location_id = l.location_id AND
l.country_id = c.country_id AND
c.region_id = r.region_id AND
d.department_id IN (SELECT d.department_id FROM departments d, locations l WHERE d.location_id =
l.location_id AND l.location_id = 1700)
--ostatni AND może być zapisany: d.location_id = 1700
5. Wyświetl nazwiska pracowników oraz ich wynagrodzenia pracowników, których managerem jest ,,King"
SELECT
last_name, salary
FROM
employees
WHERE
manager_id IN (SELECT employee_ID FROM employees WHERE last_name LIKE 'King')
6. Wyświetl nazwy departamentów, nazwiska i imiona pracowników zatrudnionych na stanowisku "Executive"
SELECT
d.department_name, e.last_name, e.first_name, jo.job_title
FROM
employees e, departments d
WHERE
e.department_id = d.department_id AND
e.job_id = jo,job_id AND
jo.job_title like 'Executive'
7. Wyświetl imiona, nazwiska oraz wynagrodzenia pracowników zarabiających mniej niż,,Davies"
SELECT
first_name, last_name, salary
FROM
employees
WHERE
salary < (SELECT salary FROM employees WHERE last_name LIKE 'Davies')
8. Wyświetl imiona, nazwiska oraz nazwy departamentów pracy pracowników na takim samym stanowisku co
pracownik o numerze 141
SELECT
e.first_name, e.last_name, d.department_name
FROM
employees e, departments d
WHERE
e.department_id = d.department_id AND
e.job_id = (SELECT job_id FROM employees WHERE employee_id = 141)
9. Wyświetl listę pracowników (imiona, nazwiska, nazwa departamentu, wynagrodzenie wraz z premią)
pracowników, których wynagrodzenia wraz z premią przekraczaj średnie wynagrodzenie wraz z premią w
dziale, w którym pracownik jest zatrudniony.
SELECT
e.first_name, e.last_name, d.department_name, e.salary + (e.salary*e.commision_pct)
FROM
employees e, departments d
WHERE
e.department_id = d.department_id AND
(e.salary + (e.salary*e.commision_pct) ) > (SELECT AVG(e2.salary + (e2.salary*e2.commision_pct)) FROM
employees e2 WHERE e.department_id = e2.department_id)
10. Wyświetl imiona i nazwiska pracowników zarabiających najmniej w kraju, w którym jest zatrudniony.
SELECT
first_name, last_name, salary
FROM
employees
WHERE
salary IN (SELECT MIN(e.salary) FROM employees e, departments d, locations l, countries c WHERE
e.department_id = d.department_id AND d.location_id = l.location_id AND l.country_id = c.country_id
GROUP BY country_id)
Podsumowanie