SQL更新(INSERT,UPDATE,DELETE)语句的⼀般格式及注
意事项
⽬录
写在⽂章前
本⽂从SQL语句格式⾓度,谈⼀谈SQL更新语句的基本格式及其在Oracle中的实践经验(使⽤场景、注意事项)。可供数据库管理系统学
习者、数据分析员、数据统计员、不太熟悉SQL的程序员等参考。
关于更新语句
相对查询语句(查询语句的格式可以看我这篇⽂章)来说,更新(增、删、查)语句的形式就简单⼀些。⾸先明确⼀点使⽤insert、
update、delete语句时都设计到事务(这类语句在DBMS中执⾏后都需要提交),所以这⾥将这三种语句都归类为更新语句。
INSERT语句
简单说,insert语句有两种形态。本⽂从实践⾓度来分类,个⼈认为可以分为单⾏插⼊,和基于⼦查询的插⼊。
/*单⾏插⼊*/
insert into 表名 (字段名1,字段名2) values (数据值1,数据值2);
/*基于⼦查询的插⼊*/
insert into 表名 (字段名1,字段名2) values ⼦查询;
基于以上格式,可以衍⽣出多种形态的插⼊语句,这⾥举个例⼦:
/*假设有表DEPT,只有DEPTNO,DNAME,LOC三个字段*/
/*插⼊⼀⾏数据的语句有*/
insert into DEPT  values('50','市场部','北京');
insert into DEPT (DEPTNO,DNAME,LOC) values('50','市场部','北京');
mysql中delete语句
/*强烈建议使⽤第⼆种⽅法(虽然⿇烦⼀点,但是字段名和数据值都映射地很清楚),第⼀种⽅法只有在熟悉字段名的情况(主要是顺序)才能使⽤,且不便于⼆次维这⾥再说⼀下上⾯形式的insert语句的使⽤场景,从经验来说:
1、适合在dbms中插⼊少量数据时使⽤。
2、适合在编程语⾔中结合循环语句使⽤。
3、适合在sql脚本中使⽤,⽐如提前将其他形式(多为Excel⽂档和txt⽂档)的数据,逐⾏转换为insert语句,写到脚本中运⾏。
再说⼀下基于⼦查询的插⼊语句的例⼦:
/*假设有表EMPLOC,只有EMPNO, ENAME, LOC三个字段*/
/*假设有表EMP,有EMPNO, ENAME, DEPTNO三个字段*/
/*假设有表DEPT,有LOC, DEPTNO两个字段*/
/*以下是向EMPLOC中插⼊⼀个查询结果的语句,⼀次可以插⼊多⾏,⾏数取决于查询语句返回⾏数*/
INSERT INTO EMPLOC (EMPNO, ENAME, LOC)
SELECT E.EMPNO, E.ENAME,D.LOC FROM EMP E LEFT JOIN DEPT D ON E.DEPTNO=D.DEPTNO WHERE E.EMPNO>=7499;
说⼀下以上形式语句的应⽤场景:
1、适⽤于在DBMS中对已有表进⾏加⼯后进⾏批量插⼊。可以⽤于⼈⼯⼲预的交互式数据迁移⼯作。
2、个⼈认为不便于在业务程序中使⽤,因为查询结果可变性相对较⼤,不便于对业务数据的把控。如果要遍历查询结果来判断,那么就没
有必要写这样的语句,如果是使⽤PL/SQL(过程化查询语⾔),那么完全可以⽤游标+单⾏插⼊来替代。
UPDATE语句
⼀般来说,update语句只有⼀种基本格式:
UPDATE 表名 SET 列名1=表达式, 列名2=表达式…… WHERE⼦句
表名:表或者是视图名。
表达式:可以是函数,也可以是返回单⾏的⼦查询。
WHERE⼦句:和SELECT语句⾥⾯的WHERE⼦句写法⼀样。
这⾥举⼏个例⼦:
/*EMPLOC定义同上⽂*/
/*单表更新*/
/*⼀个典型的更新语句,将EMPNO=7934的员⼯名字修改为⽶勒*/
UPDATE EMPLOC SET ENAME ='⽶勒' WHERE EMPNO=7934;
/*将EMPNO=7934的员⼯名字修改为⽶勒,地区修改为北京*/
UPDATE EMPLOC SET ENAME ='⽶勒',LOC='北京' WHERE EMPNO=7934;
/*⼀个常见但不安全的更新语句,将所有的员⼯名字修改为⽶勒,显然不合逻辑。所以UPDATE语句⼀定要注意WHERE条件,不然就是更新所有⾏*/ UPDATE EMPLOC SET ENAME ='⽶勒';
/*联表更新*/
/*将EMP的ENAME依据两表EMPNO相等的条件将EMP的ENAME更新⾄EMPLOC表的ENAME,更新范围限制在EMPLOC为7939内*/
/*这⾥是Oracle的写法,其他平台可能不适⽤*/
UPDATE  EMPLOC  EL SET EL.ENAME =(SELECT E.ENAME FROM EMP E  WHERE E.EMPNO =EL.EMPNO) WHERE EL.EMPNO=7934;
以上语句:
单表更新,个⼈认为既适合在程序中使⽤,也适合在DBMS中使⽤。
联表更新,个⼈认为更适⽤于数据处理员、数据库管理员的⼯作,⽐如数据表之间的数据同步、错误数据的处理。
从数据库系统⾓度(或者简单理解为业务数据管理的⾓度来说),不到万不得已不要在正式环境使⽤批量更新、联表更新等操作(风险太⾼,迫不得已的情况下使⽤,也须充分熟悉数据库结构,反复测试语句后再使⽤),⽽是通过经过成熟稳定的应⽤程序来做批量更新、“联表更新”等操作。
DELETE语句
DELETE语句格式较简单,⼀般如下:
DELETE FROM 表名 WHERE⼦句
表名:表或视图。
WHERE⼦句:和SELECT、UPDATE语句⾥⾯的WHERE⼦句写法⼀样。
FROM:在Oracle中可以省略。
举例:
/*删除EMPLOC中EMPNO为7943的⾏ */
DELETE FROM EMPLOC WHERE  EMPNO=7934;
使⽤场景:
1、数据库管理员维护数据。
2、业务程序进⾏业务数据上的删除业务,从程序设计上来说,⼀定要避免WHERE条件⽆法⽣成的bug。从数据库管理⾓度来说,有类似MySQL安全模式的尽量⽤安全模式,没有此功能也需要从触发器⾓度做出⼀定的限制。
3、个⼈认为,DELETE语句的功能主要还是⾏级别的删除。表级别的数据删除⽤TRUNCATE的效率要⾼⼀些。题外话,DROP不是⽤来清空数据的,是删除整个表,于前两者功能截然不同。除此之外,⼀些⾮专业⼈员的需求,往往会说“把某⼀列数据的删掉不要”,这种情况其实应该是使⽤UPDATE语句将对应的字段内容更新为空,并不是DELETE、TRUNCATE、DROP、ALTER TABLE等。初学的朋友需要注意,毕竟数据恢复的成本挺⾼,专业的DBA也还是稀有⼈才。
更新语句的通⽤注意事项
更新语句可以对应SQL中的DML(数据操纵)语⾔,由于关系数据库的特性,更新语句的使⽤都伴随着事务和锁 ,这⾥不展开说事务和锁。主要还是提醒初学的朋友,⼀定要根据实际情况使⽤COMMIT(提交)或者ROLLBACK(回滚)来实现最最基础的事务控制,从⽽避免产⽣锁表,锁表可能会造成⼤量的资源耗费,从⽽导致系统崩溃。
说完了事务控制的提醒,最后就是提醒各位同仁,更新语句⼀定要慎⽤。在这个信息时代,数据的价值不⽐应⽤程序的价值低,保护好数据是IT⼈的重要⼯作之⼀,所以还是要多注意。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。