文章目录
Oracle处理数据DML的操作,Oracle增删改操作
1.数据操作语言DML
DML(Data Manipulation Language,数据操作语言) 可以在下列条件下执行:
向表中插入数据(insert),修改现存数据(update),删除现存数据(delete)。
事务是由完成若干项工作的DML语句组成的。
执行完DML操作后,如果没有设置自动提交,则需要自己手动提交或回滚事务。
2.插入数据
2.1insert语句语法
使用INSERT语句向表中插入数据。
使用这种语法一次只能向表中插入一条数据。
2.2插入数据
- 为每一列添加一个新值。
- 按列的默认顺序列出各个列的值。
- 在INSERT子句中随意列出列名和它们的值。
- 字符和日期型数据应包含在单引号中。
2.3向表中插入空值
select * from dept;
隐式方式: 在列名表中省略该列的值。
insert into dept (deptno, dname) values (50, 'TEST');
显式方式: 在VALUES子句中指定空值。
insert into dept values (60, 'MANAGER', null);
2.4插入指定的值
insert into emp
(empno,ename,hiredate,sal)
values
(8001,'GIGI',sysdate,4000);
说明:SYSDATE
记录当前系统的日期和时间。
2.5创建脚本(使用&变量指定值)
在SQL语句中使用&
变量指定值。&
后变量名称可以自定义,如果变量名称对应的字段需要使用单引号引起来,则可以在&变量名
上直接用单引号引起来,不需要在输入变量值的时候加单引号。
insert into emp (empno, ename, sal) values (&empno, '&ename', &sal);
insert into emp (empno, ename, sal) values (&empno, &ename, &sal);
select empno,ename,&column from emp;
select * from &table;
update emp set ename='&new_name' where empno=&empno
2.6从其它表中拷贝数据(Insert Into … Select …)
insert into mytable
select mycolums from ...
不必书写VALUES关键字。
子查询中的值列表应与INSERT子句中的列名对应。
insert into emp1 (empno, ename, sal)
select empno, ename, sal from emp deptno = 30
3.更新数据
3.1语法
3.2一般用法示例
- 使用where子句指定需要更新的数据
update emp
set ename = 'JOHN', job = 'SALESMAN'
where empno = 8002;
- 如果省略where子句,则表中的所有数据都将被更新
3.3在update语句中使用子查询
例,更新8001号员工的工作和工资使其与7900号员工相同
update emp
set job = (
select job from emp where empno = 7900
),
sal = (
select sal from emp where empno = 7900
)
where empno = 8001;
或者
update emp
set (job, sal) = (
select job,sal from emp where empno = 7900
)
where empno = 8001;
4.删除数据
4.1语法
4.2一般用法示例
- 使用where子句指定删除的记录。
delete from emp where empno = 8001;
- 如果省略where子句,则表中的全部数据将被删除。
4.3在DELETE中使用子查询
在delete中使用子查询,使删除基于另一个表中的数据
delete from emp
where empno in
(select empno from emp where deptno is null)
4.5delete和truncate
- 都是删除表中的数据
- delete操作可以rollback,可以闪回
- delete操作可能产生碎片,并且不释放空间
- truncate操作是清空表
truncate table bonus;
5.数据库事务
5.1事务基础
数据库事务由以下的部分组成:
- 一个或多个DML语句
- 一个DDL(Data Definition Language,数据定义语言)语句
- 一个DCL(Data Control Language,数据控制语言)语句
数据库事务:
- 以第一个DML语句的执行作为开始
- 以下面的其中之一作为结束:
- 显式结束:commit,rollback
- 隐式结束(自动提交):DDL语言,DCL语言,exit(事务正常退出)
- 隐式回滚(系统异常终了):关闭窗口,死机,停电
使用COMMIT和ROLLBACK语句,可以:
- 确保数据完整性。
- 数据改变被提交之前预览。
- 将逻辑上相关的操作分组。
5.2控制事务
- 保存点
- 使用SAVEPOINT语句在当前事务中创建保存点。
- 使用ROLLBACK TO SAVEPOINT语句回滚到创建的保存点。
5.3事务进程
-
自动提交在以下情况中执行:
- DDL语句。
- DCL语句。
- 不使用COMMIT或ROLLBACK语句提交或回滚,正常结束会话exit。
- 会话异常结束或系统异常会导致自动回滚。
要使DML操作自动提交,把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,系统将自动进行提交。其格式为:
SQL> SET AUTOCOMMIT ON;
-
提交或回滚前的数据状态
- 改变前的数据状态是可以恢复的
- 执行DML操作的用户可以通过SELECT语句查询之前的修正
- 其他用户不能看到当前用户所做的改变,直到当前用户结束事务。
- DML语句所涉及到的行被锁定, 其他用户不能操作。
-
提交后的数据状态
- 数据的改变已经被保存到数据库中。
- 改变前的数据已经丢失。
- 所有用户可以看到结果。
- 锁被释放,其他用户可以操作涉及到的数据。
- 所有保存点被释放。
提交数据示例:
- 数据回滚后的状态
使用ROLLBACK语句可使数据变化失效:
①数据改变被取消。
②修改前的数据状态被恢复。
③锁被释放。
5.4数据库的事务隔离级别
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
- 脏读:对于两个事物T1, T2, T1读取了已经被T2更新但还没有被提交的字段之后, 若T2回滚,T1读取的内容就是临时且无效的。
- 不可重复读:对于两个事物T1, T2, T1读取了一个字段,然后T2更新了该字段. 之后,T1再次读取同一个字段,值就不同了。
- 幻读:对于两个事物T1, T2, T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行之后,如果T1再次读取同一个表,就会多出几行。
数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题。
一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。
- 数据库提供的 4 种事务隔离级别:
Oracle支持的2种事务隔离级别:READ COMMITED,SERIALIZABLE。Oracle默认的事务隔离级别为:READ COMMITED。
MySQL支持4种事务隔离级别。MySQL默认的事务隔离级别为:REPEATABLE READ。
设置事务隔离级别:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;