Laboratorium 5
Podzapytania.
Napisz zapytanie SQL do bazy danych HR
, które spowoduje wyświetlenie:
- Nazwisk (
last_name
) oraz wypłat (salary
) pracowników, którzy zarabiają ponad 90% wypłaty pracownika o nazwiskuChen
(tabelaemployees
-> 42 rows, 2 columns) - Nazwisk (
last_name
), nazw działów (department_name
) oraz wypłat (salary
) pracowników, którzy zarabiają więcej, niż każdy pracownik działu ‘Marketing
’ (ALL
, tabeleemployees
orazdepartments
-> 5 rows, 3 columns). - Nazw działów (
department_name
) i ilości pracowników, w których pracuje więcej pracowników, niż w dziale ‘IT
’ (tabeleemployees
orazdepartments
-> 4 rows, 2 columns) - [*] Nazwisk managerów (
last_name
), ich wypłat oraz ilości pracowników, którzy są do nich przypisani (tabelaemployees
-> 18 rows, 3 columns) (podpowiedź: użyj podzapytania do stworzenia osobnej tabeli, w której są numery kierowników i ilości ich pracowników, którą łączymy z tabelą employees poprzez JOIN ON, a ilość pracowników z podzapytania do zapytania głównego przenosimy poprzez alias..) - [**] Nazwisk pracowników (
last_name
) oraz ich wypłat (salary
), którzy nie są kierownikami, a zarabiają więcej niż ich szefowie (tabelaemployees
-> 2 rows, 2 columns) UWAGA! Wykorzystując klauzulę “NOT IN” musimy zapewnić interpreter, że lista nie posiada pustych wartości, inaczej zapytanie nie wyświetli wyników! (np. poprzez dodanie warunku WHERE cośtam > 0 ;) )
##Przykłady
- Pozdapytanie - zapytanie SQL zawarte wewnątrz zapytania, poprzez umieszczenie go w nawiasach; wynik podzapytania może być wykorzystany jako tabela lub wartość pojedyncza, np. Wyświetl nazwiska pracowników o numerze większym, niż pracownik o nazwisku (
last_name
) Chen:
SELECT last_name FROM employees WHERE employee_id > (SELECT employee_id FROM employees WHERE last_name='Chen')
- Podzapytanie jako tabela - wynik podzapytania możemy wykorzystać jako tabelę, którą możemy połączyć z oryginalną tabelą w bazie danych, np. Wyświetl nazwy działów (
department_name
), ich numery (department_id
) oraz ilości pracowników, którzy w nich pracują (uwaga! COUNT(*) musi być używany jedynie z kolumną, która występuje wGROUP BY
! Nie możemy wyświetlać innych kolumn!):
SELECT department_name, department_id, "ilosc prac" FROM departments JOIN (SELECT department_id, COUNT(*) "ilosc prac" FROM employees GROUP BY department_id) USING(department_id)
- Klauzule
ALL
/ANY
- określają, że warunek muszą spełnić wszystkie wiersze (ALL
) lub co najmniej jeden wiersz (ANY
), np. Wyświetl nazwiska pracowników (last_name
) o numerach (employee_id
) większych, niż co najmniej jeden (ANY
) z pracowników działu (department_name
)IT
:
SELECT last_name FROM employees WHERE employee_id > ANY (SELECT employee_id FROM employees JOIN departments USING (department_id) WHERE department_name='IT')
- Ograniczenie
IN
- odnosi się do warunków, jeśli chcemy aby wartości w ograniczanej kolumnie znajdowały się wśród wartości będących wynikiem podzapytania, np. Wyświetl nazwiska pracowników (last_name
), których wypłata (salary
) jest taka sama, jak któregokolwiek pracownika działu (department_name
)IT
:
SELECT last_name FROM employees WHERE salary IN (SELECT salary FROM employees JOIN departments USING (department_id) WHERE department_name='IT')