美文网首页
oracle学习笔记九——插入更新和删除(DML语句)

oracle学习笔记九——插入更新和删除(DML语句)

作者: 涨财司 | 来源:发表于2018-08-18 14:09 被阅读0次

    九、插入更新和删除

    SQL语句的类型:
    1.DML语句(Data Manipulation Language 数据操作语言):
    insert delete update select
    2.DDL语句(Data Definition Language 数据定义语言):
    create/drop/alter table, truncate table
    create/drop view, create/drop index,
    3.DCL语句(Data Control Language 数据控制语句):
    commit rollback


    1.插入语句:insert

    (1)INSERT 语句语法

    INSERT INTO table [(column [, column...])]
                      VALUES (value [, value...]);
    

    --使用这种语法一次只能向表中插入一条数据

    (2)一次只向表中插入一条数据

    --insert:table后列出全部列名

    insert into emp(empno, ename, job,mgr,hiredate,sal,comm,deptno)
                values(1001, 'Tom','Engineer',7839,sysdate, 3000,100,10);
    

    补:
      当要对所有列插入值时,table后面的括号及其里面的列名可以省略
    --隐式插入空值(除列出的列外,其他列默认输入空值)

    insert into emp(empno, ename, sal, deptno)
                values(1002, 'Mike',3000,20)
    

    --显式插入空值

    insert into emp(empno, ename, job, sal, deptno)
                values(1002, 'Mike', null, 3000, 20)
    

    --回滚(oracle自动开启事务)

    rollback
    

    --地址符 &

    insert into emp(empno, ename, sal, deptno)
                values(&empno, '&ename', &sal, &deptno);
    
    -->结果: 地址符 &:相当于为sql语句定义了一个形参

    注:关于地址符
      (1)&变量放在VALUES子句中
      (2)执行时,会提示输入对应变量的值,注意’&ename',这列引号也可以不加,但那样在键入值的时候就必须加上引号。最好像示例这样写
      (3)在DML语句中使用地址符:可以在任何位置
        SQL>select empno,ename,&t
           from emp;

    (3)一次插入(拷贝)多条记录

    --在创建表(create语句)时使用子查询

    --where条件无效就不会有数据进去,只是拷贝了emp的数据结构
    SQL>create table emp10 
        as select * from emp where 1=2
    

    说明:
      (1)where条件无效就不会有数据进去,只是拷贝了emp的数据结构
      (2)create语句的子查询没有括号,但有"as"关键字

    --在 INSERT 语句中加入子查询

    SQL>insert into emp10 
        select * from emp where deptno=10;
    

    注:
      (1)不必书写 VALUES 子句。
      (2)插入语句的子查询没有括号,没有"as"关键字
      (3)子查询中的值列表应与 INSERT 子句中的列名对应

    2.更新语句:update

    (1)UPDATE 语句语法:

    UPDATE  table
    SET  column = value [, column = value, ...]
    [WHERE   condition];
    

    注:
      (1)可以一次更新多列数据。
      (2)可以一次更新多条数据,看选中了多少行了。
      (3)update的子查询(set或者where等后面都可以接)有括号
      (4)强烈建议,更新数据时检查where条件

    --示例:

    UPDATE emp
    SET empjob = (SELECT empjob
                  FROM emp
                  WHERE empno = 7902),
        sal  = (SELECT sal
                FROM emp
                WHERE empno = 7369)
    WHERE empno=7839;
    

    --现在可以回滚,后面介绍oracle中的事务

    rollback;--DML语句不会自动提交
    

    3.删除数据:delete

    (1)删除单条数据

    --加上where,可以只删除指定删除的记录
    --如果省略WHERE子句,则表中的全部数据将被删除。
    delete from emp where empno=7839
    

    (2)清空表

    --delete属于DML语句,即使commit后也有方法可以撤销

    delete from emp10
    

    --truncate属于DDL语句,不可以撤销,这真的要“从删库到跑路了”

    truncate table emp10
    

    注:delete和truncate的区别
      1.delete是DML语句,truncate是DDL语句
      2.delete数据逐条删除,truncate先摧毁再重建,在oracle中delete好,而不是truncate.判读依据是:指执行时间,oracle对delete进行了优化
      3.delete会产生碎片,truncate不会
      4.delete不会释放空间,tuncate会
      5.delete没提交(commit)时,可以rollback,提交(commit)后,可以被闪回(flushback)(,truncate都不可以

    补:sqlplus命令
      --是否显示:已选择xx行

         set feedback off
         set feedback on
    

    4.oracle中事务

    事务是由完成若干项工作的DML语句组成的,oracle中事务:
    (1)事务的起始标志:DML语句。意味着自动开启事
    (2)事务的结束标志:
      提交:显式提交 commit
         隐式提交 执行DDL语句/正常退出(输入exit)
      回滚:显式回滚 rollback
         隐式回滚 掉电/宕机/非正常退出(点叉号)

    控制事务 控制事务示意图(DML语句会自动开启事务)

    --举个例子

    --存储点savepoint:方便控制事务
    SQL>create table testsavepoint(
        tid number,
        tname varchar2(20)
    );
    SQL>insert into testsavepoint values(1, 'Tom');
    SQL>insert into testsavepoint values(2, 'Mary');
    SQL>savepoint a;
    SQL>insert into testsavepoint values(3, 'Moke');
    SQL>rollback to savepoint a;
    SQL>commit;
    

    --查询下效果:

    SQL> select * from testsavepoint;
    
    -->结果: 没有全部回滚完,只回滚到我们设置的savepoint处

    5.补充:oracle中的隔离级别

    (1)对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:
      --脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
      --不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
      --幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.
    (2)数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.
    (3)一个事务与其他事务隔离的程度称为隔离级别. 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱

    --sql99标准
      (1)数据库提供的 4 种事务隔离级别:

    sql99标准的 4 种事务隔离级别   (2)Oracle 支持的 2 种事务隔离级别:READ COMMITED(默认), SERIALIZABLE. Oracle 默认的事务隔离级别为: READ COMMITED
      【oracle自己实现了一个——read only(不是sql99标准)。所以oracle支持3种隔离级别】
      (3)Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ

    相关文章

      网友评论

          本文标题:oracle学习笔记九——插入更新和删除(DML语句)

          本文链接:https://www.haomeiwen.com/subject/wqlfiftx.html