数据库操作语句:
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; 由于悲观锁在并发环境中影响性能, 建议尽量使用乐观锁!
来源: https://www.cnblogs.com/kxykxykxy/p/11884384.html