第四天 数据操作和事务
第四天 数据操作和事务
变量:&
可以用于:表名,where子句,order by,列的表达式,select
SQL> select empno,ename,job,&column_name from emp
2 where &conditon
3 order by &order_condition;
DML
DML:数据操作语言:insert,update,delete,merge
insert
当使用values子句时,一次只能插入一行数据
当使用子查询插入数据时,一条insert语句可以插入大量的数据.
当处理行迁移或者装载外部表的数据到数据库时,可以使用子查询来插入数据.
insert语法
insert into 表名[(字段...)] values(对应字段的值);
自我复制
insert into 表名 (select * from 表名)
从其它表中拷贝数据
insert into emp_bak(select empno,ename,sal from emp where deptno=10);
insert into dept values(50,'develop','chongqing');
insert into dept(deptno,dname,loc) values(60,'test','chengdu');
insert into dept(deptno) values(70);
insert into dept(deptno,dname) values(80,null);
如果没有提交事务commit,其它用户或者本用户在其它窗口中看不到插入的数据
插入日期
Insert into emp(empno,ename,hiredate)
values(1111,'Nance',to_date('
update
update 表名 set 字段(列名)=value [where condition]
更新一个一个字段
update emp set sal=sal+200 where ename='SMITH';
更新多个字段
update emp set sal=1200,job='MANAGER' where ename='Nance';
更新所有的员工的薪水和员工KING的薪水一样
update emp set sal=(select sal from emp where ename='KING');
更新员工Nance的薪水和员工KING的薪水一样
update emp set sal=(select sal from emp where ename='KING') where ename='Nance';
delete
delete [from] 表名 [where condition];
删除薪水大于ADAMS的记录
delete from emp_bak where sal>(select sal from emp where ename='ADAMS');
delete,drop和truncate的区别
delete:值删除表的数据,不删除表结构
drop:删除表的数据和结构 drop table 表名
truncate table 表名:删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快 注意:
使用drop删除了表结构之后不能用rollback回滚,而用delete删除数据之后可以用rollback回滚
delete可以不要from,但是drop必须用table,因为delete是对数据的操作,而drop是对表操作
注意:删除的时候不能违反数据完整性
SQL语言分类
查询语言:select
DML:数据操作语言:insert,update,delete,merge
DDL:数据定义语言:create,alter,drop
DCL:数据控制语言:grant,revoke
事务控制语言:commit,rollback,savepoint
什么是事务
定义:一组相关的数据改变的逻辑集合。
事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。
如:网上转账就是典型的要用事务来处理,用以保证数据的一致性。
事务的ACID特征
atomicity 原子性:指事务中的操作,或者都完成,或者都取消
consistency 一致性:指事务中的操作保证数据库中的数据不会出现逻辑上的不一致情况,一致性一般会隐含的包括在其它属性之中。
isolation 隔离性:指当前的事务与其它为完成的事务是隔离的。在不同的隔离级别下,事务的读取操作,可以得到的结果是不同的
durability 持久性:指对事务发出commit命令后,及时这时发生系统故障,事务的效果也被持久化了。与此相反的是,当在事务执行过程中,系统发生故障,则事务的操作都被回滚,即数据库回到事务开始之前的状态。
隔离级别:
1)read uncommited一个会话可以读取其它事务未提交的更新结果。
2)read committed只能读取其他事务已经提交的更新结果,否则发生等待。但是其它会话可以修改这个事务中被读取的记录,而不必等待事务结束,显然,在这种隔离级别下,一个事务中的两个相同的读取操作,其结果可能不同。
3)read repeatable一般通过在整个事务期间给读取的立即加锁实现,这样,在这个事务结束前,其它会话不能修改事务中读取的记录,而只能等待事务结束。
4)serializable:(也称为事务级别的隔离)一般通过在整个事务期间给表加锁实现隔离级别,在这种隔离级别下,对这个表的所有DML操作都是不允许的,即要等待事务结束。
韩顺平
■ 事务隔离级别
概念:隔离级别定义了事务与事务之间的隔离程度。
ANSI/ISO SQL92标准定义了一些数据库操作的隔离级别(这是国际标准化组织定义的一个标准而已,不同的数据库在实现时有所不同):
隔离级别 |
脏读 |
不可重复读 |
幻读 |
读未提交(Read uncommitted) |
V |
V |
V |
读已提交(Read committed) |
x |
V |
V |
可重复读(Repeatable read) |
x |
x |
V |
可串行化(Serializable ) |
x |
x |
x |
V 可能出现 x 不会出现
■ 事务隔离级别
脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。
不可重复读(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。
幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。
■ oracle的事务隔离级别
ORACLE提供了SQL92标准中的read committed和serializable,同时提供了非SQL92标准的read-only
◆ oracle的 read committed 说明:
①这是ORACLE缺省的事务隔离级别。
②保证不会脏读;但可能出现非重复读和幻像。
◆ oracle的 serializable 说明:
①serializable就是使事务看起来象是一个接着一个地顺序地执行(从效果上可以这样理解)
②仅仅能看见在本事务开始前由其它事务提交的更改和在本事务中所做的更改
③保证不会出现脏读、不可重复读和幻读
④Serializable隔离级别提供了read-only事务所提供的读一致性(事务级的读一致性),同时又允许DML(update/insert/delete)操作
■ oracle的事务隔离级别
◆ oracle的 read only 说明:
①遵从事务级的读一致性,仅仅能看见在本事务开始前由其它事务提交的更改。
②不允许在本事务中进行DML(insert,update,delete)操作。
③read only是serializable的子集。它们都避免了不可重复读和幻读。区别是在read only中是只读;而在serializable中可以进行DML操作
■ oracle的事务隔离级设置
◆ 设置一个事务的隔离级别
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION READ ONLY;
◆ 设置整个会话的隔离级别
ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE;
ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED;
oracle中的事务:
支持read committed(语句级别的隔离级别,默认的) 和Serializable级别
设置事务隔离级别
set transaction isolation level read commmitted
释放锁:在rollback和commit之后
数据库事务的组成:
一个事务可以有多个DML
一个DDL语句
一个DCL语句
事务的开始: 以一个DML语句的执行为开始
事务的结束: 以commit或rollback语句
DDL或DCL语句(自动提交)
用户会话正常结束
系统异常终止
■ 事务和锁
当执行事务操作时(dml语句),oracle会在被作用的表上加锁,防止其它用户改表表的结构.这里对我们用户来讲是非常重要的。
锁:
独占锁: 屏蔽其他用户。
共享锁: 允许其他用户操作。
■ 提交事务
当执使用commit语句可以提交事务.当执行了commit语句子后,会确认事务的变化、结束事务、删除保存点、释放锁,当使用commit语句结束事务子后,其它会话将可以查看到事务变化后的新数据
■ 回退事务
在介绍回退事务前,我们先介绍一下保存点(savepoint)的概念和作用.保存点是事务中的一点.用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点.
当执行rollback时,通过指定保存点可以回退到指定的点,这里我们作图说明
■ 事务的几个重要操作
1) 设置保存点
savepoint 保存点名
2) 取消部分事务
rollback to 保存点名
3) 取消全部事务
rollback
4)提交事务
Commit