第八章 數據處理
1.數據操縱語言
DML(Data Manipulation Language – 數據操縱語言) 可以在下列條件下執行:
向表中插入數據
修改現存數據
刪除現存數據
事務是由完成若干項工作的DML語句組成的
2.INSERT 語句語法
使用 INSERT 語句向表中插入數據。
使用這種語法一次只能向表中插入一條數據。
INSERT INTO table [(column [, column...])]
VALUES (value [, value...]);
2.1插入數據
爲每一列添加一個新值。
按列的默認順序列出各個列的值。
在 INSERT 子句中隨意列出列名和他們的值。
字符和日期型數據應包含在單引號中。
例如:
INSERT INTO departments(department_id, department_name,
manager_id, location_id)
VALUES (70, 'Public Relations', 100, 1700);
INSERT INTO employees(employee_id,last_name,email,hire_date,job_id)
VALUES (300,’Tom’,’[email protected]’,to_date(‘2012-3-21’,’yyyy-mm-dd’),’SA_RAP’);
1 row created.
2.2向表中插入空值
隱式方式: 在列名錶中省略該列的值。
INSERT INTO departments (department_id,
department_name )
VALUES (30, 'Purchasing');
顯示方式: 在VALUES 子句中指定空值。
INSERT INTO departments
VALUES (100, 'Finance', NULL, NULL);
2.3插入指定的值
INSERT INTO employees (employee_id,
first_name, last_name,
email, phone_number,
hire_date, job_id, salary,
commission_pct, manager_id,
department_id)
VALUES (113,
'Louis', 'Popp',
'LPOPP', '515.124.4567',
SYSDATE, 'AC_ACCOUNT', 6900,
NULL, 205, 100);
2.4從其它表中拷貝數據,在 INSERT 語句中加入子查詢。
INSERT INTO emp2
SELECT *
FROM employees
WHERE department_id = 90;
INSERT INTO sales_reps(id, name, salary, commission_pct)
SELECT employee_id, last_name, salary, commission_pct
FROM employees
WHERE job_id LIKE '%REP%';
不必書寫 VALUES 子句。
子查詢中的值列表應與 INSERT 子句中的列名對應
3.使用 UPDATE 語句更新數據。
UPDATE table
SET column = value [, column = value, ...]
[WHERE condition];
3.1使用 WHERE 子句指定需要更新的數據。
UPDATE employees
SET department_id = 70
WHERE employee_id = 113;
如果省略 WHERE 子句,則表中的所有數據都將被更新
UPDATE copy_emp
SET department_id = 110;
22 rows updated.
3.2在 UPDATE 語句中使用子查詢
題目:更新 114號員工的工作和工資使其與205號員工相同。
UPDATE employees
SET job_id = (SELECT job_id
FROM employees
WHERE employee_id = 205),
salary = (SELECT salary
FROM employees
WHERE employee_id = 205)
WHERE employee_id = 114;
題目:調整與employee_id 爲200的員工job_id相同的員工的department_id爲employee_id爲100的員工的department_id。
UPDATE copy_emp
SET department_id = (SELECT department_id
FROM employees
WHERE employee_id = 100)
WHERE job_id = (SELECT job_id
FROM employees
WHERE employee_id = 200);
注意更新中的數據完整性錯誤
4.DELETE 語句,使用 DELETE 語句從表中刪除數據。
DELETE FROM table
[WHERE condition];
使用 WHERE 子句刪除指定的記錄。
DELETE FROM departments
WHERE department_name = 'Finance';
如果省略 WHERE 子句,則表中的全部數據將被刪除
DELETE FROM copy_emp;
22 rows deleted.
4.2在 DELETE 中使用子查詢,使刪除基於另一個表中的數據。
題目:從emp1表中刪除dept1部門名稱中含Public字符的部門id
DELETE FROM emp1
WHERE department_id =
(SELECT department_id
FROM dept1
WHERE department_name LIKE '%Public%');
5.數據庫事務
事務:一組邏輯操作單元,使數據從一種狀態變換到另一種狀態。
數據庫事務由以下的部分組成:
一個或多個DML 語句
一個 DDL(Data Definition Language – 數據定義語言) 語句
一個 DCL(Data Control Language – 數據控制語言) 語句
以第一個 DML 語句的執行作爲開始
以下面的其中之一作爲結束:
COMMIT 或 ROLLBACK 語句
DDL 語句(自動提交)
用戶會話正常結束
系統異常終止
COMMIT和ROLLBACK語句的優點:
使用COMMIT 和 ROLLBACK語句,我們可以:
確保數據完整性。
數據改變被提交之前預覽。
將邏輯上相關的操作分組。
回滾到保留點:
使用 SAVEPOINT 語句在當前事務中創建保存點。
使用 ROLLBACK TO SAVEPOINT 語句回滾到創建的保存點。
UPDATE...
SAVEPOINT update_done;
Savepoint created.
INSERT...
ROLLBACK TO update_done;
Rollback complete.