logo
Лабы базы Данных / Базы данных / Введение в модель данных SQL

Предикат between

SELECT DEPT_NO, MIN(EMP_SAL), MAX(EMP_SAL)

FROM EMP

WHERE DEPT_NO IS NOT NULL

GROUP BY DEPT_NO

HAVING AVG(EMP_SAL) BETWEEN

(SELECT AVG(EMP_SAL)

FROM EMP) AND 30000.00;

Пример 15.5. Найти номера отделов и минимальный и максимальный размер зарплаты сотрудников для отделов, в которых средний размер зарплаты сотрудников не меньше среднего размера зарплаты сотрудников во всей компании и не больше 30000 руб. (html,txt)

Еще раз приведем возможную формулировку этого запроса без использования разделов GROUP BY и HAVING (пример 15.5.1):

SELECT DISTINCT DEPT_NO, (SELECT MIN(EMP1.EMP_SAL)

FROM EMP EMP1

WHERE EMP1.DEPT_NO = EMP.DEPT_NO),

(SELECT MAX(EMP1.EMP_SAL)

FROM EMP EMP1

WHERE EMP1.DEPT_NO = EMP.DEPT_NO)

FROM EMP

WHERE (SELECT AVG(EMP1.EMP_SAL)

FROM EMP EMP1

WHERE EMP1.DEPT_NO = EMP.DEPT_NO) BETWEEN

(SELECT AVG(EMP_SAL)

FROM EMP) AND 30000.00;

Пример 15.5.1. (html,txt)

Как видно, отказ от использования раздела GROUP BY приводит к размножению однотипных подзапросов, в каждом из которых строится одна и та же группа строк, над которой вычисляется агрегатная функция.