1.insert语句
为列指定空行:insert into customers values(1,'tom','steve',null,null);
从一个表向另外一个表复制行
insert语句中,可以不使用列值,而是使用查询从一个表向另外一个表复制行;此时要求源表和目标表的列数和列的类型必须匹配。
insert into customers(customer_id,first_name,last_name) select 10 ,first_name,last_name from customers where customer_id=1;
2.update语句
在update语句中使用returning子句返回使用聚合函数计算的结果
variable average_product_price number
update products set price=price*0.75 returning avg(price) into :average_product_price;
3.merge语句
merge语句可以用来将一个表中的行合并到另外一个表中,如将product_changes表中的变化合并到products表中
merge into products p
using product_changes pc on(
p.product_id=pc.product_id
)
when matched then
update
set
p.product_type_id=pc.product_type_id,
p.name=pc.name,
p.description=pc.description,
p.price=pc.price
when not matched then
insert(
p.product_id,p.product_type_id,p.name,p.description,p.price) values
(pc.product_id,pc.product_type_id,pc.name,pc.description,pc.price);
4.数据库事务
数据库事务(transaction)就是一组sql语句,这组sql语句是一个逻辑工作单元,我们可以认为事务就是一组不可分割的sql语句,在执行时,应该作为一个整体永久地写该数据库的内容,或者作为一个整体取消对数据库的修改。事务通常包含多个insert,update,delete语句(即DML)。
事务的提交与回滚
要永久性地记录事务中sql语句的结果,需要执行commit语句从而提交(commit)事务。要取消sql语句的结果,需要执行rollback语句,从而回滚(rollback)事务。rollback语句可以将行从新设置为原始状态,在执行回滚操作之前对数据库进行的任何修改操作都会被取消,条件是此前没有断开与数据库的连接。
事务的开始于结束
事务是用来分割数据库活动的逻辑工作单元,事务既有起点,也有终点,当下列事件之一发生时,事务就开始了:
1.连接到数据库上,并执行第一条DML语句
2.前一个事务结束后,有输入了另外一条DML语句
当下列事件之一发生时,事务就结束了:
1.执行commit或rollback语句
2.执行一个DDL语句,例如create table 语句;在这种情况下,会自动执行commit语句
3.执行一个DCL语句,例如grant语句,在这种情况下,会自执行commit语句
4.断开与数据库的连接,在退出sql*plus时,通常会输入exit命令,此时会自动执行commit语句。如果sql*plus被意外终止了。那么就会自动执行rollback语句,这适用于任何会访问数据库的程序。
5.执行一条DML语句,该语句却失败了;在这种情况下,会为这个无效的DML语句执行rollback语句
保存点
在事务中的任何地方都可以设置一个保存点(savepoint),这样可以讲修改回滚到保存点处,如:
update products set price=price*0.75;
savepoint save1;
update products set price=price*1.3;
然后可以将事务回滚到刚刚设置的保存点处:
rollback to savepoint save1;
如果需要回滚整个事务:
rollback;
事务的ACID特性:
原子性(atomicity);一致性(consistency);隔离性(isolation);持久性(durability)