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;