现在的位置: 首页 > 综合 > 正文

oracle学习笔记之七 数据操作

2013年09月16日 ⁄ 综合 ⁄ 共 5738字 ⁄ 字号 评论关闭

 1.追加数据
  INSERT INTO table[(column[,column...])]
  VALUES      (value[,value...]);
  
  例1:INSERT INTO dept(deptno,dname,loc)
       VALUES      (50,'DEVELOPMENT','DETROIT');

  例2:INSERT INTO dept
       VALUES      (50,'DEVELOPMENT','DETROIT');
 
  例3:INSERT INTO dept(deptno,dname)
       VALUES      (50,'DEVELOPMENT');
 
1)插入含空值NULL的记录
  -隐含法:在列名列表中忽略该列
  例:INSERT INTO dept(deptno,dname)
      VALUES      (60,'MIS');
 
  -显示法:制定NULL关键字
  例:INSERT INTO dept
       VALUES      (50,'DEVELOPMENT',NULL);

2)插入特殊值
  -SYSDATE函数记录当前日期和时间
  例:INSERT INTO emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
      VALUES    (7196,'GREEN','SALESMAN',7782,SYSDATE,2000,NULL,10);

3)替代变量插入值
  例:INSERT INTO dept(deptno,dname,loc)
      VALUES     (&department_id,'&department_name','&location');

  结果:
        在要执行的脚本中输入替换变量的值:

        变量                   值
        department_id:       80    
        department_name:     EDUCATION
        location:            ATLANTA

4)从另一个表复制数据
  INSER INTO table [ column(,column)]
  subquery;
 
  例:INSERT INTO test
      SELECT *
      FROM   dept
      WHERE  loc='NEW YORK';

2.修改表中的数据
  UPDATE table
  SET    column=value[,column=value]
  [WHERE condition];
 
  例1:使用WHERE子句制订要更新的记录
       UPDATE emp
       SET    deptno=20
       WHERE  empno=7782;
  例2:如果要更新所有记录WHERE子句可以忽略
       UPDATE employee
       SET    deptno=20;
  例3:用编号为7499雇员的工作名称及部门编号更新编号为7698雇员相对应的信息
  方法一:
          UPDATE emp
          SET    (job,deptno)=
                               (SELECT job,deptno
                                FROM   emp
                                WHERE  empno=7499)
          WHERE   empno=7698;
  方法二:
   
          UPDATE emp
          SET    deptno=
                         (SELECT deptno
                          FROM   emp
                          WHERE  empno=7499)
                  job   =
                         (SELECT job
                          FROM   emp
                          WHERE  empno=7499)
          WHERE   empno=7698;

3.删除表中记录
  DELETE [FROM] table_name
  [WHERE        condition];

  例1:在WHERE子句中指定哪些记录要被删除

       DELETE FROM emp
       WHERE  job='CLERK';

  例2:如果省略WHERE子句,表中所有记录将被删除
       DELETE FROM emp;

  例3:在DELETE语句中使用子查询可以居于另一个表删除本表记录
       DELETE FROM emp
       WHERE       deptno=
                          (SELECT deptno
                           FROM   dept
                           WHERE  dname='NEW YORK');

  例4:删除记录时的完整性约束错误
       DELETE FROM  dept 
       WHERE        deptno=10;
  结果:
        DELETE FROM  dept
        *

        ERROR 位于第 1 行:
        ORA-02292: 违反完整约束条件 (SCOTT.FK_DEPTNO) - 已找到子记录日志

4.合并语句
  -根据条件对表进行数据更新或插入操作
  -如果行存在,进行更新;如果是新行,进行插入操作
  MERGE INTO table_name table_alias
    USING    (talble|view|sub_query) alias
    ON       (join condition)
    WHEN  MATCHED THEN
      UPDATE SET
        col1=col1_val,
        col2=col2_val
    WHEN NOT MATCHED THEN
      INSERT (column_list)
      VALUES (column_values)

  例:
     MERGE INTO copy_dept c
       USING dept e
       ON    (c.deptno=e.deptno)
       WHEN MATCHED THEN
         UPDATE SET
           c.dname=e.dname,
           c.loc  =e.loc
       WHEN NOT MATCHED THEN
         INSERT VALUES(e.deptno,e.dname,e.loc);

5.数据库事务
  -开始于第一条可执行的SQL语句的执行
  -在下列情况下结束:
      -COMMIT或ROLLBACK
      -DDL或DCL语句被执行
      -用户退出
      -系统崩溃
1)COMMIT和ROLLBACK优点
  -确保数据的一致性
  -产生永久性变化之前可以预览数据的变化
  -聚合一系列逻辑相关的操作

2)隐含的事务处理
  -下列情况下会自动提交:
      -执行DDL语句
      -执行DCL语句
      -正常退出SQL*PLUS,并且没有明确的执行COMMIT或ROLLBACK
      -在遇到SQL*PLUS异常结束或系统故障都会自动回滚

3)执行COMMIT或ROLLBACK前的数据状态
  -数据变化前的状态是可以被恢复的
  -当前用户可以是使用SELECT语句来验证DML操作后的结果
  -其他用户不能查看由当前用户的DML操作结果
  -受影响记录被锁定,也就是其他用户不能改变受影响记录中的数据

4)执行COMMIT后的状态
  -在数据库中数据变化成为永久性的
  -先前的数据状态永久性的消失
  -所有用户都可以查询提交后的结果
  -锁定的记录被释放,可以有效地被其他用户操作
  -所有的存储节点被清除
 
  例:提交数据
     -产生数据变化
       UPDATE emp
       SET    deptno=10
       WHERE  empno=7782;
     -提交数据变化
       COMMIT;

5)回滚到某个标记状态
  -在当前事务中使用SAVEPOINT语句创建一个标记状态
  -使用ROLLBACK TO SAVEPOINT语句回滚到制定的标记状态
 
  例:SQL>UPDATE...
      SQL>SAVAPOINT update_done;
      Savepoint created.
      SQL>INSERT...
      SQL>ROLLBACK TO update_done;
      Rollback complete.

6)语句级回滚
  -如果一个DML语句在执行过程中出错,那么仅仅是这条语句中的操作被回滚
  -Oracle服务器完成一个隐含的保存节点操作
  -所有其他变化仍然保留
  -用户应该是哟个COMMIT或ROLLBACK语句明确的终止该事务

7)读取的一致性
  -读取的一致性可以保证任何时候数据查询的一致
  -一个用户所产生的数据变化不会和另一个用户所产生的数据变化相冲突
  -确保对于同一数据:
     -读取者不用等待写入者
     -写入者不用等待读取者

6.锁定
  -锁定是一种用于防止多个事务同事访问相同资源而产生的破坏性交互作用的机制
  -Oracle锁定
     -阻止并发事务之间产生的破坏性交互作用
     -不需要用户干预
     -自动使用最低级别限制
     -锁定时间和事务持续时间相同
  -有两种基本模式
     -排它(行级锁)
     -共享(表级锁)

   
练习
1.将以下信息添加到emp表中:
   empno  ename   job      mgr   hiredate    sal   comm deptno
   10     Mirror  manager  7839  1980-12-10   3000         20

   INSERT INTO emp
   VALUES      (10,'Mirror','manager',7839,
               TO_DATE('1980-12-10','yyyy-mm-dd'),3000,NULL,20)

 

2.将以下信息添加到dept表中:

   deptno    dname    loc
   50        LEADER   shenyang
  
   INSERT INTO dept
   VALUES      (50,'LEADER','shenyang');

3.更新雇员编号为10的雇员薪水为3500,雇佣日期为1979-5-1
 
   UPDATE emp
   SET    sal=3500
   WHERE  empno=10;

4.更新dept表部门编号为50的地址为beijing

   UPDATE dept
   SET    loc='beijing'
   WHERE  deptno=50;
  

6.用编号为7900的雇员性谁更新编号为10的雇员的薪水
 
   UPDATE emp
   SET    sal=
              (SELECT sal
               FROM   emp
               WHERE  empno=7900)
   WHERE  empno=10;

7.删除工作地点在北京的雇员

   DELETE
   FROM  dept
   WHERE deptno=
                 (SELECT deptno
                  FROM   dept
                  WHERE  loc='beijing');

8.删除部门编号为50的部门信息
  
    DELETE
    FROM   dept
    WHERE  deptno=50;

9.将以下信息添加到emp表中:
   empno  ename   job      mgr   hiredate    sal     comm deptno
   10     Mirror  MANAGER  7839  1980-12-10  3000.00         20

   INSERT INTO emp
   VALUES      (10,'Mirror','MANAGER',7839,
               TO_DATE('1980-12-10','yyyy-mm-dd'),3000.00,NULL,20);
  

10.提交所做的改变

   COMMIT;

11.将以下信息添加到emp表中
   empno  ename   job      mgr   hiredate    sal     comm deptno
   11     Word    CLERK    7782  2001-01-12  1500.00         30

   INSERT INTO emp
   VALUES      (11,'Word','MANAGER',7782,
               TO_DATE('2001-01-12','yyyy-mm-dd'),1500.00,NULL,30);

12.设置savepoint mark1

   SAVEPOINT mark1;

13.改变empno为10的job值,由manager改为clerk,薪水由3000.00改为1500.00

   UPDATE emp
   SET    job='CLERK',sal=1500.00
   WHERE  empno=10;

14.设置savepoint mark2

   SAVEPOINT mark2;

15.删除薪水低于1000元的所有员工信息

   DELETE
   FROM   emp
   WHREE  sal<1000;

16.回退到savepoint mark2

   ROLLBACK TO mark2;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

抱歉!评论已关闭.