一:简单更新
update … set … where…
二:子查询更新
update … set … (select…from…where…)
三:使用MERGE更新
匹配的则update
不匹配的insert
CREATE TABLE t1(ID NUMBER,NAME VARCHAR(10) ,status VARCHAR(10));
CREATE TABLE t2(ID NUMBER,NAME VARCHAR(10) ,status VARCHAR(10));
INSERT ALL
INTO t1(ID,NAME,status) VALUES(1,'a','0')
INTO t1(ID,NAME,status) VALUES(2,'b','0')
INTO t1(ID,NAME,status) VALUES(3,'c','0')
SELECT * FROM dual;
INSERT ALL
INTO t2(ID,NAME,status) VALUES(2,'d','1')
INTO t2(ID,NAME,status) VALUES(3,'e','1')
INTO t2(ID,NAME,status) VALUES(4,'f','1')
SELECT * FROM dual;
MERGE INTO t1 USING t2
ON (t1.id=t2.id)
WHEN MATCHED THEN UPDATE SET t1.status=t2.status --匹配就更新t1的数据
WHEN NOT MATCHED THEN INSERT VALUES(t2.id,t2.name,t2.status); --不匹配就插入t1表
SELECT * FROM t1
结果 :
1 1 a 0
2 2 b 1
3 3 c 1
4 4 f 1
注意:
1.update跟新的列不能是使用在on连接条件后面的列
2.这里的t1表必须是oracle实际存在的表,不能是内存表
四:删除数据
1.删除指定行:
delete from 表名 where 条件;
2.删除所有行
delete from 表名;
五:删除重复行
1.先创建临时表:获取所有id出现重复的列
临时表:
create table tmp as
select id,count(1) from t group by id having count(1) >1 ;
2.通过oracle的隐藏列ROWID,保留max(ROWID),其余删除即可
delete from t t1 where ROWID != (
select max(t2.ROWID) from t t2 where t2.id in (select id from tmp) and t1.id = t2.id
);
六:使用TRUNCATE截断表
1.在数据处理上truncate table tbl_name = delete from tbl_name
2.delete是DML操作,而truncate是DDL操作,使用delete会产出大量的rollback,占用很多的rollback sergments , 但是truncate不会
3.在内存中,使用delete删除表,被删除的表占用的空间还在,另外数据还可以恢复,除非重启系统(OS或者RDBMS)
4.在内存中,使用truncate删除表,表空间会立即被释放,数据不能够恢复
5.truncate调整高水位线(high water mark , HWM),而delete不调整,使用truncate后,表的HWM退回到initial 和 next 的位置(默认),delete则不可以
注意:
1.delete语句可以回滚,但是truncate语句不可以回滚
2.truncate只能对应table
3.delete可以对应table , view , synonym
4.truncate table 的对象必须是本地模式 , 且必须有drop any table权限
5.delete的对象必须是本地模式 , 且必须有delete any table
6.在外层中,truncate或者delete操作后都释放空间
7.truncate和delete只删除数据,drop删除数据+表结构
来源:CSDN
作者:是谁注册了我的2052
链接:https://blog.csdn.net/weixin_44769733/article/details/103983519