Zadanie 39.
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
Zadanie 40.
SELECT e.employee_id, e.first_name, e.last_name
FROM employees e
WHERE e.department_id IN (
SELECT d.department_id
FROM departments d
JOIN locations l ON d.location_id = l.location_id
WHERE l.city = 'London'
);
Zadanie 41.
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE e.salary = (SELECT MAX(salary) FROM employees);
Zadanie 42.
SELECT e.employee_id, e.last_name, e.salary,
(SELECT AVG(salary)
FROM employees e2
WHERE e2.department_id = e.department_id) AS srednia_dzialu
FROM employees e;
Zadanie 43.
SELECT d.department_name, sub.liczba
FROM departments d
JOIN (SELECT department_id, COUNT(*) AS liczba
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 5) sub
ON d.department_id = sub.department_id;
Zadanie 44.
SELECT e.employee_id, e.first_name, e.last_name
FROM employees e
WHERE EXISTS (
SELECT 1 FROM employees sub
WHERE sub.manager_id = e.employee_id
📝 Omówienie
Podzapytanie w WHERE jest najczęstszym zastosowaniem. Podzapytanie skalarne (w SELECT) musi zwracać dokładnie jedną wartość. Inline view (podzapytanie w FROM) traktowane jest jak tymczasowa tabela. EXISTS jest wydajniejszy niż IN przy dużych zbiorach danych – zatrzymuje skanowanie po znalezieniu pierwszego pasującego wiersza. Podzapytania skorelowane (odwołujące się do tabeli zewnętrznej) są wykonywane raz dla każdego wiersza zapytania zewnętrznego.
