源码-Oracle数据库管理-第十章-数据表操作-Part 3(更新数据)

数据库玩的就是数据的增删改查,这一节就是学习如何“改”数据的。

这里的例子还是很精彩的,让我的数据库技能又一次得到了提升!微笑

--TBC 2016-10-09
--10.2 更新数据
--10.2.1 使用Update语句
--简单的UPDATE语句示例
UPDATE emp SET deptno=30 WHERE empno=5093;
select * from emp where deptno=20;

--多字段的UPDATE语句更新示例(原来=号后面可连接一个case when语句啊,长见识了,哈哈)
UPDATE emp
   SET comm = CASE WHEN comm IS NULL THEN sal * 0.15 ELSE comm * 1.15 END
 WHERE deptno = 20;

UPDATE emp
   SET sal  = CASE WHEN sal IS NULL THEN 9988 ELSE sal * 1.15 END
 WHERE deptno = 20;

--违反完整约束条件示例
update emp set deptno=99 where ename='PANDENG';

--10.2.2 使用子查询更新多行记录
--UPDATE的相关子查询更新的示例
UPDATE emp x
   SET x.sal = (SELECT AVG(y.sal) FROM emp y WHERE y.deptno = x.deptno)
 WHERE x.ename = 'PANDENG';

--在WHERE子句中使用相关子查询的示例
UPDATE emp a
   SET a.sal = a.sal * 1.1
 WHERE EXISTS (SELECT 1
          FROM salgrade b
         WHERE a.sal BETWEEN b.losal AND b.hisal
           AND GRADE = 5);


--使用非相关子查询更新员工工资
UPDATE emp
   SET sal = (SELECT sal FROM emp WHERE empno = 7782)
 WHERE empno = 7369;

--使用子查询更新多列
 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;

--使用子查询更新的更详细的例子(这个例子花了我半个多小时才理解,加深了我对相关子查询的理解)
UPDATE emp a
   SET deptno = (SELECT deptno FROM dept WHERE loc = 'NEW YORK'),
       (sal, comm) = (SELECT 1.1 * AVG(sal), 1.5 * AVG(comm)
                             FROM emp b
                            WHERE a.deptno = b.deptno)
 WHERE deptno IN (SELECT deptno
                    FROM dept
                   WHERE loc = 'DALLAS'
                      OR loc = '上海浦东');
                      
select * from emp where deptno in (select deptno from dept where loc = 'DALLAS' OR loc = '上海浦东');  
select * from dept;      

select * from emp where deptno=20 or deptno=60; 
SELECT 1.1 * AVG(sal), 1.5 * AVG(comm)
                             FROM emp where deptno=20; --52400, 3939
SELECT 1.1 * AVG(sal), 1.5 * AVG(comm)
                             FROM emp where deptno=60; --12302, 450
SELECT 1.1 * AVG(sal), 1.5 * AVG(comm)
                             FROM emp where deptno=10; --5500, 750
                             
select * from emp for update;
rollback;             

--由于没有一对一关系,因此在更新时将出现异常
UPDATE /*+BYPASS_UJVC*/  (SELECT a.empno, a.sal
        FROM emp a, salgrade b
       WHERE a.sal BETWEEN b.losal AND b.hisal
         AND grade = 3) empsal
   SET empsal.sal = empsal.sal * 1.12;
   

--使用内联视图更新的例子,正常使用(这个例子也挺有意思,可以实现两张表的局部同步)
--From子句中包含的表要包含主键,即,该表为键值保存表
UPDATE (SELECT x.sal  sal,
               y.sal  sal_history,
               x.comm comm,
               y.comm comm_history
          FROM emp x, emp_history y
         WHERE x.empno = y.empno)
   SET sal_history = sal, comm_history = comm;

select * from emp_history;

--没有主键的列进行更新,将出现错误(本语句暂未调试)
UPDATE (SELECT x.sal  sal,
               y.sal  sal_history,
               x.comm comm,
               y.comm comm_history
          FROM emp_his_2 x, emp_history y
         WHERE x.empno = y.empno)
   SET sal_history = sal, comm_history = comm;
   

--使用内联视图限制可更新的列(本语句暂未调试)
UPDATE (SELECT emp_id, fname, lname, dept_id, manager_emp_id 

  FROM employee) emp

SET emp.manager_emp_id = 11

WHERE emp.dept_id = 4;

--使用内联视图限制可更新的列
UPDATE (SELECT empno, sal, comm FROM emp) empsal
   SET empsal.sal = empsal.sal * 1.1
 WHERE empsal.empno = 7369;
 
--更新内联视图并不存在的列(本语句会将报错)
UPDATE (SELECT empno, sal, comm FROM emp) empsal
   SET empsal.ename='任伯安'
 WHERE empsal.empno = 7369;

--违反WITH CHECK OPTION约束的UPDATE语句,更新行数:0
UPDATE (SELECT empno, sal, comm,deptno
          FROM emp
         WHERE deptno = (SELECT deptno FROM dept WHERE loc = '芝加哥') WITH
         CHECK OPTION) empsal
   SET empsal.sal = empsal.sal * 1.1
 WHERE deptno = 30;


--未违反WITH CHECK OPTION约束的UPDATE语句,可成功更新记录
UPDATE (SELECT empno, sal, comm,deptno
          FROM emp
         WHERE deptno = (SELECT deptno FROM dept WHERE loc = '浦东' )WITH
         CHECK OPTION ) empsal
   SET empsal.sal = empsal.sal * 1.1
 WHERE deptno = 30;

select * from dept;


--10.2.3 使用returning 子句 
--RETURNING子句的功能
INSERT INTO <table> (c1, c2, .., cn) VALUES (v1, v2, .., vn) RETURNING <expression> INTO <variables>
UPDATE <table> SET (c1) = (v1), (c2) = (v2), (cn) = (vn) WHERE <condition> RETURNING <expression> INTO <variables>
DELETE FROM <table> WHERE <condition> RETURNING <expression> INTO <variables>

--RETURNING INTO子句的示例
DECLARE
  v_book_id   NUMBER;
  v_book_name VARCHAR2(100);
BEGIN
  --插入一本新的图书
  INSERT INTO books
  VALUES
    (orders_seq.NEXTVAL, '康熙大帝', 3)
  RETURNING book_id INTO v_book_id;
  DBMS_OUTPUT.put_line('新插入的图书的book_id=' || v_book_id);
  --更新图书的名称
  UPDATE books
     SET book_name = 'Oracle PL/SQL从入门到精通'
   WHERE book_id = 1021
  RETURNING book_name INTO v_book_name;
  DBMS_OUTPUT.put_line('更新的图书名称的book_name=' || v_book_name);
  --删除图书
  DELETE FROM books
   WHERE book_name = '云图'
  RETURNING book_id INTO v_book_id;
  --显示图书信息
  DBMS_OUTPUT.put_line('删除的图书的book_id=' || v_book_id);
END;
/

select * from books;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了python应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值