Les03

33
3 Copyright © 2004, Oracle. All rights reserved. Манипулирование большими наборами данных

description

 

Transcript of Les03

Page 1: Les03

3Copyright © 2004, Oracle. All rights reserved.

Манипулирование большими наборами данных

Page 2: Les03

Copyright © 2004, Oracle. All rights reserved.

Рассматриваемые вопросы

• Манипулирование данными с использованием подзапросов

• Описание возможностей вставки данных в несколько таблиц

• Использование следующих типов вставки в несколько таблиц – Безусловная команда INSERT– Преобразующая команда INSERT– Условная команда ALL INSERT– Условная команда FIRST INSERT

• Слияние строк в таблице • Отслеживание изменений данных в течение

периода времени

Page 3: Les03

Copyright © 2004, Oracle. All rights reserved.

Использование подзапросов при манипулировании данными

В команда DML можно использовать подзапросы:

• Копирование данных из одной таблицы в другую

• Выборка данных из вложенного представления

• Изменение данных в одной таблице на основе значений в другой таблице

• Удаление данных в одной таблице на основе значений в другой таблице

Page 4: Les03

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.

Page 5: Les03

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.

Page 6: Les03

Copyright © 2004, Oracle. All rights reserved.

Использование целевого подзапроса в команде INSERT

Проверка результатов.

SELECT employee_id, last_name, email, hire_date, job_id, salary, department_idFROM employeesWHERE department_id = 50;

Page 7: Les03

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;

Выборка данных с помощью подзапроса-источника

Page 8: Les03

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.

Page 9: Les03

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.

Page 10: Les03

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

Page 11: Les03

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

Page 12: Les03

Copyright © 2004, Oracle. All rights reserved.

Обзор возможности явного задания ключевого слова Default

• При использовании значений по умолчанию, можно задавать ключевое слово DEFAULT в качестве устанавливаемого значения столбца.

• Эта возможность соответствует стандарту SQL: 1999.

• Пользователю предоставляется возможность самому решать, где и когда следует использовать значение по умолчанию.

• Ключевое слово DEFAULT можно указывать в командах INSERT и UPDATE.

Page 13: Les03

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;

Page 14: Les03

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

Page 15: Les03

Copyright © 2004, Oracle. All rights reserved.

Обзор многотабличной команды INSERT

• Команда INSERT...SELECT может быть использована для вставки в несколько таблиц с помощью одной команды DML.

• Многотабличные команды INSERT могут использоваться в системах поддержки хранилищ данных для передачи информации из одного или более источников данных в набор целевых таблиц.

• Такие команды обеспечивают существенное повышение производительности за счет:– использования одной команды DML вместо

нескольких команд INSERT...SELECT ;

– использования одной команды DML вместо процедуры, в которой выполняются вставки при условии (IF...THEN).

Page 16: Les03

Copyright © 2004, Oracle. All rights reserved.

Типы многотабличных команд INSERT

• Безусловная команда INSERT

• Условная команда INSERT ALL• Условная команда INSERT FIRST• Преобразующая команда INSERT

Page 17: Les03

Copyright © 2004, Oracle. All rights reserved.

Многотабличные команды INSERT

• Синтаксис

• предложение_условий_вставки

INSERT [ALL] [предложение_условий_вставки][предложение_вставки предложение_значений] (подзапрос)

[ALL] [FIRST][WHEN условие THEN] [предложение_вставки

предложение_значений][ELSE] [предложение_вставки предложение_значений]

Page 18: Les03

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.

Page 19: Les03

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.

Page 20: Les03

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.

Page 21: Les03

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.

Page 22: Les03

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.

Page 23: Les03

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.

Page 24: Les03

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.

Page 25: Les03

Copyright © 2004, Oracle. All rights reserved.

Команда MERGE

• Предоставляет возможность при определенных условиях изменять или вставлять данные в таблицу базы данных.

• Выполняет изменение (UPDATE), если строка существует и вставку (INSERT) для новой строки:– Позволяет избежать внесения отдельных

изменений.– Повышает производительность и упрощает

использование.– Эффективна для приложений, работающих с

хранилищами данных.

Page 26: Les03

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 (список_столбцов);

Page 27: Les03

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.

Page 28: Les03

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.

Page 29: Les03

Copyright © 2004, Oracle. All rights reserved.

Отслеживание изменений в данных

Версии выбираемых строк

SELECT…

Page 30: Les03

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

Page 31: Les03

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';

Page 32: Les03

Copyright © 2004, Oracle. All rights reserved.

Итоги

• Использование операций DML и команд управления транзакциями

• Описание возможностей вставки данных в несколько таблиц

• Использование следующих типов вставки в несколько таблиц – Безусловная команда INSERT– Преобразующая команда INSERT– Условная команда ALL INSERT– Условная команда FIRST INSERT

• Слияние строк в таблице • Использование подзапросов при

манипулировании данными• Отслеживание изменений данных в течение

периода времени

Page 33: Les03

Copyright © 2004, Oracle. All rights reserved.

Обзор практического занятия 3

• Выполнение команд многотабличной вставки

• Выполнения операций MERGE• Отслеживание версий строк