九、插入更新和删除
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);
-->结果:
注:关于地址符
(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
隐式回滚 掉电/宕机/非正常退出(点叉号)
--举个例子
--存储点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;
-->结果:
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自己实现了一个——read only(不是sql99标准)。所以oracle支持3种隔离级别】
(3)Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ