05-数据处理

DML 数据操作语言

  向表中插入数据

  修改现存数据

  删除现存数据

 

增:

  insert  into  表名 values(......);列顺序要与表一致;

  insert  into 表名 select  * from 表名 where .... ;列也要对应;

改:

  update  表名  set  ...  where  条件

删:

  delete  表名 where 条件;

 

 1 --插入数据
 2 --为每一列添加一个新值。
 3 --按列的默认顺序列出各个列的值。 
 4 --在 INSERT 子句中随意列出列名和他们的值。
 5 --字符和日期型数据应包含在单引号中。
 6 INSERT INTO departments(department_id, department_name, 
 7                         manager_id, location_id)
 8 VALUES      (70, 'Public Relations', 100, 1700);
 9 --
10 INSERT INTO employees(employee_id,last_name,email,hire_date,job_id)
11 VALUES  (300,'Tom','tom@126.com',to_date('2012-3-21','yyyy-mm-dd'),'SA_RAP');
12 
13 --SYSDATE 记录当前系统的日期和时间
14 INSERT INTO employees (employee_id, 
15                  first_name, last_name, 
16                  email, phone_number,
17                  hire_date, job_id, salary, 
18                  commission_pct, manager_id,
19                  department_id)
20 VALUES           (113, 
21                  'Louis', 'Popp', 
22                  'LPOPP', '515.124.4567', 
23                  SYSDATE, 'AC_ACCOUNT', 6900, 
24                  NULL, 205, 100);
25 
26 --在SQL 语句中使用 & 变量指定列值。
27 -- & 变量放在VALUES子句中。       
28 INSERT INTO departments 
29             (department_id, department_name, location_id)
30 VALUES      (&department_id, '&department_name',&location);
31 
32 --从其它表中拷贝数据
33 --不必书写 VALUES 子句。 
34 --子查询中的值列表应与 INSERT 子句中的列名对应
35 INSERT INTO emp2 
36 SELECT * 
37 FROM employees
38 WHERE department_id = 90;
39 
40 --更新数据
41 --使用where 子句指定需要更新的数据;如果省略where,则表中所有数据都将被更新;
42 UPDATE     copy_emp
43 SET        department_id = 110
44 where employee_id='113';
45 
46 --题目:更新 114号员工的工作和工资使其与205号员工相同。
47 UPDATE   employees
48 SET      job_id  = (SELECT  job_id 
49                     FROM    employees 
50                     WHERE   employee_id = 205), 
51          salary  = (SELECT  salary 
52                     FROM    employees 
53                     WHERE   employee_id = 205) 
54 WHERE    employee_id    =  114;
55 
56 --题目:调整与employee_id 为200的员工job_id相同的员工的department_id为employee_id为100的员工的department_id。
57 UPDATE  copy_emp
58 SET     department_id  =  (SELECT department_id
59                            FROM employees
60                            WHERE employee_id = 100)
61 WHERE   job_id         =  (SELECT job_id
62                            FROM employees
63                            WHERE employee_id = 200);
64 
65 --删除数据
66 --使用where 子句指定需要删除的数据;如果省略where,则表中所有数据都将被删除;
67 DELETE FROM departments
68 WHERE  department_name = 'Finance';
69 
70 --在 DELETE 中使用子查询
71 --题目:从emp1表中删除dept1部门名称中含Public字符的部门id
72 DELETE FROM emp1
73 WHERE  department_id =
74                        (SELECT department_id
75                         FROM   dept1
76                         WHERE  department_name LIKE '%Public%');

 

数据库事务

  事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。

 

  以第一个 DML 语句的执行作为开始

  以下面的其中之一作为结束:

  COMMIT 或 ROLLBACK 语句

  DDL 语句(自动提交)

  用户会话正常结束

  系统异常终止

 

使用COMMIT 和 ROLLBACK语句,我们可以: 

  确保数据完整性。

  数据改变被提交之前预览。

  将逻辑上相关的操作分组。

 

回滚到保留点

  使用 SAVEPOINT 语句在当前事务中创建保存点。

  使用 ROLLBACK TO SAVEPOINT 语句回滚到创建的保存点。 

1 UPDATE...
2 SAVEPOINT update_done;
3 --Savepoint created.
4 INSERT...
5 ROLLBACK TO update_done;
6 --Rollback complete.

 

事务进程

自动提交在以下情况中执行:

  DDL 语句。

  DCL 语句。

  不使用 COMMIT 或 ROLLBACK 语句提交或回滚,正常结束会话。

  会话异常结束或系统异常会导致自动回滚。

 

提交或回滚前的数据状态:

  改变前的数据状态是可以恢复的

  执行 DML 操作的用户可以通过 SELECT 语句查询之前的修正

  其他用户不能看到当前用户所做的改变,直到当前用户结束事务。

  DML语句所涉及到的行被锁定, 其他用户不能操作。

 

 

提交后的数据状态

  数据的改变已经被保存到数据库中。

  改变前的数据已经丢失。

  所有用户可以看到结果。

  锁被释放,其他用户可以操作涉及到的数据。

  所有保存点被释放。

 1 --改变数据
 2 DELETE FROM employees
 3 WHERE  employee_id = 99999;
 4 --1 row deleted.
 5 
 6 INSERT INTO departments 
 7 VALUES (290, 'Corporate Tax', NULL, 1700);
 8 --1 row inserted.
 9 
10 --提交改变
11 COMMIT;
12 --Commit complete

 

数据回滚后的状态

  使用 ROLLBACK 语句可使数据变化失效:

  数据改变被取消。

  修改前的数据状态被恢复。

  锁被释放。

1 DELETE FROM copy_emp;
2 --22 rows deleted.
3 ROLLBACK;
4 --Rollback complete.

 

eg:

 1 --运行以下脚本创建表my_employees
 2 Create table my_employee (
 3                       id         number(3),
 4                       first_name varchar2(10),
 5                       Last_name  varchar2(10),
 6                       User_id    varchar2(10),
 7                       Salary     number(5));
 8 
 9 --显示表my_employees的结构
10 DESC my_employees;
11 
12 --向表中插入下列数据
13 INSERT INTO my_employee
14 VALUES(1,’patel’,’Palph’,’Rpatel’895);
15 
16 --提交
17 COMMIT;
18 
19 --将3号员工的last_name修改为“drelxer”
20 UPDATE my_employees
21 SET last_name = ‘drelxer’
22 WHERE id = 3;
23 
24 --将所有工资少于900的员工的工资修改为1000
25 UPDATE my_employees
26 SET salary = 1000
27 WHERE salary< 900;
28 
29 --检查所作的修正
30 SELECT * FROM my_employees
31 WHERE salary < 900;
32 
33 --提交
34 COMMIT;
35 
36 --删除所有数据
37 DELETE FROM my_employees;
38 
39 --检查所作的修正
40 SELECT * FROM my_employees;
41 
42 --回滚
43 ROLLBACK;
44 
45 --清空表my_employees
46 TRUNCATE TABLE my_employees;

 

posted @ 2020-08-02 15:15  路修索  阅读(133)  评论(0编辑  收藏  举报