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

九、插入更新和删除

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);

-->结果:
oracle学习笔记九——插入更新和删除(DML语句)_第1张图片
地址符 &:相当于为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
     隐式回滚 掉电/宕机/非正常退出(点叉号)

控制事务
oracle学习笔记九——插入更新和删除(DML语句)_第2张图片
控制事务示意图(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 种事务隔离级别:

oracle学习笔记九——插入更新和删除(DML语句)_第3张图片
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语句))