Манипулирование большими наборами данных
Рассматриваемые вопросы <ul><ul><li>Манипулирование данными с использованием подзапросов </li></ul></ul><ul><ul><li>Описан...
Использование подзапросов при манипулировании данными <ul><li>В команда  DML  можно использовать подзапросы : </li></ul><u...
Копирование строк из другой таблицы <ul><ul><li>Команда  INSERT  должна включать подзапрос . </li></ul></ul><ul><ul><li>Пр...
Использование целевого подзапроса в команде   INSERT <ul><li>INSERT INTO </li></ul><ul><li>(SELECT employee_id, last_name,...
Использование целевого подзапроса в команде   INSERT <ul><li>Проверка результатов . </li></ul>SELECT employee_id, last_nam...
Выборка данных с помощью подзапроса-источника SELECT  a.last_name, a.salary,  a.department_id, b.salavg FROM  employees a,...
Обновление двух столбцов с помощью подзапроса <ul><li>Изменение должности и оклада служащего под номером 114, чтобы должно...
Обновление строк на основе  значений из другой таблицы <ul><li>Для изменения строк таблицы на основе значений из другой та...
Удаление строк на основе значений из другой таблицы <ul><li>Для удаления строк на основе значений из другой таблицы исполь...
Использование параметра  WITH CHECK OPTION   в командах  DML <ul><ul><li>Подзапрос определяет таблицу и столбцы для команд...
Обзор возможности явного задания ключевого слова  Default <ul><ul><li>При использовании значений по умолчанию, можно задав...
Использование возможности явного задания значения с помощью ключевого слова  Default <ul><ul><li>DEFAULT   в команде   INS...
Обзор многотабличной команды  INSERT   INSERT  ALL   INTO table_a VALUES(…,…,…)   INTO table_b VALUES(…,…,…)   INTO table_...
Обзор многотабличной команды  INSERT <ul><ul><li>Команда  INSERT...SELECT   может быть использована для вставки в нескольк...
Типы многотабличных команд  INSERT <ul><ul><li>Безусловная команда  INSERT   </li></ul></ul><ul><ul><li>Условная команда  ...
Многотабличные команды   INSERT <ul><ul><li>Синтаксис </li></ul></ul><ul><ul><li>предложение _ условий _ вставки </li></ul...
 
Безусловная команда   INSERT   ALL <ul><ul><li>Выборка значений столбцов   EMPLOYEE_ID ,  HIRE_DATE ,  SALARY   и   MANAGE...
Условная команда   INSERT ALL <ul><ul><li>Выборка значений столбцов   EMPLOYEE_ID ,  HIRE_DATE ,  SALARY   и   MANAGER_ID ...
Условная команда   INSERT   ALL INSERT ALL   WHEN SAL > 10000 THEN   INTO sal_history VALUES(EMPID,HIREDATE,SAL)   WHEN MG...
Условная команда   FIRST INSERT <ul><ul><li>Выборка столбца   DEPARTMENT_ID ,  а также значений функций   SUM(SALARY) и   ...
Условная команда   INSERT FIRST INSERT FIRST   WHEN SAL  > 25000  THEN   INTO special_sal VALUES(DEPTID, SAL)   WHEN HIRED...
Преобразующая команда   INSERT <ul><ul><li>SALES_TUE ,  SALES_WED ,  SALES_THUR ,  SALES_FRI   Предположим из нереляционны...
Преобразующая команда   INSERT INSERT ALL   INTO sales_info VALUES (employee_id,week_id,sales_MON)   INTO sales_info VALUE...
 
Команда   MERGE <ul><ul><li>Предоставляет возможность при определенных условиях изменять или вставлять данные в таблицу ба...
Синтаксис команды   MERGE <ul><li>Команда  MERGE  позволяет вставлять или изменять  </li></ul><ul><li>строки при определен...
Слияние строк <ul><li>Вставка или изменение строк таблицы  EMPL3 </li></ul><ul><li>для установления соответствия с значени...
Слияние строк MERGE INTO empl3 c USING employees e ON (c.employee_id = e.employee_id) WHEN MATCHED THEN UPDATE SET ... WHE...
Отслеживание изменений в данных Версии выбираемых строк SELECT …
Пример  Flashback Version Query SELECT salary FROM employees3  WHERE  employee_id = 107; UPDATE employees3 SET salary = sa...
Notes Only
Предложение   VERSIONS BETWEEN SELECT versions_starttime &quot;START_DATE&quot;,    versions_endtime  &quot;END_DATE&quot;...
Итоги <ul><ul><li>Использование операций  DML  и команд управления транзакциями </li></ul></ul><ul><ul><li>Описание возмож...
Обзор   практического занятия  3 <ul><ul><li>Выполнение команд многотабличной вставки  </li></ul></ul><ul><ul><li>Выполнен...
 
 
 
 
 
 
Upcoming SlideShare
Loading in …5
×

Les03

999 views

Published on

Published in: Economy & Finance, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
999
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • Les03

    1. 1. Манипулирование большими наборами данных
    2. 2. Рассматриваемые вопросы <ul><ul><li>Манипулирование данными с использованием подзапросов </li></ul></ul><ul><ul><li>Описание возможностей вставки данных в несколько таблиц </li></ul></ul><ul><ul><li>Использование следующих типов вставки в несколько таблиц </li></ul></ul><ul><ul><ul><li>Безусловная команда INSERT </li></ul></ul></ul><ul><ul><ul><li>Преобразующая команда INSERT </li></ul></ul></ul><ul><ul><ul><li>Условная команда ALL INSERT </li></ul></ul></ul><ul><ul><ul><li>Условная команда FIRST INSERT </li></ul></ul></ul><ul><ul><li>Слияние строк в таблице </li></ul></ul><ul><ul><li>Отслеживание изменений данных в течение периода времени </li></ul></ul>
    3. 3. Использование подзапросов при манипулировании данными <ul><li>В команда DML можно использовать подзапросы : </li></ul><ul><ul><li>Копирование данных из одной таблицы в другую </li></ul></ul><ul><ul><li>Выборка данных из вложенного представления </li></ul></ul><ul><ul><li>Изменение данных в одной таблице на основе значений в другой таблице </li></ul></ul><ul><ul><li>Удаление данных в одной таблице на основе значений в другой таблице </li></ul></ul>
    4. 4. Копирование строк из другой таблицы <ul><ul><li>Команда INSERT должна включать подзапрос . </li></ul></ul><ul><ul><li>Предложение VALUES не используется. </li></ul></ul><ul><ul><li>Количество столбцов, указанных в предложении INSERT , должно совпадать с количеством столбцов в подзапросе . </li></ul></ul>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.
    5. 5. Использование целевого подзапроса в команде INSERT <ul><li>INSERT INTO </li></ul><ul><li>(SELECT employee_id, last_name, </li></ul><ul><li>email, hire_date, job_id, salary, </li></ul><ul><li>department_id </li></ul><ul><li>FROM empl3 </li></ul><ul><li>WHERE department_id = 50) </li></ul><ul><li>VALUES (99999, 'Taylor', 'DTAYLOR', </li></ul><ul><li>TO_DATE('07-JUN-99', 'DD-MON-RR'), </li></ul><ul><li>'ST_CLERK', 5000, 50); </li></ul><ul><li>1 row created. </li></ul>
    6. 6. Использование целевого подзапроса в команде INSERT <ul><li>Проверка результатов . </li></ul>SELECT employee_id, last_name, email, hire_date, job_id, salary, department_id FROM employees WHERE department_id = 50; …
    7. 7. Выборка данных с помощью подзапроса-источника SELECT a.last_name, a.salary, a.department_id, b.salavg FROM employees a, (SELECT department_id, AVG(salary) salavg FROM employees GROUP BY department_id) b WHERE a.department_id = b.department_id AND a.salary > b.salavg; …
    8. 8. Обновление двух столбцов с помощью подзапроса <ul><li>Изменение должности и оклада служащего под номером 114, чтобы должность стала такой же, как у служащего под номером 205, а оклад – как у служащего под номером 168. </li></ul>UPDATE empl3 SET 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.
    9. 9. Обновление строк на основе значений из другой таблицы <ul><li>Для изменения строк таблицы на основе значений из другой таблицы используйте подзапросы в командах UPDATE . </li></ul>UPDATE empl3 SET 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.
    10. 10. Удаление строк на основе значений из другой таблицы <ul><li>Для удаления строк на основе значений из другой таблицы используйте подзапросы в командах DELETE </li></ul>DELETE FROM empl3 WHERE department_id = (SELECT department_id FROM departments WHERE department_name LIKE '%Public%'); 1 row deleted.
    11. 11. Использование параметра WITH CHECK OPTION в командах DML <ul><ul><li>Подзапрос определяет таблицу и столбцы для команды DML. </li></ul></ul><ul><ul><li>Параметр WITH CHECK OPTION препятствует изменению строки , в результате которого нарушаются условия подзапроса . </li></ul></ul>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
    12. 12. Обзор возможности явного задания ключевого слова Default <ul><ul><li>При использовании значений по умолчанию, можно задавать ключевое слово DEFAULT в качестве устанавливаемого значения столбца . </li></ul></ul><ul><ul><li>Эта возможность соответствует стандарту SQL: 1999. </li></ul></ul><ul><ul><li>Пользователю предоставляется возможность самому решать , где и когда следует использовать значение по умолчанию . </li></ul></ul><ul><ul><li>Ключевое слово DEFAULT можно указывать в командах INSERT и UPDATE . </li></ul></ul>
    13. 13. Использование возможности явного задания значения с помощью ключевого слова Default <ul><ul><li>DEFAULT в команде INSERT : </li></ul></ul><ul><ul><li>DEFAULT в команде UPDATE : </li></ul></ul>INSERT INTO deptm3 (department_id, department_name, manager_id) VALUES (300, 'Engineering', DEFAULT ); UPDATE deptm3 SET manager_id = DEFAULT WHERE department_id = 10;
    14. 14. Обзор многотабличной команды 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
    15. 15. Обзор многотабличной команды INSERT <ul><ul><li>Команда INSERT...SELECT может быть использована для вставки в несколько таблиц с помощью одной команды DML. </li></ul></ul><ul><ul><li>Многотабличные команды INSERT могут использоваться в системах поддержки хранилищ данных для передачи информации из одного или более источников данных в набор целевых таблиц . </li></ul></ul><ul><ul><li>Такие команды обеспечивают существенное повышение производительности за счет : </li></ul></ul><ul><ul><ul><li>использования одной команды DML вместо нескольких команд INSERT ... SELECT ; </li></ul></ul></ul><ul><ul><ul><li>использования одной команды DML вместо процедуры , в которой выполняются вставки при условии ( IF...THEN ) . </li></ul></ul></ul>
    16. 16. Типы многотабличных команд INSERT <ul><ul><li>Безусловная команда INSERT </li></ul></ul><ul><ul><li>Условная команда INSERT ALL </li></ul></ul><ul><ul><li>Условная команда INSERT FIRST </li></ul></ul><ul><ul><li>Преобразующая команда INSERT </li></ul></ul>
    17. 17. Многотабличные команды INSERT <ul><ul><li>Синтаксис </li></ul></ul><ul><ul><li>предложение _ условий _ вставки </li></ul></ul>INSERT [ALL] [ предложение _ условий _ вставки ] [ предложение_вставки предложение _ значений ] ( подзапрос ) [ALL] [FIRST] [WHEN условие THEN] [ предложение_вставки предложение _ значений ] [ELSE] [ предложение_вставки предложение _ значений ]
    18. 19. Безусловная команда INSERT ALL <ul><ul><li>Выборка значений столбцов EMPLOYEE_ID , HIRE_DATE , SALARY и MANAGER_ID из таблицы EMPLOYEES для сотрудников , номер которых ( EMPLOYEE_ID ) больше 200. </li></ul></ul><ul><ul><li>Вставка этих значений в таблицы SAL_HISTORY и MGR_HISTORY с использованием многотабличной команды INSERT . </li></ul></ul>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.
    19. 20. Условная команда INSERT ALL <ul><ul><li>Выборка значений столбцов EMPLOYEE_ID , HIRE_DATE , SALARY и MANAGER_ID из таблицы EMPLOYEES для сотрудников , номер которых ( EMPLOYEE_ID ) больше 200. </li></ul></ul><ul><ul><li>Если оклад SALARY больше $10000, тогда выполнить вставку этих значений в таблицу SAL_HISTORY , используя условную многотабличную команду INSERT . </li></ul></ul><ul><ul><li>Если номер менеджера ( MANAGER_ID ) больше 200, выполнить вставку этих значений в таблицу MGR_HISTORY , используя условную многотабличную команду INSERT . </li></ul></ul>
    20. 21. Условная команда 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.
    21. 22. Условная команда FIRST INSERT <ul><ul><li>Выборка столбца DEPARTMENT_ID , а также значений функций SUM(SALARY) и MAX(HIRE_DATE) из таблицы EMPLOYEES . </li></ul></ul><ul><ul><li>Если SUM(SALARY) больше $25000, тогда выполнить вставку этих значений в таблицу SPECIAL_SAL , используя условную многотабличную команду FIRST INSERT . </li></ul></ul><ul><ul><li>Если выражение в первом предложении WHEN верно , последующие предложения WHEN следует пропустить . </li></ul></ul><ul><ul><li>Строки , которые не удовлетворяют условию в первом предложении WHEN , вставить в таблицы HIREDATE_HISTORY _ 00 , HIREDATE_HISTORY _ 99 или HIREDATE_HISTORY , учитывая при этом значение столбца HIRE_DATE . Использовать условную многотабличную команду INSERT . </li></ul></ul>
    22. 23. Условная команда 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.
    23. 24. Преобразующая команда INSERT <ul><ul><li>SALES_TUE , SALES_WED , SALES_THUR , SALES_FRI Предположим из нереляционных таблиц был получен набор записей о продажах SALES_SOURCE_DATA в следующем формате : </li></ul></ul><ul><li>EMPLOYEE_ID, WEEK_ID, SALES_MON, SALES_TUE, SALES_WED, SALES_THUR, SALES_FRI </li></ul><ul><ul><li>Необходимо сохранить эти записи в таблице SALES_INFO в более типовом реляционном формате : </li></ul></ul><ul><ul><li>EMPLOYEE_ID, WEEK, SALES </li></ul></ul><ul><ul><li>Набор записей из таблицы нереляционной БД преобразуется в реляционный формат с помощью преобразующей команды INSERT . </li></ul></ul>
    24. 25. Преобразующая команда 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.
    25. 27. Команда MERGE <ul><ul><li>Предоставляет возможность при определенных условиях изменять или вставлять данные в таблицу базы данных . </li></ul></ul><ul><ul><li>Выполняет изменение ( UPDATE ) , если строка существует и вставку ( INSERT ) для новой строки : </li></ul></ul><ul><ul><ul><li>Позволяет избежать внесения отдельных изменений . </li></ul></ul></ul><ul><ul><ul><li>Повышает производительность и упрощает использование . </li></ul></ul></ul><ul><ul><ul><li>Эффективна для приложений , работающих с хранилищами данных . </li></ul></ul></ul>
    26. 28. Синтаксис команды MERGE <ul><li>Команда MERGE позволяет вставлять или изменять </li></ul><ul><li>строки при определенных условиях . </li></ul>MERGE INTO имя _ таблицы псевдоним _ таблицы USING ( таблица | представление | подзапрос ) псевдоним ON ( условие_соединения ) WHEN MATCHED THEN UPDATE SET столбец 1 = значение _ столбца 1, столбец 2 = значение _ столбца2 WHEN NOT MATCHED THEN INSERT ( список _ столбцов ) VALUES ( список _ столбцов );
    27. 29. Слияние строк <ul><li>Вставка или изменение строк таблицы EMPL3 </li></ul><ul><li>для установления соответствия с значениями </li></ul><ul><li>таблицы EMPLOYEES . </li></ul>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_id WHEN 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);
    28. 30. Слияние строк 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.
    29. 31. Отслеживание изменений в данных Версии выбираемых строк SELECT …
    30. 32. Пример Flashback Version Query SELECT salary FROM employees3 WHERE employee_id = 107; UPDATE employees3 SET salary = salary * 1.30 WHERE employee_id = 107; COMMIT; SELECT salary FROM employees3 VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE WHERE employee_id = 107; 1 2 3
    31. 33. Notes Only
    32. 34. Предложение VERSIONS BETWEEN SELECT versions_starttime &quot;START_DATE&quot;, versions_endtime &quot;END_DATE&quot;, salary FROM employees VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE WHERE last_name = 'Lorentz';
    33. 35. Итоги <ul><ul><li>Использование операций DML и команд управления транзакциями </li></ul></ul><ul><ul><li>Описание возможностей вставки данных в несколько таблиц </li></ul></ul><ul><ul><li>Использование следующих типов вставки в несколько таблиц </li></ul></ul><ul><ul><ul><li>Безусловная команда INSERT </li></ul></ul></ul><ul><ul><ul><li>Преобразующая команда INSERT </li></ul></ul></ul><ul><ul><ul><li>Условная команда ALL INSERT </li></ul></ul></ul><ul><ul><ul><li>Условная команда FIRST INSERT </li></ul></ul></ul><ul><ul><li>Слияние строк в таблице </li></ul></ul><ul><ul><li>Использование подзапросов при манипулировании данными </li></ul></ul><ul><ul><li>Отслеживание изменений данных в течение периода времени </li></ul></ul>
    34. 36. Обзор практического занятия 3 <ul><ul><li>Выполнение команд многотабличной вставки </li></ul></ul><ul><ul><li>Выполнения операций MERGE </li></ul></ul><ul><ul><li>Отслеживание версий строк </li></ul></ul>

    ×