目录

写在文章前

关于更新语句

INSERT语句

UPDATE语句

DELETE语句

更新语句的通用注意事项


写在文章前

本文从SQL语句格式角度,谈一谈SQL更新语句的基本格式及其在Oracle中的实践经验(使用场景、注意事项)。可供数据库管理系统学习者、数据分析员、数据统计员、不太熟悉SQL的程序员等参考。

关于更新语句

相对查询语句(查询语句的格式可以看我这篇文章关于SQL的SELECT查询语句的一般格式的描述)来说,更新(增、删、查)语句的形式就简单一些。首先明确一点使用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','市场部','北京');
/*强烈建议使用第二种方法(虽然麻烦一点,但是字段名和数据值都映射地很清楚),第一种方法只有在熟悉字段名的情况(主要是顺序)才能使用,且不便于二次维护*/

这里再说一下上面形式的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人的重要工作之一,所以还是要多注意。

SQL更新(INSERT,UPDATE,DELETE)语句的一般格式及注意事项相关推荐

  1. mysql删除语句事务_事务用来管理 insert,update,delete 语句

    MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数 ...

  2. 【PL/SQL】Insert/ update/ delete/ merge

    Insert: BEGIN INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_id, s ...

  3. SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete)

    SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete) SQL Server 2008提供了一个增强的SQL命令Merge,用法参看MS ...

  4. PHP5: mysqli 插入, 查询, 更新和删除 Insert Update Delete Using mysqli (CRUD)

    原文: PHP5: mysqli 插入, 查询, 更新和删除  Insert Update Delete Using mysqli (CRUD) PHP 5 及以上版本建议使用以下方式连接 MySQL ...

  5. store update、insert或delete语句影响了意外的行数(0)。自加载实体后,实体可能已被修改或删除

    报错详情是: store update.insert或delete语句影响了意外的行数(0).自加载实体后,实体可能已被修改或删除.请参见http://go.microsoft.com/fwlink/ ...

  6. 内容必须匹配 (cache-ref|cache|resultMap*|parameterMap*|sql*|insert*|update*|delete*|selec

    元素类型为 "mapper" 的内容必须匹配 "(cache-ref|cache|resultMap*|parameterMap*|sql*|insert*|update ...

  7. linux mysql 事务_linux下mysql Insert update delete 事务 用户管理

    linux下mysql Insert update delete  事务 用户管理 1.INSERT插入语句格式: INSERT INTO tb_name (字段1, 字段2, ...) VALUES ...

  8. mybatis配置insert/update/delete同一个模板

    insert,update,delete标签只是一个模板,在操作时是以sql语句为核心的, 即在做增/删/改时,insert/update/delete便签可以通用, 但做查询时只能用 select ...

  9. 数据操纵:SELECT, INSERT, UPDATE, DELETE

    1 SELECT 句法 2 3 SELECT [STRAIGHT_JOIN] 4 [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] 5 [ ...

最新文章

  1. 什么是AWS Lambda?
  2. 回归、分类与聚类:三大方向剖解机器学习算法的优缺点
  3. Docker:You cannot remove a running container
  4. MapReduce案例-wordcount-JobMain代码
  5. JavaScript DOM 6 - 节点的创建,插入,替换,删除
  6. 为mysql数据库建立索引
  7. excel公式编辑器_Excel中自动更新超链接的文件目录,超简单
  8. AndroidManifest.xml文件详解(receiver)
  9. 视频教程-WPF MVVM 编程模式/框架 基础+提高 项目开发实战视频教程-.NET
  10. 提取swf素材_swf素材提取工具
  11. 复盘:图像饱和度计算公式和图像信噪(PSNR)比计算公式
  12. 访问控制模型(ACL BLP BiBA Clark-Wilson Chinese-wall RBAC ABAC)
  13. Windows下硬盘存储情况可视化工具--WinDirStat
  14. 成功的自动化测试:测试员的故事
  15. 腾讯云DNS 域名服务器(nameservers)修改
  16. d3.js画柱状图超详细教程
  17. 微信小程序把view居中_初识微信小程序
  18. 【计算机毕业设计】java SpringBoot校园大学生志愿者服务系统
  19. word文档中如何删除空白页
  20. 企业管理驾驶舱系统设计

热门文章

  1. DorisDB 流批一体 实时架构
  2. 【解决方法】Appium 报错 Original error: chrome not reachable
  3. 超详细,Python列表解析式到底该怎么用?
  4. 如何停止胡思乱想,保持专注?
  5. Centos7运行Docker1.13.1报错Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor pres
  6. Windows 记事本的 ANSI、Unicode、UTF-8 这三种编码模式有什么区别?(好)
  7. matlab绘制河北大学简约版校徽(彩色、matlab绘图、)
  8. 【C#视频】——循环
  9. 如何设计一个秒杀系统
  10. python导入安装包