Les03
-
Upload
michael-karpov -
Category
Economy & Finance
-
view
780 -
download
1
description
Transcript of Les03
3Copyright © 2004, Oracle. All rights reserved.
Манипулирование большими наборами данных
Copyright © 2004, Oracle. All rights reserved.
Рассматриваемые вопросы
• Манипулирование данными с использованием подзапросов
• Описание возможностей вставки данных в несколько таблиц
• Использование следующих типов вставки в несколько таблиц – Безусловная команда INSERT– Преобразующая команда INSERT– Условная команда ALL INSERT– Условная команда FIRST INSERT
• Слияние строк в таблице • Отслеживание изменений данных в течение
периода времени
Copyright © 2004, Oracle. All rights reserved.
Использование подзапросов при манипулировании данными
В команда DML можно использовать подзапросы:
• Копирование данных из одной таблицы в другую
• Выборка данных из вложенного представления
• Изменение данных в одной таблице на основе значений в другой таблице
• Удаление данных в одной таблице на основе значений в другой таблице
Copyright © 2004, Oracle. All rights reserved.
Копирование строк из другой таблицы
• Команда 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%';
33 rows created.
Copyright © 2004, Oracle. All rights reserved.
Использование целевого подзапроса в команде INSERT
INSERT INTO (SELECT employee_id, last_name, email, hire_date, job_id, salary, department_id FROM empl3 WHERE department_id = 50) VALUES (99999, 'Taylor', 'DTAYLOR', TO_DATE('07-JUN-99', 'DD-MON-RR'), 'ST_CLERK', 5000, 50);
1 row created.
Copyright © 2004, Oracle. All rights reserved.
Использование целевого подзапроса в команде INSERT
Проверка результатов.
SELECT employee_id, last_name, email, hire_date, job_id, salary, department_idFROM employeesWHERE department_id = 50;
…
Copyright © 2004, Oracle. All rights reserved.
SELECT a.last_name, a.salary, a.department_id, b.salavgFROM employees a, (SELECT department_id, AVG(salary) salavg FROM employees GROUP BY department_id) bWHERE a.department_id = b.department_idAND a.salary > b.salavg;
Выборка данных с помощью подзапроса-источника
…
Copyright © 2004, Oracle. All rights reserved.
UPDATE empl3SET job_id = (SELECT job_id FROM employees WHERE employee_id = 205), salary = (SELECT salary FROM employees WHERE employee_id = 168)WHERE employee_id = 114;1 row updated.
Обновление двух столбцов с помощью подзапроса
Изменение должности и оклада служащего под номером 114, чтобы должность стала такой же, как у служащего под номером 205, а оклад – как у служащего под номером 168.
Copyright © 2004, Oracle. All rights reserved.
UPDATE empl3SET department_id = (SELECT department_id FROM employees WHERE employee_id = 100)WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 200);1 row updated.
Обновление строк на основе значений из другой таблицы
Для изменения строк таблицы на основе значений из другой таблицы используйте подзапросы в командах UPDATE.
Copyright © 2004, Oracle. All rights reserved.
DELETE FROM empl3WHERE department_id = (SELECT department_id FROM departments WHERE department_name LIKE '%Public%');1 row deleted.
Удаление строк на основе значений из другой таблицы
Для удаления строк на основе значений из другой таблицы используйте подзапросы в командах DELETE
Copyright © 2004, Oracle. All rights reserved.
Использование параметра WITH CHECK OPTION в командах DML
• Подзапрос определяет таблицу и столбцы для команды DML.
• Параметр WITH CHECK OPTION препятствует изменению строки, в результате которого нарушаются условия подзапроса.
INSERT INTO (SELECT employee_id, last_name, email, hire_date, job_id, salary FROM empl3 WHERE department_id = 50 WITH CHECK OPTION)VALUES (99998, 'Smith', 'JSMITH', TO_DATE('07-JUN-99', 'DD-MON-RR'), 'ST_CLERK', 5000);INSERT INTO *ERROR at line 1:ORA-01402: view WITH CHECK OPTION where-clause violation
Copyright © 2004, Oracle. All rights reserved.
Обзор возможности явного задания ключевого слова Default
• При использовании значений по умолчанию, можно задавать ключевое слово DEFAULT в качестве устанавливаемого значения столбца.
• Эта возможность соответствует стандарту SQL: 1999.
• Пользователю предоставляется возможность самому решать, где и когда следует использовать значение по умолчанию.
• Ключевое слово DEFAULT можно указывать в командах INSERT и UPDATE.
Copyright © 2004, Oracle. All rights reserved.
Использование возможности явного задания значения с помощью
ключевого слова Default
• DEFAULT в команде INSERT:
• DEFAULT в команде UPDATE:
INSERT INTO deptm3 (department_id, department_name, manager_id) VALUES (300, 'Engineering', DEFAULT);
UPDATE deptm3SET manager_id = DEFAULT WHERE department_id = 10;
Copyright © 2004, Oracle. All rights reserved.
Обзор многотабличной команды INSERT
INSERT ALL INTO table_a VALUES(…,…,…) INTO table_b VALUES(…,…,…) INTO table_c VALUES(…,…,…) SELECT … FROM sourcetab WHERE …;
Table_a
Table_b
Table_c
Copyright © 2004, Oracle. All rights reserved.
Обзор многотабличной команды INSERT
• Команда INSERT...SELECT может быть использована для вставки в несколько таблиц с помощью одной команды DML.
• Многотабличные команды INSERT могут использоваться в системах поддержки хранилищ данных для передачи информации из одного или более источников данных в набор целевых таблиц.
• Такие команды обеспечивают существенное повышение производительности за счет:– использования одной команды DML вместо
нескольких команд INSERT...SELECT ;
– использования одной команды DML вместо процедуры, в которой выполняются вставки при условии (IF...THEN).
Copyright © 2004, Oracle. All rights reserved.
Типы многотабличных команд INSERT
• Безусловная команда INSERT
• Условная команда INSERT ALL• Условная команда INSERT FIRST• Преобразующая команда INSERT
Copyright © 2004, Oracle. All rights reserved.
Многотабличные команды INSERT
• Синтаксис
• предложение_условий_вставки
INSERT [ALL] [предложение_условий_вставки][предложение_вставки предложение_значений] (подзапрос)
[ALL] [FIRST][WHEN условие THEN] [предложение_вставки
предложение_значений][ELSE] [предложение_вставки предложение_значений]
Copyright © 2004, Oracle. All rights reserved.
Безусловная команда INSERT ALL
• Выборка значений столбцов EMPLOYEE_ID, HIRE_DATE, SALARY и MANAGER_ID из таблицы EMPLOYEES для сотрудников, номер которых (EMPLOYEE_ID ) больше 200.
• Вставка этих значений в таблицы SAL_HISTORY и MGR_HISTORY с использованием многотабличной команды INSERT.
INSERT ALL INTO sal_history VALUES(EMPID,HIREDATE,SAL) INTO mgr_history VALUES(EMPID,MGR,SAL) SELECT employee_id EMPID, hire_date HIREDATE, salary SAL, manager_id MGR FROM employees WHERE employee_id > 200;12 rows created.
Copyright © 2004, Oracle. All rights reserved.
Условная команда INSERT ALL
• Выборка значений столбцов EMPLOYEE_ID, HIRE_DATE, SALARY и MANAGER_ID из таблицы EMPLOYEES для сотрудников, номер которых (EMPLOYEE_ID ) больше 200.
• Если оклад SALARY больше $10000, тогда выполнить вставку этих значений в таблицу SAL_HISTORY, используя условную многотабличную команду INSERT.
• Если номер менеджера ( MANAGER_ID) больше 200, выполнить вставку этих значений в таблицу MGR_HISTORY, используя условную многотабличную команду INSERT.
Copyright © 2004, Oracle. All rights reserved.
Условная команда INSERT ALL
INSERT ALL WHEN SAL > 10000 THEN INTO sal_history VALUES(EMPID,HIREDATE,SAL) WHEN MGR > 200 THEN INTO mgr_history VALUES(EMPID,MGR,SAL) SELECT employee_id EMPID,hire_date HIREDATE, salary SAL, manager_id MGR FROM employees WHERE employee_id > 200;4 rows created.
Copyright © 2004, Oracle. All rights reserved.
Условная команда FIRST INSERT
• Выборка столбца DEPARTMENT_ID, а также значений функций SUM(SALARY)и MAX(HIRE_DATE) из таблицы EMPLOYEES.
• Если SUM(SALARY) больше $25000, тогда выполнить вставку этих значений в таблицу SPECIAL_SAL, используя условную многотабличную команду FIRST INSERT.
• Если выражение в первом предложении WHEN верно, последующие предложения WHEN следует пропустить.
• Строки, которые не удовлетворяют условию в первом предложении WHEN, вставить в таблицы HIREDATE_HISTORY_ 00 , HIREDATE_HISTORY_99 или HIREDATE_HISTORY, учитывая при этом значение столбца HIRE_DATE. Использовать условную многотабличную команду INSERT.
Copyright © 2004, Oracle. All rights reserved.
Условная команда INSERT FIRST
INSERT FIRST WHEN SAL > 25000 THEN INTO special_sal VALUES(DEPTID, SAL) WHEN HIREDATE like ('%00%') THEN INTO hiredate_history_00 VALUES(DEPTID,HIREDATE) WHEN HIREDATE like ('%99%') THEN INTO hiredate_history_99 VALUES(DEPTID, HIREDATE) ELSE INTO hiredate_history VALUES(DEPTID, HIREDATE) SELECT department_id DEPTID, SUM(salary) SAL, MAX(hire_date) HIREDATE FROM employees GROUP BY department_id;12 rows created.
Copyright © 2004, Oracle. All rights reserved.
Преобразующая команда INSERT
• SALES_TUE, SALES_WED, SALES_THUR, SALES_FRI Предположим из нереляционных таблиц был получен набор записей о продажах SALES_SOURCE_DATA в следующем формате:
EMPLOYEE_ID, WEEK_ID, SALES_MON, SALES_TUE, SALES_WED, SALES_THUR, SALES_FRI
• Необходимо сохранить эти записи в таблице SALES_INFO в более типовом реляционном формате:
EMPLOYEE_ID, WEEK, SALES
• Набор записей из таблицы нереляционной БД преобразуется в реляционный формат с помощью преобразующей команды INSERT.
Copyright © 2004, Oracle. All rights reserved.
Преобразующая команда INSERT
INSERT ALL INTO sales_info VALUES (employee_id,week_id,sales_MON) INTO sales_info VALUES (employee_id,week_id,sales_TUE) INTO sales_info VALUES (employee_id,week_id,sales_WED) INTO sales_info VALUES (employee_id,week_id,sales_THUR) INTO sales_info VALUES (employee_id,week_id, sales_FRI) SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE, sales_WED, sales_THUR,sales_FRI FROM sales_source_data;5 rows created.
Copyright © 2004, Oracle. All rights reserved.
Команда MERGE
• Предоставляет возможность при определенных условиях изменять или вставлять данные в таблицу базы данных.
• Выполняет изменение (UPDATE), если строка существует и вставку (INSERT) для новой строки:– Позволяет избежать внесения отдельных
изменений.– Повышает производительность и упрощает
использование.– Эффективна для приложений, работающих с
хранилищами данных.
Copyright © 2004, Oracle. All rights reserved.
Синтаксис команды MERGE
Команда MERGE позволяет вставлять или изменять строки при определенных условиях.
MERGE INTO имя_таблицы псевдоним_таблицы USING (таблица|представление|подзапрос) псевдоним ON (условие_соединения) WHEN MATCHED THEN UPDATE SET столбец1 = значение_столбца1, столбец2 = значение_столбца2 WHEN NOT MATCHED THEN INSERT (список_столбцов) VALUES (список_столбцов);
Copyright © 2004, Oracle. All rights reserved.
MERGE INTO empl3 c USING employees e ON (c.employee_id = e.employee_id)WHEN MATCHED THEN UPDATE SET c.first_name = e.first_name, c.last_name = e.last_name, ... c.department_id = e.department_idWHEN NOT MATCHED THEN INSERT VALUES(e.employee_id, e.first_name, e.last_name, e.email, e.phone_number, e.hire_date, e.job_id, e.salary, e.commission_pct, e.manager_id, e.department_id);
Слияние строк
Вставка или изменение строк таблицы EMPL3для установления соответствия с значениямитаблицы EMPLOYEES.
Copyright © 2004, Oracle. All rights reserved.
Слияние строк
MERGE INTO empl3 c USING employees e ON (c.employee_id = e.employee_id)WHEN MATCHED THEN UPDATE SET ...WHEN NOT MATCHED THEN INSERT VALUES...;
TRUNCATE TABLE empl3;
SELECT * FROM empl3;no rows selected
SELECT * FROM empl3;
107 rows selected.
Copyright © 2004, Oracle. All rights reserved.
Отслеживание изменений в данных
Версии выбираемых строк
SELECT…
Copyright © 2004, Oracle. All rights reserved.
Пример Flashback Version Query
SELECT salary FROM employees3 WHERE employee_id = 107;
UPDATE employees3 SET salary = salary * 1.30WHERE employee_id = 107;
COMMIT;
SELECT salary FROM employees3 VERSIONS BETWEEN SCN MINVALUE AND MAXVALUEWHERE employee_id = 107;
1
2
3
Copyright © 2004, Oracle. All rights reserved.
Предложение VERSIONS BETWEEN
SELECT versions_starttime "START_DATE", versions_endtime "END_DATE", salary FROM employees VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE WHERE last_name = 'Lorentz';
Copyright © 2004, Oracle. All rights reserved.
Итоги
• Использование операций DML и команд управления транзакциями
• Описание возможностей вставки данных в несколько таблиц
• Использование следующих типов вставки в несколько таблиц – Безусловная команда INSERT– Преобразующая команда INSERT– Условная команда ALL INSERT– Условная команда FIRST INSERT
• Слияние строк в таблице • Использование подзапросов при
манипулировании данными• Отслеживание изменений данных в течение
периода времени
Copyright © 2004, Oracle. All rights reserved.
Обзор практического занятия 3
• Выполнение команд многотабличной вставки
• Выполнения операций MERGE• Отслеживание версий строк