第十一章数据操作与事务控制课堂笔记和练习

– 数据操作语言:DML(Data Manipulation Language) :insert update delete
  • 插入数据 insert

    – 语法:insert into 表名(列名1,[列名2….]) values(值1,[值2…..])
    – 注意:
    – 列名列表与值列表个数、数据类型保持一致
    – 字符类型与日期类型用”单引号引起来
    – 列名列表可省略,则需要向所有列赋值

    1. 插入单行数据

            --  隐含法:在列名列表中忽略该列
                --  向dept表新增一个部门
                    insert into dept(deptno,dname) values(50,'baby');
      
            --  显示法:指定 null关键字或者''
                --  向dept表新增一个部门
                    insert into dept values(50,'baby','');
      
            --  不指定列
                --  向dept表新增一个部门
                    insert into dept values(50,'baby','beijing');
      
            --  插入日期值
                --  sysdate 系统当前时间
                    insert into emp (empno,hiredate) values (3322,sysdate);
      
            --  插入指定日期
                    insert into emp (empno,hiredate) 
                    values (3322,to_date('2018-07-30','yyyy-mm-dd'));
      
            --  插入特殊字符'&'(有变量的含义)
                    insert into dept (deptno,dname,loc) 
                    values (24,'&' || 'hello','shanghai');
      
    2. 插入多行数据

          --  创建表 create table 
          --  创建表manager,并且结构与emp表一样
              create table manager as select * from emp;
              --  复制表结构与数据
      
              create table manager as select * from emp where 1=0;
              --  复制表结构
      
              --  向manager表中插入emp表中职位为manager的员工信息
                  insert into mannager select * from emp where job = manager;
      
  • 修改数据 update
    – 语法: update 表名 set 列名=新值,[列名1=新值1…] where 限制条件

    1. 修改指定数据

          --  把工号为7782的部门编号修改为20
              update emp set deptno = 20 where empno = 7782;
      
    2. 修改所有记录

              update emp set deptno = 20;
      
    3. 一次修改多列

              update emp deptno = 20,sal = sal + 100 where deptno = 10;
      
    4. 嵌入式查询修改

              update emp set deptno = 20,
                         sal = sal + (select avg(sal) from emp) 
               where deptno = 10;
      
    5. 相关更新update

              --  在emp表中增加一个列dname,用来存储部门名称
                  alter table emp add(dname varchar2(14));    
      
              --  使用相关子查询更新dname列为正确的部门名称
                  update emp e
                     set dname = 
                               (select dname
                                  from dept d
                                 where deptno = e.deptno);
      
    6. 修改记录时的完整性约束错误

              --  把部门编号为10的员工,部门编号调整为55
                  update emp set deptno=55 where deptno=10;  
                  --  错误 未找到父项关键字  外键(emp.deptno)对应的值
                  ->  不在主键(dept.deptno)范围之内
      
  • 删除数据 delete
    – 语法: delete [from] 表名 where 限制条件
    – 注意:用delete删除表只是删除表的数据且可回滚,保留表的结构和对事务提交的确认

    1. 删除选中记录

          --  删除职位是CLERK的员工记录
                 delete from emp
                  where job = 'CLERK';
      
    2. 删除全部记录

          --  删除所有员工记录
                 delete from emp;   
      
    3. 基于另一个表删除本表记录

             --  在DELETE语句中使用子查询可以基于另一个表删除本表记录。
             --  删除部门SALES的员工记录。
                 delete from emp
                  where deptno =
                              (select deptno
                                 from dept
                                where dname ='SALES');
      
    4. 相关删除 delete

             --  删除曾经做过入职的员工记录
                 DELETE FROM emp e
                    WHERE 0 <
                          (SELECT count(empno)
                             FROM emp_jobhistory
                            WHERE empno = e.empno);
      
             --  删除没有员工的部门记录
                  DELETE FROM dept d
                   WHERE not exists
                            (SELECT empno
                               FROM emp
                              WHERE deptno = d.deptno);
      
– 事务处理语言:TPL(Transaction Process Language):commit rollback

– 一组SQL语句的管理单元(针对增、删、改语句做事务管理)

  • 四个特性:
    – 1.原子性:所有sql语句执行成功都成功,任意一个失败,全部必须执行失败(回滚00 )
    – 2.一致性:不论失败或成功,数据库数据保持一致性
    – 3.隔离性:事务之间相互独立,互不影响
    – 4.持久性:事务一旦被提交,永久保存在数据库中,无法撤回

  • 事务组成:
    在数据库中,事务由一组相关的DML或SELECT语句,加上一个TPL语句(COMMIT、
    ROLLBACK)或一个DDL语句(CREATE、ALTER、DROP、TRUNCATE等)或一个DCL(GRANT、REVOKE)语句

  • 事务开始:当上一个事务结束,第一个新的DML(增删改)语句执行开始,事务开始

  • 事务结束:

    1. 显示结束:

      --显示结束:事务提交commit
          insert into dept(deptno,dname,loc) values(50,'开发部','北京');
          commit;--提交事务(增删改操作均需要提交事务)
      
      --显示结束:事务回滚rollback
          insert into dept(deptno,dname,loc) values(60,'运维部','北京');
          insert into dept(deptno,dname,loc) values(70,'IT部','北京');
          rollback;--回滚事务
      
    2. 隐式结束:

      --  隐式提交:执行DDL 或 DCL 或 从SQL*PLUS正常退出
      --  隐式回滚:从SQL*Plus中强行退出
      --  客户端连接到服务器端异常中断
      --  系统崩溃
      
  • 设置保存点

    insert into dept(deptno,dname) values(80,'实施部');
    savepoint point1;--设置保存点1
    insert into dept(deptno,dname) values(90,'测试部');
    insert into dept(deptno,dname) values(91,'需求部');
    savepoint point2;--设置保存点2
    insert into dept(deptno,dname) values(92,'产品部');
    savepoint point3;--设置保存点3
    
    --回滚到保存点1的位置
    rollback to point1;
    
    commit;--提交事务
    rollback; -- 回滚提交,事务已经被提交,回滚无效
    
  • 锁: 表级锁 与 行级锁

    1. 行级锁:当用户在会话1中对数据进行DML操作时,
      – 如果事务没提交或回滚,当前行数据将被锁定
      – 当用户执行完commit或rollback之后,其他会话才能执行该行的DML(SQL增删改)操作

    2. 表级锁:当用户在会话1中对数据进行DML操作时,其他会话不允许对该表进行DDL(列删除、表删除、或表修改)操作

猜你喜欢

转载自blog.csdn.net/bb_code_exchange/article/details/81356458