Witam, Uczę się pisać zapytania SQL. Niestety nie mam za bardzo jak sprawdzić ich poprawność, gdyż baza danych ma za mało danych aby każde zapytanie coś zwracało, więc jakby ktoś miał czas i chęć na sprawdzenie, byłbym bardzo wdzięczny. Na wstępie informuję, że jestem raczej początkujący i wiele zapytań może być zrobione "na około", lub nieoptymalnie.

1.Wypisać sumę zarobków ludzi będących w tym samym departamencie, pod warunkiem, że
w tym departamencie pracuje przynajmniej jeden człowiek, którego zarobki są na
najwyższym poziomie i nie jest on kierownikiem (nie ma podwładnych).

SELECT p.nr_departamentu, SUM(p.pensja+NVL(p.premia,0)) FROM pracownik p
WHERE EXISTS(SELECT 1 FROM pracownik pp, poziom_zarobkow pzz
WHERE pp.pensja+NVL(pp.premia,0) BETWEEN pzz.dolna_granica AND pzz.gorna_granica
AND pzz.nr_przedzialu=5
AND pp.nr_departamentu=p.nr_departamentu AND pp.id_pracownika NOT IN
(SELECT ppp.id_kierownika FROM pracownik ppp WHERE ppp.id_kierownika IS NOT NULL))
GROUP BY p.nr_departamentu

2.Dla każdego stanowiska podać nazwę departamentu, w którym pracuje najwięcej ludzi,
którzy nie otrzymują premii na danym stanowisku.

SELECT p.stanowisko, 
(SELECT dd.nr_departamentu FROM departament dd, pracownik pp
WHERE dd.nr_departamentu=pp.nr_departamentu AND pp.stanowisko=p.stanowisko AND pp.premia is null
GROUP BY dd.nr_departamentu
HAVING COUNT(pp.id_pracownika)=ANY(SELECT COUNT(ppp.id_pracownika)FROM pracownik ppp
WHERE ppp.stanowisko=p.stanowisko AND ppp.nr_departamentu=pp.nr_departamentu)) AS DEP
FROM pracownik p
GROUP BY p.stanowisko

3.Wypisać nazwy stanowisk, na których pracuje tylko jeden człowiek o najniższym poziomie
zarobków oraz żaden pracownik na tym stanowisku nie bierze udziału w projektach.

SELECT p.stanowisko FROM pracownik p
WHERE EXISTS
(SELECT 1 FROM pracownik pp, poziom_zarobkow pzz
WHERE pp.stanowisko=p.stanowisko AND pp.pensja+NVL(pp.premia,0) BETWEEN pzz.dolna_granica AND pzz.gorna_granica AND
pzz.nr_przedzialu=1 AND NOT EXISTS
(SELECT 1 FROM zlecenie zzz WHERE zzz.id_pracownika=pp.id_pracownika)
GROUP BY pp.stanowisko
HAVING COUNT(pp.id_pracownika)>0 AND COUNT(pp.id_pracownika)<2)
GROUP BY p.stanowisko

4.Wypisać nazwiska osób oraz ich stanowiska, pod warunkiem, że w departamencie danej
osoby pracuje dodatkowo przynajmniej jedna osoba na tym samym stanowisku i nie jest
ona kierownikiem tej osoby.

SELECT p.nazwisko, p.stanowisko FROM pracownik p WHERE
EXISTS(SELECT pp.nr_departamentu FROM pracownik pp WHERE
pp.nr_departamentu=p.nr_departamentu AND pp.stanowisko=p.stanowisko
AND pp.id_pracownika!=p.id_pracownika AND p.id_kierownika!=pp.id_pracownika
GROUP BY pp.nr_departamentu
HAVING COUNT(pp.stanowisko)>0)

5.Wypisać nazwy projektów wraz z liczbą osób przy nich pracujących, pod warunkiem, że
przy danym projekcie nie pracuje żaden podwładny razem ze swoim kierownikiem.

SELECT z.nr_projektu, COUNT(z.id_pracownika) 
FROM zlecenie z
WHERE NOT EXISTS
    (SELECT 1 
    FROM pracownik pp, zlecenie zz
    WHERE pp.id_pracownika=zz.id_pracownika AND zz.nr_projektu=z.nr_projektu
    AND EXISTS
        (SELECT 1 
        FROM pracownik ppp 
        WHERE pp.id_pracownika=ppp.id_kierownika))

GROUP BY z.nr_projektu

6.Wypisać nazwy departamentów, w których pracują osoby na przynajmniej dwóch różnych
stanowiskach i żadna z osób pracujących w tym departamencie nie pracowała przy
projektach.

SELECT p.nr_departamentu 
FROM pracownik p
WHERE EXISTS
    (SELECT 1 
    FROM pracownik pp
    WHERE pp.id_pracownika NOT IN
        (SELECT DISTINCT zzz.id_pracownika FROM zlecenie zzz)
    AND pp.nr_departamentu=p.nr_departamentu
    GROUP BY pp.nr_departamentu
    HAVING COUNT(pp.stanowisko)>1)
GROUP BY p.nr_departamentu

Baza danych:
title