Здесь символ * означает «все столбцы».
2) Отображение конкретных столбцов таблицы
SELECT 〈 список_столбцов 〉
FROM 〈 имя_исх_таб 〉
В этом случае для элемента списка выбора применяется следующая конструкция:
〈 элемент_списка 〉 [ AS ] 〈 псевдоним 〉
Задание 2. Сделать выборку столбцов из таблицы EMPLOYEES с применением псевдонимов.
Если псевдоним содержит пробелы или специальные символы, то такой псевдоним нужно поместить в двойные кавычки.
Задание 3. Используя столбец SALARY в таблице EMPLOYEES (месячная зарплата сотрудника), вычислить годовой доход для каждого из них.
Задание 5. По данным из таблицы EMPLOYEES выдать неповторяющиеся значения JOB_ID.
Задание 4. При выборке данных из таблицы EMPLOYEES значения полей FIRST_NAME и LAST_NAME для каждого сотрудника поместить в один столбец с названием FULL_NAME.
В условие отбора могут входить простые операции сравнения: = , < , > , <= , >=, <> .
Задание 7. По таблице EMPLOYEES получить список сотрудников с низкой зарплатой (не более 2500$).
Задание 6. По данным из таблицы EMPLOYEES неповторяющиеся значения JOB_ID выдать только в пределах отдельного департамента.
Задание 10. По таблице EMPLOYEES получить список сотрудников в департаментах 20, 60 и 90.
Важно, что элементы списка сами могут быть списками (множествами) значений. Например:
SELECT department_id, last_name, salary
FROM employees
WHERE (department_id, salary)
IN ( (20, salary), (60, 4800), (90, 17000) );
SELECT last_name FROM employees
WHERE commission_pct=NULL
Задание 11. По таблице EMPLOYEES получить списки сотрудников:
для категории клерков (поле job_id содержит подстроку CLERK), у которых зарплата находится в диапазоне [2500$, 3000$];
которые приняты на работу с начала 1999 г. и не относятся к департаментам 50, 80, 100.
В языке SQL необходимо учитывать существенные особенности выполнения рассматриваемых логических операций.
Результаты выполнения операции AND
Язык SQL в СУБД Oracle располагает большим количеством встроенных (стандартных) функций.
Встроенная функция обычно имеет некоторое количество входных аргументов, с учетом которых она выдает результирующее значение.
5) Встроенные функции языка SQL
Функция SUBSTR ( 〈str〉, m [, n ]) – из исходной строки 〈str〉 выделяет подстроку длиной n символов, которая начинается с позиции m.
Задание 14. По таблице EMPLOYEES получить список сотрудников с указанием фамилии (last_name) и инициала – первая буквы имени (first_name) с точкой. При выводе сортировать список по убыванию длины фамилии, а фамилии одинаковой длины – по алфавиту.
Задание 15. По таблице EMPLOYEES получить список сотрудников, где указать фамилию и имя (last_name, first_name), текущий оклад (salary) и дату приема на работу (hire_date). Одновременно для каждого сотрудника определить стаж работы (в месяцах) и начислить бонус в размере 1% от оклада за каждый месяц работы. При выводе сортировать список по убыванию стажа работы.
Задание 16. С помощью числового формата (например, ‘999.9’) и аналогичного денежного формата (‘$999.99’) убрать лишние знаки при выводе стажа работы и бонуса в запросе из предыдущего задания.
Задание 17. По данным из таблицы EMPLOYEES посчитать зарплату сотрудников за текущий месяц с учетом commission_pct (комиссионная надбавка). Результат упорядочить по убыванию зарплаты.
Функция последовательно сравнивает значение 〈expr〉 со значениями 〈s_val1〉, 〈s_val2〉 и т.д.
При первом же совпадении дальнейшие сравнения прекращаются и функция возвратит значение 〈res〉 с соответствующим номером.
Задание 18. По таблице EMPLOYEES получить список сотрудников, где указать фамилию и имя, а также код должности (job_id). При этом в столбце job_id значения SA_REP и SA_MAN нужно заменить строками ‘Торговый представитель’ или ‘Менеджер по продажам’, соответственно. Для остальных значений job_id нужно выводить строку ‘Другое’.
В общем случае аргументом групповой функции является обычное выражение, которое будет вычисляться для каждой записи в группе.
SELECT 〈 список_столбцов 〉
FROM 〈 имя_исх_таб 〉
GROUP BY 〈 Ключи_группировки 〉
Важно: логика работы запросов с группировкой требует наличия жесткой связи между разделами SELECT и GROUP BY.
Задание 20. По таблице EMPLOYEES найти минимальный, максимальный и средний оклад (SALARY) для каждого департамента.
Группировка по нескольким ключам позволяет детализировать итоговые результаты.
Задание 21. Для каждого департамента сведения о минимальном, максимальном и среднем окладе требуется получить по отдельным должностям.
SELECT DEPARTMENT_ID, COUNT(*)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID
HAVING COUNT(*) > 5
7) Вложенные запросы (подзапросы)
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE SALARY >
( SELECT AVG (SALARY)
FROM EMPLOYEES )
Скалярный подзапрос может быть не только частью логического условия в разделе WHERE.
SELECT FIRST_NAME, LAST_NAME ,
FROM EMPLOYEES
WHERE SALARY >
( SELECT AVG (SALARY)
FROM EMPLOYEES )
SALARY / ( SELECT AVG(SALARY)
FROM EMPLOYEES ) Koeff
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE department_id IN
( SELECT department_id
FROM DEPARTMENTS
WHERE department_name
IN(‘Marketing’, ‘Sales’, ‘IT’) )
( SELECT department_id, MAX(salary) FROM EMPLOYEES
GROUP BY department_id )
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE ( department_id, salary ) IN
SELECT department_id, AVG(salary) avg_sal
FROM EMPLOYEES
GROUP BY department_id
HAVING AVG(salary) <
( SELECT AVG(salary)
FROM EMPLOYEES )
Любой подзапрос, в свою очередь, также может обращаться к вложенному подзапросу.
Следует отметить, что в рассмотренных примерах взаимодействие между вложенным подзапросом и запросом, который его охватывает, проходило по достаточно простой схеме – «снизу вверх».
Подзапрос такого типа называют простым, т.к. он самостоятельно отрабатывает всего один раз.
SELECT department_id, department_name
FROM DEPARTMENTS dps
WHERE 'US' =
( SELECT country_id
FROM LOCATIONS
WHERE location_id = dps.location_id )
Следовательно, подзапрос выполняется несколько раз при разных значениях этого параметра.
Подзапрос, обладающий такой особенностью, называют связанным (или коррелированным).
Пример. Сформировать перечень департаментов, в которых отсутствуют сотрудники.
Легко заметить, что здесь использован коррелированный подзапрос.
8) Многотабличные запросы с операцией JOIN
SELECT FIRST_NAME, LAST_NAME, JOB_TITLE
FROM EMPLOYEES E, JOBS J
WHERE E.JOB_ID = J.JOB_ID
Пример. По таблицам EMPLOYEES и JOBS получить общий список сотрудников с указанием полного названия должности сотрудника.
SELECT department_name d_name, last_name, first_name
FROM departments D, employees E
WHERE D.department_id = E.department_id (+)
ORDER BY d_name;
Как обычно, с помощью раздела GROUP BY можно произвести группировку результатов соединения таблиц.
Пример. По таблице EMPLOYEES получить список сотрудников с указанием для каждого из них фамилии его непосредственного начальника.
WHERE S.manager_id = B.employee_id
ORDER BY Boss;
Начиная с СУБД Oracle 9i и стандарта SQL:1992, стало возможным в разделе FROM оператора SELECT указывать операцию соединения явным образом в виде следующей конструкции:
〈left_tab〉 〈join_type〉 〈right_tab〉 ON 〈join_cond〉
Синтаксический элемент 〈join_type〉 может принимать следующие значения:
В данном случае имеет место эквисоединение, причем совпадение значений проверяется в столбцах с одинаковыми названиями.
По этой причине для раздела FROM годится более простая конструкция:
FROM departments JOIN locations
USING (location_id)
Во многих случаях операция JOIN исключает необходимость применения вложенных запросов.
Задание 31. Получить список сотрудников, которые относятся к службам Marketing, Sales и IT.
Задание 32. Получить список сотрудников департамента, для которого POSTAL_CODE=’26192’.
В конструкции ON 〈join_cond〉 можно указать соединение строк по произвольному условию с применением любых операций сравнения (<=, <>, LIKE, BETWEEN и др.).
Это позволяет реализовать так называемое Θ-соединение.
Самый простой вариант – это естественное соединение двух таблиц:
〈left_tab〉 〈 NATURAL JOIN 〉 〈right_tab〉
E.department_id = D.department _id AND E.manager_id = D.manager_id
Но при построении списка сотрудников по каждому департаменту нужна только левая часть этого условия.
Вторая часть условия вообще не отражает логику связей между таблицами departments и employees.
9) Работа с результатами нескольких запросов
query_1 〉
{ UNION | UNION ALL | INTERSECT | MINUS }
〈 query_2 〉
Пример. Выдать список руководящего персонала компании, включив в него руководителей департаментов и сотрудников, у которых есть подчиненные.
UNION
Задание 33. С помощью операции MINUS получить названия департаментов, в которых отсутствуют сотрудники.
Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть