26_SQL. Klauzula HAVING

Klauzula HAVING dodatkowo doprecyzowuje wynik wyszukiwania klauzuli GROUP BY. 

SELECT

LOCATIONS.CITY,

ROUND(AVG(EMPLOYEES.SALARY)) AS Średnie_wynagrodzenie,

COUNT(EMPLOYEES.SALARY) AS Liczba_pracowników

FROM DEPARTMENTS, LOCATIONS, EMPLOYEES 

WHERE DEPARTMENTS.LOCATION_ID = LOCATIONS.LOCATION_ID AND EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID

GROUP BY LOCATIONS.CITY

HAVING ROUND(AVG(EMPLOYEES.SALARY)) > 6000;

Otrzymujemy tabelę wynikową:

Teraz sprawdźmy, który dział miał sumę wynagrodzeń niższą niż 5000.

SELECT

JOBS.JOB_ID,

JOBS.JOB_TITLE,

SUM(SALARY)

FROM EMPLOYEES,JOBS

WHERE jobs.job_id = EMPLOYEES.JOB_ID

GROUP BY JOBS.JOB_TITLE,JOBS.JOB_ID

HAVING MIN(salary) < 5000;

Otrzymujemy tabelę wynikową:

Teraz chcielibyśmy wiedzieć ile zarobił Wiceprezes ds. administracyjnych.

SELECT

JOBS.JOB_ID,

JOBS.JOB_TITLE,

SUM(SALARY)

FROM EMPLOYEES,JOBS

WHERE jobs.job_id = EMPLOYEES.JOB_ID

GROUP BY JOBS.JOB_TITLE,JOBS.JOB_ID

HAVING JOBS.JOB_ID = 'AD_VP';

Otrzymujemy tabelę wynikową:

 Klauzula HAVING służy do doprecyzowywania klauzul WHERE  i GROUP BY niejako „na szybko”. 

W powyższym zapytaniu klauzula HAVING może być pominięta.

SELECT

JOBS.JOB_ID,

JOBS.JOB_TITLE,

SUM(SALARY)

FROM EMPLOYEES,JOBS

WHERE jobs.job_id = EMPLOYEES.JOB_ID AND JOBS.JOB_ID = 'AD_VP'

GROUP BY JOBS.JOB_TITLE,JOBS.JOB_ID;