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.