Подзапрос «select min(salary),DEPARTMENT_ID from EMPLOYEE group by DEPARTMENT_ID» рассмотрим отдельно, так как здесь впервые в приводимых примерах использована опция «group by».
demo@10g> select min(salary),DEPARTMENT_ID
from EMPLOYEE
group by DEPARTMENT_ID ;
MIN(SALARY) DEPARTMENT_ID
----------- -------------
950 30
750 13
1800 14
800 20
750 23
1300 10
800 12
7 строк выбрано.
Казалось бы, добавить к перечню извлекаемых столбцов «last_name», и - нужный результат будет получен
ORA-00979: выражение не является выражением GROUP BY
Но получено сообщение об ошибке, так как если требуется выводить минимум значения зарплаты по сгруппированным строкам, в опции GROUP BY надо указывать все столбцы (кроме столбца salary, конечно, по которому ищется минимум), составляющие выводимые строки. Подкорректируем запрос с учетом полученной ошибки
Вот так! Фамилии-то в отделах разные, поэтому мы получили 32 группы строк по одной строке в каждой из них. Для одной строки минимум и выводится, совпадающий со значением зарплаты в этой строке. Изменим значение столбца «last_name», установив в нем одинаковое значение для всех 32-х строк
demo@10g> update employee set last_name='Иванов';
и повторим предыдущий запрос
select last_name, min(salary),DEPARTMENT_ID
from EMPLOYEE
group by DEPARTMENT_ID,last_name;
Вот теперь, так как фамилии в отделах одинаковые, запрос извлекает семь групп
одинаковых строк, «принадлежащих» каждая одному отделу. И уже внутри каждой из таких групп строк ищется min(salary).
!!!Вернем столбцу last_name в таблице EMPLOYEE прежние значения
demo@10g> rollback;
Q2_4 Получить перечень сотрудников отдела 14, получающих оклад больше минимального в отделе 12