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 WINDOW
中DESC 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语句都会产生回滚日志,以便操作数据的回滚和恢复