打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Oracle PL/SQL开发基础(第十二弹:插入、更新和删除)

插入记录

插入单行记录

如:

INSERT INTO emp            (empno, ename, job, mgr,             hiredate, sal, comm, deptno            )     VALUES (7890, '刘七', '副理', 7566,             TO_DATE ('2001-08-15', 'YYYY-MM-DD'), 8000, 300, 20            );INSERT INTO emp     VALUES (7891, '刘七', '副理', 7566, TO_DATE ('2001-08-15', 'YYYY-MM-DD'),             8000, 300, 20);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

插入默认值和NULL值

默认值是在定义数据表时指定的值,如果未指定默认值DEFAULT选项,并且其NOT NULL没有被指定为True,那么将默认为NULL值。
可以使用隐式的默认值插入方法,即通过在INSERT语句中省略掉部分列值,自动使用默认值进行插入。
也可以显式地指定,如:

INSERT INTO empVALUES(7894,'霍十','',DEFAULT,'',NULL,NULL,20);
  • 1
  • 2

使用子查询插入多行数据

如:

INSERT INTO emp_copy   SELECT *     FROM emp    WHERE deptno = 20;INSERT INTO emp_copy            (empno, ename, job, mgr, deptno)   SELECT empno, ename, job, mgr, deptno     FROM emp    WHERE deptno = 30;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

使用INSERT-WHEN插入多表数据

如:

--此处的FIRST表示匹配到第一个WHEN以后跳过后面的WHEN--如果是换成ALL,表示匹配每一个WHENINSERT FIRST   WHEN deptno = 10               --如果部门编号为10   THEN          INTO emp_dept_10          --则插入到emp_dept_10表   WHEN deptno = 20               --如果部门编号为20   THEN        INTO emp_dept_20          --则插入到emp_dept_20表     WHEN deptno = 30               --如果部门编号为30   THEN        INTO emp_dept_30          --则插入到emp_dept_30表     ELSE                           --如果deptno不为10、20或者是30        INTO emp_copy             --则插入到emp_copy 表     SELECT *     FROM emp;                    --查询emp表中的所有数据,插入到目标表
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

还可以使用VALUES子句来为每一个表指定要插入的列,如:

INSERT FIRST   WHEN deptno = 10                    --如果部门编号为10   THEN        INTO emp_dept_10               --插入到emp_dept_10,使用VALUES指定字段             (empno, ename, sal, deptno             )      VALUES (empno, ename, sal, deptno             )   WHEN deptno = 20                    --如果部门编号为20   THEN        INTO emp_dept_20               --插入到emp_dept_20,使用VALUES指定字段             (empno, ename             )      VALUES (empno, ename             )   WHEN deptno = 30                   --如果部门编号为30   THEN        INTO emp_dept_30              --插入到emp_dept_30,使用VALUES指定字段             (empno, ename, hiredate             )      VALUES (empno, ename, hiredate             )   ELSE                                --如果部门编号即不为10、20或30        INTO emp_copy                  --插入到emp_copy,使用VALUES指定字段             (empno, ename, deptno             )      VALUES (empno, ename, deptno             )   SELECT *     FROM emp;                         --指定插入子查询     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

更新记录

直接更新记录

如:

UPDATE emp SET sal=3000 WHERE empno=7369;UPDATE emp SET sal=3000,comm=200,mgr=7566 WHERE empno=7369;
  • 1
  • 2
  • 3

使用子查询更新记录

如:

UPDATE emp x   SET x.sal = (SELECT AVG (y.sal)                  FROM emp y                 WHERE y.deptno = x.deptno) WHERE x.empno = 7369;
  • 1
  • 2
  • 3
  • 4
  • 5

也可以使用非相关子查询:

UPDATE emp   SET sal = (SELECT sal                FROM emp               WHERE empno = 7782) WHERE empno = 7369;
  • 1
  • 2
  • 3
  • 4
  • 5

也可以同时更新多个列:

UPDATE emp x   SET (x.sal, x.comm) = (SELECT AVG (y.sal), MAX (y.comm)                            FROM emp y                           WHERE y.deptno = x.deptno) WHERE x.empno = 7369;
  • 1
  • 2
  • 3
  • 4
  • 5

使用MERGE合并表行

MERGE命令组合了INSERT和UPDATE命令,在对数据进行插入时,如果行存在,则执行UPDATE,如果是一个新的行,则执行INSERT。
如:

MERGE INTO emp_copy c           --目标表   USING emp e                  --源表,可以是表、视图或子查询   ON (c.empno = e.empno)   WHEN MATCHED THEN             --当匹配时,进行UPDATE操作      UPDATE         SET c.ename = e.ename, c.job = e.job, c.mgr = e.mgr,             c.hiredate = e.hiredate, c.sal = e.sal, c.comm = e.comm,             c.deptno = e.deptno   WHEN NOT MATCHED THEN        --当不匹配时,进行INSERT操作      INSERT      VALUES (e.empno, e.ename, e.job, e.mgr, e.hiredate, e.sal, e.comm,              e.deptno);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

删除记录

直接删除记录

如:

DELETE FROM emp;DELETE FROM emp WHERE empno=7903;
  • 1
  • 2

使用子查询删除记录

如:

DELETE FROM emp      WHERE deptno = (SELECT deptno                        FROM dept                       WHERE dname = '销售部');DELETE FROM emp x      WHERE EXISTS (SELECT 1                      FROM emp_copy                     WHERE empno = x.empno);DELETE FROM emp x      WHERE empno IN (SELECT empno                        FROM emp_copy                       WHERE empno = x.empno);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

使用TRUNCATE清除记录

除了可以使用DELETE删除表数据以外,还可以使用TRUNCATE,该语句会删除表中所有行,并且释放该表所使用的存储空间。
如:

TRUNCATE TABLE dept;
  • 1

TRUNCATE实际上不是DML语句,而是DDL语句,与CREATE TABLE等语句一样,它不具有撤销功能,一经调用,表中数据便彻底清除。
与DELETE相比,TRUNCATE速度要快一些,这是因为:
- TRUNCATE语句不会激活表的删除触发器。
- TRUNCATE语句属于DDL语句,不会产生撤销信息。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
mysql练习(含答案)
梓轩--sql语句编程手册(实用+练习)
表的复杂查询 --多表的查询
细数你应该修炼的Oracle基本功 - 51CTO.COM
Oracle笔记(七) 数据更新、事务处理、数据伪列
sql server查询(SELECT ,where,distinct,like 查询,in,is null,group by 和having,order by,as)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服