О. А. Ткачев

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


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

комиссионных

      SELECT employee_id, first_name, last_name, department_id,

      commission_pct*salary as commission

      FROM Employees

      WHERE commission_pct IS NOT NULL

      ORDER BY commission DESC;

      Можно сортировать строки по столбцам, не указанным в предложении SELECT.

      Пример 2.38. Вывести данные о сотрудниках, которые работают в отделе 80, упорядочив их в порядке убывания рейтинга

      SELECT employee_id, first_name, last_name, department_id, salary

      FROM Employees

      WHERE department_id = 80

      ORDER BY rating_e;

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

      Пример 2.39. Вывести пять строк с данными о продажах товаров с максимальными суммами (запрос содержит ошибку)

      SELECT product_id, order_id, item_id, quantity, unit_price,

      quantity*unit_price

      FROM Order_Items

      WHERE ROWNUM <=5

      ORDER BY quantity*unit_price DESC;

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

      Пример 2.40. Вывести пять строк с данными о продажах товаров с максимальными суммами

      SELECT product_id, order_id, item_id, quantity, unit_price,

      quantity*unit_price

      FROM Order_Items

      ORDER BY quantity*unit_price DESC

      FETCH FIRST 5 ROWS ONLY;

      Этот запрос содержит строку FETCH FIRST 5 ROWS ONLY, которая выбирает первые пять строк после сортировки. Этот оператор появился в Oracle 12.

      Задачи для самостоятельного решения

      1. Вывести данные о товарах, у которых столбец rating_p имеет значение 3 или 4, а price <1000.

      2. Вывести first_name, last_name сотрудников, у которых first_name начинается на букву P и в last_name есть буква r.

      3. Вывести значения столбцов employee_id, department_id, first_name, last_name, job_id, salary, department_id сотрудников, у которых зарплата salary> 9000 и работают в одном из отделов: 50, 80, 100.

      4. Вывести содержимое столбца street_address в таблице Locations тех строк, у которых значение этого столбца начинается не с цифры.

      5. Вывести first_name, last_name, job_id и суммарную зарплату за год в следующем виде:

      Michael Hartstein занимает должность MK_MAN, и зарплата за год составляет 156 000.

      6. Вывести значения столбцов employee_id, department_id, first_name, last_name, department_id, job_id, salary, bonus для сотрудников, у которых зарплата salary <10 000. Вычисляемый столбец bonus содержит размер премии, которая вычисляется по формуле: Salary * (1 +0.1 * rating_e). Выводимые данные упорядочить по размеру премии.

      7. Вывести значения столбцов employee_id, department_id, first_name, last_name, job_id сотрудников, которые работают в отделах 50 или 80, но не являются менеджерами. Менеджерами являются те сотрудники, у которых столбец job_id содержит подстроку MAN.

      8. Вывести значения столбцов employee_id, department_id, first_name, last_name, job_id, salary сотрудников, у которых код