Zadanie 25.
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;
Zadanie 26.
SELECT e.first_name, e.last_name, j.job_title
FROM employees e
JOIN jobs j ON e.job_id = j.job_id;
Zadanie 27.
SELECT e.first_name, e.last_name, d.department_name, l.city
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN locations l ON d.location_id = l.location_id;
Zadanie 28.
SELECT e.employee_id, e.first_name, e.last_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id
WHERE d.department_id IS NULL;
Zadanie 29.
SELECT d.department_name, e.first_name, e.last_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id
ORDER BY d.department_name;
Zadanie 30.
SELECT p.first_name || ' ' || p.last_name AS pracownik,
m.first_name || ' ' || m.last_name AS przelozone
FROM employees p
JOIN employees m ON p.manager_id = m.employee_id;
Zadanie 31.
SELECT job_id FROM employees
INTERSECT
SELECT job_id FROM job_history;
Zadanie 32.
SELECT employee_id, first_name, last_name, 'IT' AS zrodlo
FROM employees
WHERE department_id = 60
UNION ALL
SELECT employee_id, first_name, last_name, 'MANAGER'
FROM employees
WHERE manager_id = 100;
📝 Omówienie
INNER JOIN zwraca tylko pasujące wiersze z obu tabel. LEFT/RIGHT JOIN zachowuje wszystkie wiersze z jednej strony. Self-join pozwala łączyć tabelę ze sobą – niezbędne do modelowania hierarchii (pracownik–przełożony). UNION usuwa duplikaty, UNION ALL ich nie usuwa. INTERSECT zwraca tylko wartości wspólne. Liczba i typy kolumn w UNION/INTERSECT muszą być identyczne.
