О. А. Ткачев

Основы программирования в СУБД Oracle. SQL+PL/SQL.


Скачать книгу

использовать в предложении WHERE. Например, нельзя найти сотрудника с максимальной зарплатой, используя следующий запрос:

      Пример 4.6a. Найти сотрудника, получающего максимальную зарплату

      Внимание: ЭТОТ ЗАПРОС НЕ БУДЕТ ВЫПОЛНЕН!

      SELECT employee_id, salary

      FROM Employees

      WHERE salary = MAX (salary);

      Данную задачу можно решить следующим образом:

      Пример 4.6б. Найти сотрудника, получающего максимальную зарплату

      SELECT employee_id, salary AS maximum

      FROM Employees

      WHERE salary = (SELECT MAX (salary) FROM Employees);

      Данный запрос содержит в предложении WHERE подзапрос. Использование подзапросов будет рассмотрено позже.

      Группировка

      Чаще всего агрегатные функции используются в запросах с группировкой. В общем виде запрос с группировкой может быть представлен в следующем виде:

      SELECT {список столбцов*), {агрегатные функции}

      FROM {таблица}

      WHERE {условия}

      GROUP BY {список столбцов*}

      HAVING {условия на группу};

      Списки столбцов в предложениях SELECT и GROUP BY должны совпадать.

      Предложение GROUP BY разбивает данные на группы, и запрос выводит обобщенные данные о каждой группе.

      Рассмотрим примеры задач, для решения которых необходимо использовать группировку и агрегатные функции.

      Пример 4.7. Для каждого отдела определить суммарную зарплату

      SELECT department_id, SUM (salary) AS SUM_salary

      FROM Employees

      GROUP BY department_id

      ORDER BY department_id;

      Пример 4.8. Для каждого отдела определить суммарную зарплату с учетом комиссионных

      SELECT department_id, SUM (salary* (1+NVL (commission_pct,0)))

      As sum_sal

      FROM Employees

      GROUP BY department_id

      ORDER BY department_id;

      Пример 4.9. Для каждого отдела определить суммарную длину имен (столбца first_name)

      SELECT department_id, SUM (LENGTH (first_name)) As sum_f_nam

      FROM Employees

      GROUP BY department_id

      ORDER BY department_id;

      Группировка по нескольким столбцам

      В предложении GROUP BY можно указать несколько столбцов. В этом случае группу образуют строки с совпадающими значениями всех столбцов, по которым осуществляется группировка. Рассмотрим задачи, в которых требуется группировка по нескольким столбцам.

      Сначала рассмотрим запрос, который содержит типичную ошибку при решении задач, требующих группировки по нескольким столбцам.

      Пример 4.10а. Для каждого отдела определить должности и количество сотрудников, занимающих эту должность (содержит ошибку)

      SELECT department_id, job_id, count (*)

      FROM employees

      GROUP BY department_id;

      Причина ошибки: при наличии группировки предложение SELECT может содержать только столбцы, по которым осуществляется группировка и агрегатные функции.

      Пример 4.10б. Для отделов 30 и 50 определить должности и количество сотрудников, занимающих каждую должность

      SELECT department_id, job_id, count (*)

      FROM Employees

      WHERE department_id IN (30,50)

      GROUP