ORACLE —DML

  • Post author:
  • Post category:其他

ORACLE —DML

DML语句:
数据操纵语句,针对的是数据,经过DML语句的操作,能够对数据源中的数据内容进行调整,包括数据的增加、删除、更新。
分类:
1.手动(FOR UPDATE)
2.自动 (依靠代码):
1)基于原表
并入 MERGE
2)不基于原表

增加 insert
删除 delete
修改 update

手动

语法:

SELECT * FROM TB_NAME FOR UPDATE;
 --全局修改
SELECT * FROM TB_NAME WHERE CONDITION FOR UPDATE;
 --部分修改

语句执行后,目标表的状态即由不可解锁转为可解锁状态,同时【提交】和【回滚】按钮开放,此时可以通过查询结果上方的小锁对表解锁,解锁后可直接在查询结果中进行修改,修改结束后点击绿色对勾✔表示修改完成,再点击小锁使表回到锁定状态,最后点击【提交】按钮使修改生效或点击【回滚】按钮取消刚才的修改。

优点:

1.操作简单;
2.可以同时满足增、删、改三方面的需求。

缺点:

1.所做操作不能留下痕迹,不方便后续回顾;
2.同时对大量数据操作时会有崩溃的危险;
3.必须依赖特定的数据库操作工具。

总结:

范围小、数据少、临时(非常规)

自动

INSERT

语法:

1.单条数据的插入-录入确定内容
INSERT INTO TB_NAME (COL_LIST)
VALUES (DATA_LIST);
2.多条数据的插入-插入查询结果
INSERT INTO TB_NAME (COL_LIST)
SELECT;

语法1注意点:

1.该语法每次仅能插入一条数据;
2.指定插入的数据可与表结构在数量或顺序上不一致,此时字段列表必须与数据列表在列数、顺序、属性、内容上完全一致,否则会报错;
3.若插入的数据在列数、顺序、属性、内容上与表结构完全一致,可在语句中省略字段列表;
4.相较于手动插入数据,语法1能够同时承受的数据插入会更多,但不会多出太多,且还是会有崩溃的危险。若数据量较多建议改到命令窗口执行且中间多穿插’【COMMIT; 】命令。
tips:
1.少量确定数据的临时插入;
2.程序中少量固定数据的频繁插入。

语法2注意点:

1.该语法能够支持同时插入多条数据数据量的多少取决于后边的查询部分
2.插入数据的列数、顺序、属性、内容完全取决于查询部分;
3.指定插入的数据可与表结构在列数或顺序上不一致,此时字段列表必须与数据列表在列数、顺序、属性、内容上完全一致,否则会报错;
4.若插入的数据在列数、顺序、属性、内容上与表结构完全一致,可在语句中省略字段列表;
5.查询部分可以是完全独立的一部分,所有语法规则完全遵循查询的语法,也因为如此,该语法非常灵活,可通过改变查询部分来改变最终插入的数据。

如何查看表结构

1)通过右键菜单DESCRIBE描述来查看
2)SELECT * 直接查询该表
3)通过右键菜单VIEW查看和EDIT编辑来查看表结构
4)在COMMAND WINDOWDESC TB_NAME 回车
5)在CMD窗口连接SQLPLUS DESC TB_NAME 回车

语法:
DELETE FROM TB_NAME; –全部数据的删除
DELETE FROM TB_NAME WHERE CONDITION; –有条件的数据删除

注意:
1.手动执行删除时,删除语句最好由查询语句变更得到,提交前一定要先确认好删除结果;
2.WHERE子句与查询中的WHERE子句用法完全一致。

DELETE

语法:

DELETE FROM TB_NAME; 
--全部数据的删除
DELETE FROM TB_NAME WHERE CONDITION; 
--有条件的数据删除

注意:

1.手动执行删除时,删除语句最好由查询语句变更得到,提交前一定要先确认好删除结果
2.WHERE子句与查询中的WHERE子句用法完全一致。

数据的插入思想:
先删后插-防止数据重复插入

数据的加工流程:

一次性(或分批次)删除结果表中的本批数据及中间表的所有数据
查询源表插入到中间表1
查询中间表1插入到中间表2

查询中间表N插入到结果表

#### UPDATE
语法:

UPDATE TB_NAME SET = EXPR2,....] 
[WHERE CONDITION]; COL1 = EXPR1 [,COL2 

注意:

1.更新后的结果可以是某个固定内容,或是函数处理后的结果,或是运算,或是子查询(单行单列);
2.更新时等号左边是待更新的字段右边是更新后的结果,顺序不要写反了。

MERGE

语法:

 MERGE INTO TB_NAME A --目标表
 USING DATA_SOURCE B --数据源 --表、视图、子查询
    ON (CONDITION) --关联条件:
  WHEN MATCHED THEN --如果能匹配上
UPDATE  --对目标表中的旧数据进行更新
   SET A.COL1 = B.COL1,A.COL2 = B.COL2 ...
 WHERE CONDITION –更新条件-以关联条件成立为前提
(DELETE  --对目标表中的旧数据进行删除
 WHERE CONDITION --删除条件-以更新条件成立为前提)
  WHEN NOT MATCHED THEN
INSERT (A.COL1,A.COL2....)
VALUES (B.COL1,B.COL2....) --将数据源中的新数据插入到目标表
 WHERE CONDITION; --插入条件-以关联条件不成立为前提

DELETE 用的少受到update的影响

测试表:

SELECT * FROM GOODS_CURRENT; 
--当前商品信息
SELECT * FROM GOODS_CHANGE;  
--商品变动信息

同时进行更新和插入操作

MERGE INTO GOODS_CURRENT A
USING GOODS_CHANGE B
   ON (A.GOODS_ID=B.GOODS_ID)
 WHEN MATCHED THEN
UPDATE
   SET A.PRICE=B.PRICE
  WHEN NOT MATCHED THEN
INSERT (A.GOODS_ID,A.GOODS_NAME,A.PRICE,A.COST,A.GOODS_TYPE)
VALUES (B.GOODS_ID,B.GOODS_NAME,B.PRICE,B.COST,B.GOODS_TYPE);

仅更新

UPDATE GOODS_CURRENT A
   SET PRICE=(SELECT PRICE FROM GOODS_CHANGE B WHERE A.GOODS_ID=B.GOODS_ID)
 WHERE GOODS_ID IN(SELECT GOODS_ID FROM GOODS_CHANGE)
MERGE INTO GOODS_CURRENT A
USING GOODS_CHANGE B
   ON (A.GOODS_ID=B.GOODS_ID)
 WHEN MATCHED THEN
UPDATE
   SET A.PRICE=B.PRICE

仅插入

MERGE INTO GOODS_CURRENT A
USING GOODS_CHANGE B
   ON (A.GOODS_ID=B.GOODS_ID)
  WHEN NOT MATCHED THEN
INSERT (A.GOODS_ID,A.GOODS_NAME,A.PRICE,A.COST,A.GOODS_TYPE)
VALUES (B.GOODS_ID,B.GOODS_NAME,B.PRICE,B.COST,B.GOODS_TYPE);

在更新或插入时可以加入条件(彼此互不影响)

MERGE INTO GOODS_CURRENT A
USING GOODS_CHANGE B
   ON (A.GOODS_ID=B.GOODS_ID)
 WHEN MATCHED THEN
UPDATE
   SET A.PRICE=B.PRICE
 WHERE B.UPDATE_DT <='20210401'
  WHEN NOT MATCHED THEN
INSERT (A.GOODS_ID,A.GOODS_NAME,A.PRICE,A.COST,A.GOODS_TYPE)
VALUES (B.GOODS_ID,B.GOODS_NAME,B.PRICE,B.COST,B.GOODS_TYPE);
 --WHERE B.UPDATE_DT ='20210401'    --没更新
 --WHERE B.UPDATE_DT <='20210401'   --更新
 WHERE B.UPDATE_DT >='20210401'     --没更新

MERGE使用删除

MERGE INTO GOODS_CURRENT A
USING GOODS_CHANGE B
   ON (A.GOODS_ID=B.GOODS_ID)
 WHEN MATCHED THEN
UPDATE
   SET A.PRICE=B.PRICE
DELETE 
 WHERE DEL_FLAG='Y'   ----受到update的影响
  WHEN NOT MATCHED THEN
INSERT (A.GOODS_ID,A.GOODS_NAME,A.PRICE,A.COST,A.GOODS_TYPE)
VALUES (B.GOODS_ID,B.GOODS_NAME,B.PRICE,B.COST,B.GOODS_TYPE);

tips:
—–都需要提交后才可以生效,提交前对不满意的数据可以进行回滚操作
—–DML语句都会产生回滚日志,以便操作数据的回滚和恢复


版权声明:本文为weixin_43363860原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。