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;


