数据库操作语句:

INSERT INTO 表名[(字段列表)] VALUES ( 表达式列表);

例子:INSERT INTO emp(empno,ename,job,hiredate) VALUES (1001, '小马', 'CLERK', to_date('2004-11-27','yyyy-mm-dd'));

INSERT INTO 表名(字段列表) SELECT(字段名1, 字段名2, ...) FROM 另外的表名;

例子:INSERT INTO manager SELECT empno, ename, sal,job FROM emp WHERE job = 'CLERK';

修改数据的语句UPDATE对表中指定字段的数据进行修改,一般需要通过添加WHERE条件来限定要进行修改的行,如果不添加WHERE条件,将对所有的行进行修改。 (1) 修改数据的语句UPDATE的基本语法如下: UPDATE 表名 SET 字段名1=表达式1, 字段名2=表达式2, ... WHERE 条件;

本例中不能省略WHERE条件,否则将会修改表的所有行。

UPDATE 表名 SET(字段名1, 字段名2, ...)=SELECT (字段名1, 字段名2, ...) FROM 另外的表名WHERE条件;

例子:UPDATE manager SET (ename, sal) =(SELECT ename,sal FROM emp WHERE empno = 7788) WHERE empno = 2000;

删除数据的基本语法如下: DELETE FROM 表名 WHERE 条件; 要从表中删除满足条件的记录,WHERE条件一般不能省略,如果省略就会删除表的全部数据。

删除记录并不能释放Oracle中被占用的数据块表空间,它只是把那些被删除的数据块标成unused。

DELETE FROM emp WHERE empno=1000;

如果确实要删除一个大表里的全部记录,可以用TRUNCATE 命令,它可以释放占用的数据块表空间,语法为: TRUNCATE TABLE 表名;

删除重复记录

方法原理:

1、Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的, rowid确定了每条记录是在ORACLE中的哪一个数据文件、块、行上。

2、在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中   那些具有最大rowid的就可以了,其余全部删除。

彻底删除manager表的内容。

执行以下的命令: TRUNCATE TABLE manager;

执行结果: 表已截掉。

说明:此命令和不带WHERE条件的DELETE语句功能类似,不同的是,DELETE命令进行的删除可以撤销,但此命令进行的删除不可撤销。

注意:TRUNCATE TABLE命令用来删除表的全部数据而不是删除表,表依旧存在。数据不能恢复,不用commit,不能rollback;

数据库事务

事务的特征:ACID

原子性(Atomicity) : 数据库中的事务执行是作为原子,不可再分,整个语句要么执行,要么不执行

一致性(Consistency) : 在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏(如外键、not null)

理解隔离性(Isolation) : 事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据

理解持久性(Durability) : 在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚

Oracle的事务控制:

Dirty read: 脏读意味着一个事务读取了另一个事务未提交的数据

Phantom read: 幻读,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。如果第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样

Unrepeatable Read :不可重复读,即一个事务范围内两个相同的查询却返回了不同数据

Lost update: 丢失更新,即两个并发的事务,后提交的事务把先提交事务的修改结果覆盖了

Oracle的事务控制:

Read uncommited :性能最佳,但允许出现脏读

Read commited : 不允许脏读,可能出现不可重复读,幻读

Repeatable Read: 可以重复读,没有脏读,可能出现幻读

Serializable: 性能最差,但安全性最高 Oracle默认的事务级别为read commited

数据库事务的应用

数据库事务处理可分为隐式和显式两种。

显式事务操作通过命令实现,隐式事务由系统自动完成提交或撤销(回退)工作,无需用户的干预。

隐式提交的情况包括:当用户正常退出SQL*Plus或执行CREATE、DROP、GRANT、REVOKE等命令时会发生事务的自动提交。

还有一种情况,如果把系统的环境变量AUTOCOMMIT设置为ON(默认状态为OFF),则每当执行一条INSERT、DELETE或UPDATE命令对数据进行修改后,就会马上自动提交。

设置命令格式如下:

SET AUTOCOMMIT ON/OFF

隐式回退的情况包括:当异常结束SQL*Plus或系统故障发生时,会发生事务的自动回退。

表的锁定:

隐式锁和显式锁

在Oracle数据库中,修改数据操作时需要一个隐式的独占锁,以锁定修改的行,直到修改被提交或撤销为止。 如果一个会话锁定了数据,那么第二个会话要想对数据进行修改,只能等到第一个会话对修改使用COMMIT命令进行提交或使用ROLLBACK命令进行回滚撤销后,才开始执行。

默认是隐式加锁,主动锁定行或表,防止其他会话对数据的修改

锁定行:

SELECT * FROM emp WHERE deptno=10 FOR UPDATE;

锁定表:

LOCK语句用于对整张表进行锁定。

语法如下: LOCK TABLE 表名 IN {SHARE|EXCLUSIVE} MODE 对表的锁定可以是共享(SHARE)或独占(EXCLUSIVE)模式。共享模式下,其他会话可以加共享锁,但不能加独占锁。在独占模式下,其他会话不能加共享或独占锁。

乐观锁和悲观锁

悲观锁(Pessimistic Locking):在整个数据处理过程中,采取保守态度,将数据全部处于锁定 状态(不允许修改、删除)  如: SELECT * FROM emp WHERE deptno=10 FOR UPDATE; (只允许查询,不允许修改和删除锁定的数据)

乐观锁( Optimistic Locking ):乐观假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。 乐观锁通常采用检查version、时间戳、关键数据等方式 select ver from emp where empno=7782; update emp set sal =1909,ver=ver+1 where empno=7782 and ver=20; 由于悲观锁在并发环境中影响性能,建议尽量使用乐观锁!