Oracle数据库学习教程
集合运算&数据处理
集合运算
问题:查询部门号10和20的员工的信息:
select * from emp where deptno in(10,20);
select * from emp where deptno = 10 or deptno = 20;
- 集合运算
集合运算的对象是两个集合
常用的有: \(A \bigcap B\),\(A \bigcup B\),\(A-B\)等
- 并集:union/union all
- 交集:intersect
- 差集:minus
上面的问题改写为集合运算版本:
select * from emp where deptno = 10
union
select * from emp where deptno = 20;
注意事项:
- 参与运算的各个集合必须列数相同,类型一致
- 表头采用第一个集合的
- 会先执行带()的语句
数据处理
0. SQL语言类型
- DML语句(数据操作语言): insert,update,delete,select
- DDL语句(数据定义语言): create table,create view(视图),create index(索引),create sequence(序列)
- DCL语句(数据控制语言):grant(赋权),revoke(回收权限)
1. 插入数据insert
insert into table[列1..] values (值1...);
如:
insert into emp values (1001,'TOM','Engineer',7839, sysdate,5000,200,10);
insert into emp(empno, ename, sal, deptno) values(1002, 'Marry', 6000, 20);
1. &地址符:SQL> insert into emp(empno, ename, sal, deptno) values(&empno, &ename, &sal, &deptno);
加上&符号,下次输入/号就可以继续赋值了,&后面的可以任意写,一般和前面相同
2. 批处理:
先创一张相同结构的表,不要有数据(where 假):create table emp10 as select * from emp where 1=2;
然后插入一批数据:insert into emp10 select * from emp where deptno=10 ;
2. 更新数据
更新操作一般会使用where来改一部分数据
update emp10 set sal=4000, comm=300 where ename = 'CLARK'; ( 或 where empno=7782; )
删除数据delete
delete from emp10 where empno=7782;(或ename= 'KING');
注意:“from”关键字在Oracle中可以省略不写,但MySQL中不可以。
delete和truncate的区别:
- delete是删除一条数据,而truncate是先摧毁表再重建.
- delete性能更优.
- delete不会释放空间,truncate会释放空间
- delete可以回滚,truncate不能回滚.
- delete会产生碎片,truncate不会.
事务
数据库事务,是由有限的数据库操作序列组成的逻辑执行单元,这一系列操作要么全部执行,要么全部放弃执行。
要么都成功,要么都失败.
比如银行转帐,A转1000给B:1.A-1000,2.B+1000.这两步要捆绑一起.
成功了就commit提交,失败了就rollback回滚
事务的特性:
事务4大特性(ACID) :原子性、一致性、隔离性、持久性。
事务的起始标志:Oracle中自动开启事务,以DML语句为开启标志。
执行一个增删改查语句,只要没有提交commit和回滚rollback,操作都在一个事务中。
事务的结束标志:提交、回滚都是事务的结束标志。
提交:
- 显示提交:commit
- 隐式提交:
- 有DDL语句,如:create table除了创建表之外还会隐式提交Create之前所有没有提交的DML语句。
- 正常退出(exit / quit)
回滚:
- 显示回滚:rollback
- 隐式回滚:掉电、宕机、非正常退出。
还可以增加保存点(savepoint),相当于存档.可以使用rollback回滚到指定的保存点.
隔离级别:
对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:
- 脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
- 不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
- 幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.
Oracle支持的隔离级别: Read Commited(默认)和 Serializable,以及Oracle自定义的Read Only三种。
Read Only:由于大多数情况下,在事务操作的过程中,不希望别人也来操作,但是如果将别人的隔离级别设置为Serializable(串行),但是单线程会导致数据库的性能太差。是应该允许别人来进行read操作的。
mysql支持以上四种, Oracle默认读已提交数据,mysql默认可重复读。