oracle sql fundamental ii 4-5 章重點 chap 4 managing objects with data dictionary views chap 5...
TRANSCRIPT
ORACLE SQL Fundamental II
4-5 章重點Chap 4 Managing Objects with Data Dictionary Views
Chap 5 Manipulating Large Data Sets
1. subqueries ( inline view : 以 subquery 取代 table , WITH CHECK OPTION)
2. 在 INSERT 和 UPDATE 敘述明確指定 default 值 3. multitable INSERT
1. Unconditional INSERT
2. Conditional INSERT ALL
3. Conditional INSERT FIRST
4. Pivoting INSERT
4.Merge rows in a table
5. Tracking Changes in Data :VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
II 4-2 Objectives(目標 ) dictionary views :
可存取 metadata 及產生關於你的 schema objects 之報表
2
II 4-4 Data Dictionary Data dictionary:
1. 由 Oracle Server 產生及維護2. read-only , 所以只能做 SQL 查詢
II 4-4 Data dictionary structure
Data dictionary structure 包含1. base tables :
只有 Oracle Server 可寫或讀這些 tables, 你很少直接存取2. user-accessible views :
大部分使用者可以存取 Data dictionary 可查到下列資訊 :
n Definitions of all schema objects in the database (tables, views, indexes, synonyms,sequences, procedures, functions, packages, triggers, and so on)
n Default values for columnsn Integrity constraint informationn Names of Oracle usersn Privileges and roles that each user has been grantedn Other general database information
3
II 4-6 Data Dictionary Structure View naming convention:
data dictionary 一組包含三個 view, 如 :
n USER_OBJECT: 包含你擁有 (own) 或你 create 的 objects 資訊n ALL_OBJECT: 包含你可以存取 (access) 的 objects 資訊n DBA_OBJECT: 包含被所有使用者 (all users) 擁有 (own) 的 objects 資
訊 以 v$ 開頭的 View :
1.是動態的 (dynamic in nature) 且儲存關於 performance 的資料2. Dynamic performance tables 不是真實 tables
3.不可以被大部使用者 (most users) 存取 . 只有 DBA 可在這些資料表做查詢、 create views 和授權存取這些 view 給其他使用者
1. 以 ALL 或 DBA 為前置詞的 views : 通常有一個額外的欄位 owner , 用於指明誰擁有這個 object
4
II 4-7 How to Use the Dictionary Views
DESCRIBE DICTIONARY
SELECT *
FROM dictionary
WHERE table_name = 'USER_OBJECTS';
5
II 4-9 USER_OBJECTS View
SELECT object_name, object_type, created, status
FROM user_objects
ORDER BY object_type ;
CAT view : 只有兩個欄位 : TABLE_NAME 及 TABLE_TYPE CAT 是 USER_CATALOG 的 synonym ( 同義字 ) CAT 是一個 view 列示 user 所擁有的 tables 、 views 、 synonyms 和 sequences
6
II 4-11 Table Information
USER_TABLES: USER_TABLES view 可獲得全部你的 tables 的 names
DESCRIBE user_tables ;
SELECT table_name FROM user_tables;
7
II 4-12 Column Information
USER_TAB_COLUMNS: USER_TAB_COLUMNS view 可得到 columns 更詳細的資料DESCRIBE user_tab_columns ;
8
II 4-13 Column Information
SELECT column_name, data_type, data_length,
data_precision, data_scale, nullable
FROM user_tab_columns
WHERE table_name = 'EMPLOYEES';
9
II 4-14 Constraint Information
USER_CONSTRAINTS : 描述你的 table 的 constraint 定義
USER_CONS_COLUMNS : 描述你擁有和被用在 constraint 的 columns
DESCRIBE user_constraints ;
10
題庫 105
II 4-15 USER_CONSTRAINTS: Example
SELECT constraint_name, constraint_type,
search_condition, r_constraint_name,
delete_rule, status
FROM user_constraints
WHERE table_name = 'EMPLOYEES';
11
STATUS:指 constraint 是否啟用中 (ENABLE)
II 4-15 USER_CONSTRAINTS
USER_CONSTRAINTS 的 CONSTRAINT_TYPE:1. C: check 或 NOT NULL
2. P: primary key
3. U:unique key
4. R:referential integrity
5. V: with check option, on a view
6. O:with read-only, on a view
12
題庫 28
II 4-16 Querying USER_CONS_COLUMNS
USER_CONS_COLUMNS : 被用在 constraint 的 column 名稱
DESCRIBE user_cons_columns
SELECT constraint_name, column_name
FROM user_cons_columns
WHERE table_name = 'EMPLOYEES';
13
II 4-18 View Information USER_VIEWS:
1. TEXT: 以 LONG 資料型態存放 SELECT 敘述 . 預設只顯示 80 個字
元 , SET LONG 1000 , 可看到多於 80 個字元2. TEXT_LENGTH: 為 SELECT 敘述的字元數DESCRIBE user_views;
SELECT view_name FROM user_views;
SELECT text FROM user_views
WHERE view_name = 'EMP_DETAILS_VIEW';
14
II 4-19 Sequence Information
DESCRIBE user_sequences;
15
II 4-20 Confirming Sequences
SELECT sequence_name, min_value, max_value,
Increment_by, last_number
FROM user_sequences;
LAST_NUMBER 欄位 : 若指定 NOCACHE, 則顯示下一個 sequence number
16
II 4-21 Index Information
USER_INDEXES : 提供關於你自己的 indexes 的資訊
USER_IND_COLUMNS : 描述在你資料表上的索引 (indexes) 欄位
DESCRIBE user_indexes;
17
II 4-22 USER_INDEXES: Examples
SELECT index_name, table_name, uniqueness
FROM user_indexes
WHERE table_name = ‘EMPLOYEES’;
SELECT index_name, table_name
FROM user_indexes
WHERE table_name = ‘EMP_LIB’;
18
II 4-23 Querying USER_IND_COLUMNS
DESCRIBE user_ind_columns;
SELECT index_name, column_name,table_name
FROM user_ind_columns
WHERE index_name = ‘LNAME_IDX’;
19
II 4-24 Synonym Information
DESCRIBE user_synonyms;
SELECT * FROM user_synonyms;
private synonyms: 指你擁有 (own) 的 synonyms
20
題庫 26
II 4-26 Adding Comments to a Table
comment ( 註解 ) : 存在於 data dictionary
COMMENT ON TABLE employees
IS 'Employee Information';
COMMENT ON COLUMN employees.first_name
IS 'First name of the employee';
Comments 可從 data dictionary 查詢 :n ALL_COL_COMMENTSn USER_COL_COMMENTSn ALL_TAB_COMMENTSn USER_TAB_COMMENTS
設定空字串 ('') 來 drop a commentCOMMENT ON TABLE employees IS '‘ ;
21
II 4-27 Quiz
The dictionary views that are based on the dictionary tables contain information such as:a. Definitions of all the schema objects in the database
b. Default values for the columns
c. Integrity constraint information
d. Privileges and roles that each user has been granted
e. All of the above
Answer: e
22
II 5-4 Using Subqueries to Manipulate Data inline view :
在 SELECT 敘述的 from 子句用 subquery 取代 table
23
II 5-5 Retrieving Data by Using a Subquery as Source loc 先 create :
先 CREATE TABLE loc AS SELECT * FROM locations ;
SELECT department_name, city
FROM departments
NATURAL JOIN (SELECT l.location_id, l.city, l.country_id
FROM loc l
JOIN countries c
ON(l.country_id = c.country_id)
JOIN regions USING(region_id)
WHERE region_name = 'Europe') ; 多個 JOIN 時 :
JOIN 加 ON 子句可和 JOIN 加 USING 子句使用 inner query 的輸出 , 對 outer query 而言 , 被視為一個 table . inner query 類似於 database view , 但沒有實體名稱 (physical name)
題庫 68
II 5-7& 5-8 Inserting by Using a Subquery as a Target
使用 subquery 取代 loc, INSERT INTO 一筆新的 European city 記錄 , 新增的資料會存到 loc
INSERT INTO (SELECT l.location_id, l.city, l.country_id
FROM loc l
JOIN countries c
ON(l.country_id = c.country_id)
JOIN regions USING(region_id)
WHERE region_name = 'Europe')
VALUES (3300, 'Cardiff', 'UK') ;
INSERT INTO :可使用 subquery 取代 table 但 , SELECT list 欄位的個數要和 VALUES 子句的 column
list 一樣SELECT location_id, city, country_id
FROM loc
24
II 5-9 Using the WITH CHECK OPTION Keyword on DML Statements
WITH CHECK OPTION : 禁止去改變那些不在 subquery 的 rows
下列程式錯誤 : query 限制 region_name 需為 'Europe', 但 VALUES 子句 , 卻
為 'US'
INSERT INTO ( SELECT location_id, city, country_id
FROM loc
WHERE country_id IN
(SELECT country_id
FROM countries
NATURAL JOIN regions
WHERE region_name = 'Europe')
WITH CHECK OPTION )
VALUES (3600, 'Washington', 'US');
25
II 5-9 Using the WITH CHECK OPTION Keyword on DML Statements
WITH CHECK OPTION: 當 subquery 被用於下列敘述 , 沒有包含在 subquery 的 rows, 不
允許被改變1. INSERT
2. UPDATE
3. DELETE
4. CREATE OR REPLACE VIEW
26
II 5-12 Explicit Default Feature: Overview
明確的預設值 (explicit defaults) 可用在 :1. INSERT
2. UPDATE
27
II 5-13 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;若 manager_id 沒有定義預設值 , 則會以 null 值取代
II 5-14 Copying Rows from Another Table
利用 INSERT INTO 加 subquery : 可從別的 table 複製 row 不可再加 VALUES 子句 INSERT 子句的欄位個數及 data type 要和 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%';
DML 敘述加 LOG ERRORS 子句 : 可使 DML 不管錯誤 , 去完成操作 Oracle 將錯誤訊息寫到你自己 creat 的 error-logging table
28
II 5-16 Multitable INSERT Statements: Overview
multitable insert : 從 subquery 得到的 rows , insert into 到一或多個 table 對 data warehouse 很有用
ETL(extraction, transformation,loading) : 從 source system, 萃取資料並引入 data warehouse 的過程 multitable insert: 就是建置 SQL data transformations 的其中技
術INSERT ALL
INTO target_a VALUES(…,…,…)
INTO target_b VALUES(…,…,…)
INTO target_c VALUES(…,…,…)
SELECT …
FROM sourcetab
WHERE … ;
29
subquery
II 5-17 Multitable INSERT Statements: Overview
multitable insert : 使用 INSERT…SELECT 敘述新增 (insert) 資料 (rows) 到多個資
料表 (multiple tables ), 當作單一 DML 敘述的部分 若不使用 multitable insert, 則處理相同 source data n 次 , 就會增
加轉換工作量 n 倍
30
II 5-18 Types of Multitable INSERT Statements
multitable insert 有 4 種 type:
1. Uncondictional INSERT: subquery 傳回的每個 row 都要 insert into 每個 target( 目標 )
tables , 只是欄位可能不同2. Condictional INSERT ALL:
subquery 傳回的每個 row 要 insert into 到符合條件的個別each target table
3. Pivoting INSERT: Uncondictional INSERT 的特例 , 所有 insert to 的 table 都一
樣 4. Condictional INSERT FIRST:
subquery 傳回的每個 row 先 insert into 到符合第一個條件的第一個 target table 其餘 rows 再去比較第二個條件 , 若符合第二個條件 , 則
insert into 到第二個 target table, 以此類推
31
II 5-19 Multitable INSERT Statements
multitable INSERT 語法 :
INSERT [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]
32
II 5-20 Multitable INSERT Statements multitable insert:
1. 只能用在 table, 不可用在 views 或 materialized views
2. 不可操作在 remote table
3. 不可指定 table collection expression
4. insert into 子句不能多於 999 個 target columns
II 5-21&5-22 Unconditional INSERT ALL Uncondictional ( 無條件 )INSERT ALL:
全部的 rows 都被 insert into 到兩個 table: sal_history 及 mgr_history VALUES 指明從 SELECT 敘述的 column , 要被 insert 到 table 的欄
位
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;
SELECT COUNT(*) total_in_sal FROM sal_history;
SELECT COUNT(*) total_in_mgr FROM mgr_history;
33
總共新增 12 筆資料
每個 row 都要insert into 每個target( 目標 ) tables , 只是欄位可能不同
II 5-23 Conditional INSERT ALL: Example
Conditional INSERT ALL :
34
II 5-24 Conditional INSERT ALL condictional INSERT ALL: 有條件新增資料
INSERT ALL WHEN 用的欄位名稱 , 同 SELECT list 的別名INSERT ALL
WHEN HIREDATE < '01-JAN-95' THEN
INTO emp_history VALUES(EMPID,HIREDATE,SAL)
WHEN COMM IS NOT NULL THEN
INTO emp_sales VALUES(EMPID,COMM,SAL)
SELECT employee_id EMPID, hire_date HIREDATE,
salary SAL, commission_pct COMM
FROM employees ;
SELECT count(*) FROM emp_history;
SELECT count(*) FROM emp_sales;
35
總共新增 48 筆資料
每個 row 要insert into 到符合條件的個別 each target table
題庫 35
II 5-25 Conditional INSERT ALL
INSERT ALL
WHEN job_id IN
(select job_id FROM jobs WHERE job_title LIKE '%Manager%') THEN
INTO managers2(last_name,job_id,SALARY)
VALUES (last_name,job_id,SALARY)
WHEN SALARY>10000 THEN
INTO richpeople(last_name,job_id,SALARY)
VALUES (last_name,job_id,SALARY)
ELSE
INTO poorpeople VALUES (last_name,job_id,SALARY)
SELECT * FROM employees ;
36
題庫 8
題庫 32
II 5-26 Conditional INSERT FIRST: Example
若員工的薪資為 2000, 則只有 insert into 到 SAL_LOW 的 table
37
II 5-27 Conditional INSERT FIRST
INSERT FIRST: 若第一個 when 符合 , 則這筆 row insert into 到第一個
table(sal_low), 且跳過接續的 when 子句 若第一個 when 不符合 , 但符合第二個 when, 則這筆 row insert into
到第二個 table(sal_mid), 且跳過接續的 when 子句 以此類推 , 若全部 when 條件都不符合 , 則執行 ELSE 子句INSERT FIRST
WHEN salary < 5000 THEN
INTO sal_low VALUES (employee_id, last_name, salary)
WHEN salary between 5000 and 10000 THEN
INTO sal_mid VALUES (employee_id, last_name, salary)
ELSE
INTO sal_high VALUES (employee_id, last_name, salary)
SELECT employee_id, last_name, salary
FROM employees ;
38
題庫 67
II 5-29 Pivoting INSERT
Pivoting INSERT : 轉換非關聯式 (nonrelational ) 資料庫到 relational ( 關聯式格式 )
format
39
II 5-30 Pivoting INSERT
Pivoting INSERT : INSET ALL INTO 到同一個 table, 只是 column 有點不同 此例 : 一筆 row 轉換成 5 筆資料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 ;
40
INSERT INTO 到同一個資料表(salse_info)
題庫 5
II 5-33 MERGE Statement
MERGE: 提供條件式 (condictionally)
1. update: 當 row 已存在時2. insert: 新增一個 new row
3. delete 可避免分開的 update 不可在 target table 的相同 row, update 很多次 增加 performance 及使用簡單 對 data warehousing application 有用
41
II 5-34 MERGE Statement Syntax MERGE INTO :
USING (table 或 view 或 subquery) INSERT 指令 :
1.可以不用 INTO
2.可用 WHERE 子句MERGE INTO table_name table_alias
USING (table|view|sub_query) alias
ON (join condition)
WHEN MATCHED THEN
UPDATE SET
col1 = col1_val,
col2 = col2_val
WHEN NOT MATCHED THEN
INSERT (column_list)
VALUES (column_values) ;
42
II 5-35 Merging Rows: Example 在 COPY_EMP3 資料表新增或修改資料列 MERGE INTO copy_emp3 c
USING (SELECT * FROM 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.email = e.email,
c.phone_number = e.phone_number,
c.hire_date = e.hire_date,
c.job_id = e.job_id,
c.salary = e.salary*2,
c.commission_pct = e.commission_pct,
c.manager_id = e.manager_id,
c.department_id = e.department_id
DELETE WHERE (E.COMMISSION_PCT IS NOT NULL)
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) ;43
注意 : Copy_emp3c 資料表要先新增
CREATE TABLE COPY_EMP3 AS SELECT * FROM EMPLOYEESWHERE SALARY<10000 ;
Copy_emp3c 經過 MERGE INTO 後:1.Employees 資料表的SALARY<10000 且 commission_pct 不為 NULL 者 , 會從 Copy_emp3c 被刪除2.Employees 資料表的SALARY<10000 且 commission_pct 為 NULL 者 , 會被更新到 Copy_emp3c 薪水加倍3.Employees 資料表的SALARY>10000 會被新增到Copy_emp3c
題庫 73
題庫 51
注意 :employee_id 欄位不可被 UPDATE
II 5-39 Tracking Changes in Data 追蹤資料的改變 :
在查詢資料表時 , 使用 VERSIONS clause 產生所有版本 (versions), 抓取版本的時間為 : 下查詢指令和現在時間 (current time) 之前的undo_retention seconds 之間 undo_retention is an initialization parameter, which is an
autotuned parameter ( 自動調整的參數 )
44
System change number (SCN): The Oracle server assigns an SCN to identify the redo records for each committed transaction
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;
II 5-40 Flashback Version Query: Example
45
1
2
3
看到先後 2 次SELECT 查詢的資料
題庫 138
II 5-42 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‘ ;
46
補充 :CREATE TABLE digits
(id NUMBER(2), description VARCHAR2(15));
INSERT INTO digits VALUES (1,'ONE');
UPDATE digits
SET description ='TWO'
WHERE id=1;
INSERT INTO digits VALUES (2,'TWO');
COMMIT;
DELETE FROM digits;
SELECT description
FROM digits
VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE;
47
題庫 31
What would be the outcome of the above query? A. It would not display any values. B. It would display the value TWO once. C. It would display the value TWO twice. D. It would display the values ONE, TWO, and TWO.
Answer: C
II 5-43 Quiz
When you use the INSERT or UPDATE command, the DEFAULT keyword saves you from hard-coding the default value in your programs or querying the dictionary to find it.a. True
b. False
Answer: a
48