100% found this document useful (1 vote)
13 views33 pages

Manipulating Large Data Sets

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
13 views33 pages

Manipulating Large Data Sets

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 33

Manipulating Large Data Sets

Copyright 2004, Oracle. All rights reserved.

Objectives

After completing this lesson, you should be able to do


the following:
Manipulate data using subqueries
Describe the features of multitable inserts
Use the following types of multitable inserts

3-2

Unconditional INSERT
Pivoting INSERT
Conditional ALL INSERT
Conditional FIRST INSERT

Merge rows in a table


Track the changes to data over a period of time

Copyright 2004, Oracle. All rights reserved.

Using Subqueries to Manipulate Data

You can use subqueries in DML statements to:


Copy data from one table to another
Retrieve data from an inline view
Update data in one table based on the values of
another table
Delete rows from one table based on rows in a
another table

3-3

Copyright 2004, Oracle. All rights reserved.

Copying Rows from Another Table

Write your INSERT statement with a subquery.


INSERT INTO sales_reps(id, name, salary, commission_pct)
SELECT employee_id, last_name, salary, commission_pct
FROM
employees
WHERE job_id LIKE '%REP%';
4 rows created.

3-4

Do not use the VALUES clause.


Match the number of columns in the INSERT
clause with that in the subquery.

Copyright 2004, Oracle. All rights reserved.

Inserting Using a Subquery as a Target

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.

3-5

Copyright 2004, Oracle. All rights reserved.

Inserting Using a Subquery as a Target


Verify the results.
SELECT employee_id, last_name, email, hire_date,
job_id, salary, department_id
FROM
employees
WHERE department_id = 50;

3-6

Copyright 2004, Oracle. All rights reserved.

Retrieving Data with a Subquery as Source


SELECT
FROM

WHERE
AND

a.last_name, a.salary,
a.department_id, b.salavg
employees a, (SELECT
department_id,
AVG(salary) salavg
FROM
employees
GROUP BY department_id) b
a.department_id = b.department_id
a.salary > b.salavg;

3-7

Copyright 2004, Oracle. All rights reserved.

Updating Two Columns with a Subquery

Update the job and salary of employee 114 to match


that of employee 205.
UPDATE
SET

empl3
job_id

= (SELECT job_id
FROM
employees
WHERE
employee_id = 205),
salary = (SELECT salary
FROM
employees
WHERE
employee_id = 205)
WHERE
employee_id
= 114;
1 row updated.

3-8

Copyright 2004, Oracle. All rights reserved.

Updating Rows Based


on Another Table
Use subqueries in UPDATE statements to update rows
in a table based on values from another table.
UPDATE
SET

empl3
department_id

WHERE

job_id

= (SELECT department_id
FROM employees
WHERE employee_id = 100)
= (SELECT job_id
FROM employees
WHERE employee_id = 200);

1 row updated.

3-9

Copyright 2004, Oracle. All rights reserved.

Deleting Rows Based


on Another Table
Use subqueries in DELETE statements to remove rows
from a table based on values from another table.
DELETE FROM empl3
WHERE department_id =
(SELECT department_id
FROM
departments
WHERE department_name
LIKE '%Public%');
1 row deleted.

3-10

Copyright 2004, Oracle. All rights reserved.

Using the WITH CHECK OPTION Keyword


on DML Statements

A subquery is used to identify the table and


columns of the DML statement.
The WITH CHECK OPTION keyword prohibits you
from changing rows that are not in the subquery.
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

3-11

Copyright 2004, Oracle. All rights reserved.

Overview of the Explicit Default Feature

3-12

With the explicit default feature, you can use the


DEFAULT keyword as a column value where the
column default is desired.
The addition of this feature is for compliance with
the SQL:1999 standard.
This allows the user to control where and when
the default value should be applied to data.
Explicit defaults can be used in INSERT and
UPDATE statements.

Copyright 2004, Oracle. All rights reserved.

Using Explicit Default Values

DEFAULT with INSERT:

INSERT INTO deptm3


(department_id, department_name, manager_id)
VALUES (300, 'Engineering', DEFAULT);

DEFAULT with UPDATE:

UPDATE deptm3
SET manager_id = DEFAULT
WHERE department_id = 10;

3-13

Copyright 2004, Oracle. All rights reserved.

Overview of Multitable INSERT Statements

INSERT ALL
INTO table_a VALUES(,,)
INTO table_b VALUES(,,)
INTO table_c VALUES(,,)
SELECT
FROM sourcetab
WHERE ;

Table_a

Table_b

Table_c

3-14

Copyright 2004, Oracle. All rights reserved.

Overview of Multitable INSERT Statements

The INSERTSELECT statement can be used to


insert rows into multiple tables as part of a single
DML statement.
Multitable INSERT statements can be used in data
warehousing systems to transfer data from one or
more operational sources to a set of target tables.
They provide significant performance
improvement over:
Single DML versus multiple INSERTSELECT
statements
Single DML versus a procedure to do multiple
inserts using IF...THEN syntax

3-15

Copyright 2004, Oracle. All rights reserved.

Types of Multitable INSERT Statements

The different types of multitable INSERT statements


are:
Unconditional INSERT
Conditional ALL INSERT
Conditional FIRST INSERT
Pivoting INSERT

3-16

Copyright 2004, Oracle. All rights reserved.

Multitable INSERT Statements

Syntax

INSERT [ALL] [conditional_insert_clause]


[insert_into_clause values_clause] (subquery)

conditional_insert_clause

[ALL] [FIRST]
[WHEN condition THEN] [insert_into_clause values_clause]
[ELSE] [insert_into_clause values_clause]

3-17

Copyright 2004, Oracle. All rights reserved.

Unconditional INSERT ALL

Select the EMPLOYEE_ID, HIRE_DATE, SALARY, and


MANAGER_ID values from the EMPLOYEES table for
those employees whose EMPLOYEE_ID is greater
than 200.
Insert these values into the SAL_HISTORY and
MGR_HISTORY tables using a multitable 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;
8 rows created.
3-19

Copyright 2004, Oracle. All rights reserved.

Conditional INSERT ALL

3-20

Select the EMPLOYEE_ID, HIRE_DATE, SALARY, and


MANAGER_ID values from the EMPLOYEES table for
those employees whose EMPLOYEE_ID is greater
than 200.
If the SALARY is greater than $10,000, insert these
values into the SAL_HISTORY table using a
conditional multitable INSERT statement.
If the MANAGER_ID is greater than 200, insert these
values into the MGR_HISTORY table using a
conditional multitable INSERT statement.

Copyright 2004, Oracle. All rights reserved.

Conditional 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.

3-21

Copyright 2004, Oracle. All rights reserved.

Conditional INSERT FIRST

3-22

Select the DEPARTMENT_ID, SUM(SALARY), and


MAX(HIRE_DATE) from the EMPLOYEES table.
If the SUM(SALARY) is greater than $25,000, then
insert these values into the SPECIAL_SAL, using a
conditional FIRST multitable INSERT.
If the first WHEN clause evaluates to true, then the
subsequent WHEN clauses for this row should be
skipped.
For the rows that do not satisfy the first WHEN
condition, insert into the HIREDATE_HISTORY_00,
HIREDATE_HISTORY_99, or HIREDATE_HISTORY
tables, based on the value in the HIRE_DATE
column using a conditional multitable INSERT.
Copyright 2004, Oracle. All rights reserved.

Conditional 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;
8 rows created.

3-23

Copyright 2004, Oracle. All rights reserved.

Pivoting INSERT

Suppose you receive a set of sales records from a


nonrelational database table,
SALES_SOURCE_DATA, in the following format:
EMPLOYEE_ID, WEEK_ID, SALES_MON, SALES_TUE,
SALES_WED, SALES_THUR, SALES_FRI

You want to store these records in the


SALES_INFO table in a more typical relational
format:
EMPLOYEE_ID, WEEK, SALES
Using a pivoting INSERT, convert the set of sales
records from the nonrelational database table to
relational format.

3-24

Copyright 2004, Oracle. All rights reserved.

Pivoting 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.

3-25

Copyright 2004, Oracle. All rights reserved.

The MERGE Statement

Provides the ability to conditionally update or


insert data into a database table
Performs an UPDATE if the row exists, and an
INSERT if it is a new row:
Avoids separate updates
Increases performance and ease of use
Is useful in data warehousing applications

3-27

Copyright 2004, Oracle. All rights reserved.

The MERGE Statement Syntax

You can conditionally insert or update rows in a table


by using the MERGE statement.
MERGE INTO table_name table_alias
USING (table|view|sub_query) alias
ON (join condition)
WHEN MATCHED THEN
UPDATE SET
col1 = col_val1,
col2 = col2_val
WHEN NOT MATCHED THEN
INSERT (column_list)
VALUES (column_values);

3-28

Copyright 2004, Oracle. All rights reserved.

Merging Rows
Insert or update rows in the EMPL3 table to match the
EMPLOYEES table.
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);

3-29

Copyright 2004, Oracle. All rights reserved.

Merging Rows
TRUNCATE TABLE empl3;
SELECT *
FROM empl3;
no rows selected

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...;
SELECT *
FROM empl3;
20 rows selected.
3-30

Copyright 2004, Oracle. All rights reserved.

Tracking Changes in Data

SELECT

Versions of retrieved rows


3-31

Copyright 2004, Oracle. All rights reserved.

Example of the 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;

3-32

Copyright 2004, Oracle. All rights reserved.

The VERSIONS BETWEEN Clause


SELECT versions_starttime "START_DATE",
versions_endtime
"END_DATE",
salary
FROM
employees
VERSIONS BETWEEN SCN MINVALUE
AND MAXVALUE
WHERE last_name = 'Lorentz';

3-34

Copyright 2004, Oracle. All rights reserved.

Summary

In this lesson, you should have learned how to :


Use DML statements and control transactions
Describe the features of multitable inserts
Use the following types of multitable inserts

3-35

Unconditional INSERT
Pivoting INSERT
Conditional ALL INSERT
Conditional FIRST INSERT

Merge rows in a table


Manipulate data using subqueries
Track the changes to data over a period of time
Copyright 2004, Oracle. All rights reserved.

Practice 3: Overview

This practice covers the following topics:


Performing multitable INSERTs
Performing MERGE operations

3-36

Tracking row versions

Copyright 2004, Oracle. All rights reserved.

You might also like