- •ВВЕДЕНИЕ
- •1.2. Перенаправление стандартных ввода, вывода и ошибок
- •1.3. Создание цепочек и группирование команд
- •1.4. Основы сценариев командной строки
- •1.5. Операторы циклов в командной строке
- •Задания для самостоятельной работы
- •2.2. Использование оператора SELECT
- •Задания для самостоятельной работы
- •2.3. Разделы WHERE и ORDER BY оператора SELECT
- •Задания для самостоятельной работы
- •2.4. Использование однострочных функций
- •Задания для самостоятельной работы
- •2.5. Использование условных выражений
- •Задания для самостоятельной работы
- •2.6. Работа с функциями даты и времени
- •Задания для самостоятельной работы
- •2.7. Запросы из нескольких таблиц
- •Задания для самостоятельной работы
- •2.8. Агрегирующие функции, раздел GROUP BY
- •Задания для самостоятельной работы
- •2.9. Подзапросы
- •Задания для самостоятельной работы
- •2.10. Операция над множествами
- •Задания для самостоятельной работы
- •2.11. Вставка, модификация и удаление данных
- •Задания для самостоятельной работы
- •2.12. Транзакции
- •Задания для самостоятельной работы
- •2.13. DDL. Определение таблиц
- •Задания для самостоятельной работы
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
Задания для самостоятельной работы
1.Создайте запрос для вывода фамилии и даты найма каждого служащего, работающего
водном отделе с Zlotkey. Исключите Zlotkey из выходных данных.
2.Создайте запрос для вывода номеров и фамилий всех служащих, оклад которых выше среднего. Отсортируйте выходные данные в порядке увеличения окладов.
3.Создайте запрос для вывода номеров и фамилий всех служащих, работающих в одном отделе с любым служащим, фамилия которого содержит букву “u”.
4.Создайте запрос для вывода фамилии, номера отдела и должности каждого служащего, идентификатор местоположения отдела которого равен 1700.
5.Получите список фамилий и окладов всех служащих, подчиненных Кингу (King).
6.Получите номер отдела, фамилию и должность для каждого служащего, работающего
вадминистрации (department_name = 'Executive').
7.Создайте запрос для вывода фамилии, номера отдела и оклада всех служащих, чей номер отдела и оклад совпадают с номером отдела и окладом любого служащего, зарабатывающего комиссионные.
8.Выведите фамилию, название отдела и оклад всех служащих, чей оклад и комиссионные совпадают с окладом и комиссионными любого служащего, работающего в отделе, место-
положение которого — (location_ID) 1700.
9.Создайте запрос для вывода фамилии, даты найма и оклада всех служащих, которые получают такой же оклад и такие же комиссионные, как Kochhar.
10.Выведите фамилию, должность и оклад всех служащих, оклад которых превышает оклад каждого клерка торгового менеджера (JOB_ID = 'SA_MAN'). Отсортируйте результаты по убыванию окладов.
11.Выведите номера, фамилии и отделы служащих, живущих в городах, названия которых начинаются с буквы “T”.
12.Напишите запрос для нахождения всех сотрудников, которые зарабатывают больше среднего оклада по их отделу. Выведите фамилию, оклад, номер отдела и средний оклад по отделу. Отсортируйте результаты по средней зарплате. Используйте псевдонимы для выбираемых столбцов.
13.Найдите всех сотрудников, не являющихся руководителями.
14.Выведите фамилии сотрудников, зарабатывающих меньше среднего оклада по их отделу.
15.Выведите фамилии сотрудников, у которых есть коллеги по отделу, которые были приняты на работу позже, но имеют более высокий оклад.
16.Выведите номера, фамилии и наименования отделов всех сотрудников. Примечание: используйте скалярный подзапрос в команде SELECT для вывода наименований отделов.
2.10.Операция над множествами
ВSQL определены три операции над множествами (результатами запросов):
–A UNION B (объединение, возвращает результаты обоих запросов после устранения дубликатов).
–A INTERSECT B (пересечение, возвращает только те строки, которые входят в результаты обоих запросов).
–A MINUS B (вычитание, возвращает строки из первого запроса, за исключением тех, которые входят во второй запрос).
35
Операция UNION ALL работает так же, как UNION, но при этом не удаляет из полученного результата повторяющиеся записи. Например, данный запрос отображает информацию о текущем и прошлом месте работы для всех служащих. Каждое место работы отображается только один раз:
SELECT employee_id, job_id FROM employees UNION
SELECT employee_id, job_id FROM job_history;
Те же запросы, но с использованием UNION ALL дадут немного большую выборку, так как дубли не будут удалены:
SELECT employee_id, job_id FROM employees UNION ALL
SELECT employee_id, job_id FROM job_history;
Данный запрос отображает номера служащих, менявших должность за время карьеры:
SELECT employee_id FROM employees INTERSECT SELECT employee_id FROM job_history;
Данный запрос отображает номера служащих, ни разу не менявших должность:
SELECT employee_id FROM employees MINUS SELECT employee_id FROM job_history;
Ограничения на операторы работы с множествами:
•Количество и тип данных в выражениях SELECT должны совпадать.
•Для изменения последовательности выполнения можно использовать скобки.
•Выражение ORDER BY:
–может использоваться только в конце выражения;
–принимает имя столбца, псевдонимы из первого выражения SELECT или позиционное перечисление.
Пример использования ORDER BY:
SELECT department_id,job_id FROM employees UNION
SELECT department_id,job_id FROM job_history ORDER BY department_id;
Задания для самостоятельной работы
1.Используя операторы работы с множествами, выведите номера отделов (department_id),
вкоторых нет служащих с идентификатором должности (job_id) ST_CLERK.
2.Используя операторы работы с множествами, выведите идентификаторы и наименования стран, в которых не располагаются отделы компании.
3.Используя операторы работы с множествами, выведите список должностей отделов 10, 50 и 20 в таком же порядке отделов. Выведите столбцы job_id и department_id.
4.Выведите номер сотрудника и идентификаторего должности, если его текущая должность совпадает с той, которую он уже занимал, работая в компании.
5.Напишите составной запрос, который выводит следующее: имена и отделы всех сотрудников из таблицы EMPLOYEES, независимо от того, относятся ли они к какому-то отделу или нет; номера и наименования всех отделов из таблицы DEPARTMENTS, независимо от того, есть ли в них сотрудники или нет.
36
2.11. Вставка, модификация и удаление данных
Перед началом работы выполните эти команды для создания дополнительных учебных таблиц:
CREATE TABLE sales_reps (id number, name varchar2(50),
salary number, commission_pct number);
CREATE TABLE copy_emp as SELECT * FROM employees
WHERE mod(employee_id,10)=0;
CREATE TABLE copy_dep
as SELECT * FROM departments
WHERE department_id not in (70,100,30);
Язык манипулирования данными (DML) используется для:
•вставки новых данных в таблицы;
•изменения существующих данных в таблицах;
•удаления существующих данных из таблиц.
Транзакция — это совокупность команд DML, образующих логическую единицу работы (либо все внесенные этими командами изменения принимаются или отменяются).
Для вставки строк в таблицу используется команда INSERT:
INSERT INTO таблица [(столбец [, столбец...])] VALUES (значение [, значение...]);
Команда INSERT позволяет явно перечислить все столбцы и указать, какими значениями следует их заполнить либо использовать порядок столбцов по умолчанию:
INSERT INTO copy_dep
(department_id, department_name, manager_id, location_id) VALUES (70, 'Public Relations', 100, 1700);
INSERT INTO copy_dep (department_id, department_name) VALUES (30, 'Purchasing');
Рекомендуется всегда явно перечислять столбцы таблицы при вставке. Это позволяет улучшить читаемость SQL-предложения и не зависеть от конкретного порядка столбцов в таблице, который со временем может измениться.
В классе VALUES можно указывать вызовы функций:
INSERT INTO copy_emp (employee_id, first_name, last_name,
email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id) VALUES (113,
'Louis', 'Popp',
'LPOPP', '515.124.4567', SYSDATE, 'AC_ACCOUNT', 6900, NULL, 205, 100);
Для копирования строк из другой таблицы или при вставке нескольких строк одновременно, можно использовать подзапрос в команде INSERT, при этом класс VALUES не используется, а количество столбцов, указанных в INSERT, должно совпадать с количеством столбцов в подзапросе.
INSERT INTO sales_reps(id, name, salary, commission_pct) SELECT employee_id, last_name, salary, commission_pct
FROM employees
WHERE job_id LIKE '%REP%';
37
Для изменения данных используется команда UPDATE:
UPDATE таблица
SET столбец = значение [, столбец = значение, ...] [WHERE условие];
Класс SET указывает, какие столбцы надо изменить и на что, класс WHERE — на какую строку или строки будет распространяться это изменение:
UPDATE copy_emp
SET department_id = 70 WHERE employee_id = 113;
Если предложение WHERE отсутствует, обновляются все строки таблицы. Одновременно можно обновлять 2 и более столбцов, для вычисления значений можно
использовать подзапросы. В данном примере происходит изменение должности и оклада служащего под номером 114, чтобы они стали такими же, как у служащего под номером 205:
UPDATE copy_emp
SET job_id = (SELECT job_id FROM employees
WHERE employee_id = 205), salary = (SELECT salary FROM employees
WHERE employee_id = 205) WHERE employee_id = 110;
Для изменения строк таблицы на основе значений из другой таблицы используйте подзапросы в командах UPDATE:
UPDATE copy_emp
SET department_id = (SELECT department_id FROM employees
WHERE employee_id = 100) WHERE job_id = (SELECT job_id FROM employees
WHERE employee_id = 200);
Для удаления строк из таблицы используется команда DELETE:
DELETE [FROM] таблица [WHERE условие];
Конкретная строка или строки удаляются с помощью предложения WHERE:
DELETE FROM copy_dep
WHERE department_name = 'Finance';
Если предложение WHERE отсутствует, удаляются все строки таблицы.
Для удаления строк на основе значений из другой таблицы используйте подзапросы в командах DELETE:
DELETE FROM copy_emp WHERE department_id = (SELECT department_id FROM departments
WHERE department_name LIKE '%Public%');
Если при создании таблицы было указано значение по умолчаниюдля столбца, то стандарт SQL:1999 позволяет использовать в командах INSERT и UPDATE ключевое слово DEFAULT там, где указывается значение столбца:
INSERT INTO copy_dep
(department_id, department_name, manager_id) VALUES (300, 'Engineering', DEFAULT); UPDATE copy_dep
SET manager_id = DEFAULT WHERE department_id = 10;
38
